diff options
-rw-r--r-- | src/qml/compiler/qv4bytecodegenerator_p.h | 1 | ||||
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 125 | ||||
-rw-r--r-- | src/qml/compiler/qv4codegen_p.h | 12 | ||||
-rw-r--r-- | src/qml/compiler/qv4compilercontext.cpp | 15 | ||||
-rw-r--r-- | src/qml/compiler/qv4compilercontrolflow_p.h | 14 | ||||
-rw-r--r-- | src/qml/compiler/qv4compilerscanfunctions.cpp | 7 | ||||
-rw-r--r-- | src/qml/compiler/qv4compilerscanfunctions_p.h | 2 | ||||
-rw-r--r-- | src/qml/parser/qqmljs.g | 35 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 4 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 204 |
10 files changed, 131 insertions, 288 deletions
diff --git a/src/qml/compiler/qv4bytecodegenerator_p.h b/src/qml/compiler/qv4bytecodegenerator_p.h index 286ceed57d..0033acf3c7 100644 --- a/src/qml/compiler/qv4bytecodegenerator_p.h +++ b/src/qml/compiler/qv4bytecodegenerator_p.h @@ -241,6 +241,7 @@ public: int newRegister(); int newRegisterArray(int n); int registerCount() const { return regCount; } + int currentRegister() const { return currentReg; } void finalize(Compiler::Context *context); diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index 31c0764570..a3a7f24bdf 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -141,6 +141,12 @@ int Codegen::leaveContext() return functionIndex; } +Context *Codegen::enterBlock(Node *node) +{ + enterContext(node); + return _context; +} + Codegen::Reference Codegen::unop(UnaryOperation op, const Reference &expr) { if (hasError) @@ -388,7 +394,7 @@ void Codegen::variableDeclarationList(VariableDeclarationList *ast) } } -void Codegen::initializeAndDestructureBindingElement(AST::PatternElement *e, const Codegen::Reference &baseRef) +void Codegen::initializeAndDestructureBindingElement(AST::PatternElement *e, const Reference &baseRef) { RegisterScope scope(this); Reference varToStore = e->bindingIdentifier.isNull() ? Reference::fromStackSlot(this, bytecodeGenerator->newRegister()) : referenceForName(e->bindingIdentifier, true); @@ -494,6 +500,17 @@ void Codegen::destructureElementList(const Codegen::Reference &array, PatternEle } } +void Codegen::destructurePattern(Pattern *p, const Reference &rhs) +{ + RegisterScope scope(this); + if (auto *o = AST::cast<ObjectPattern *>(p)) + destructurePropertyList(rhs, o->properties); + else if (auto *a = AST::cast<ArrayPattern *>(p)) + destructureElementList(rhs, a->elements); + else + Q_UNREACHABLE(); +} + bool Codegen::visit(ArgumentList *) { @@ -837,12 +854,7 @@ bool Codegen::visit(BinaryExpression *ast) if (AST::Pattern *p = ast->left->patternCast()) { RegisterScope scope(this); Reference right = expression(ast->right).storeOnStack(); - if (auto *o = AST::cast<ObjectPattern *>(p)) - destructurePropertyList(right, o->properties); - else if (auto *a = AST::cast<ArrayPattern *>(p)) - destructureElementList(right, a->elements); - else - Q_UNREACHABLE(); + destructurePattern(p, right); if (!_expr.accept(nx)) { right.loadInAccumulator(); _expr.setResult(Reference::fromAccumulator(this)); @@ -2469,14 +2481,8 @@ bool Codegen::visit(Block *ast) RegisterScope scope(this); - enterContext(ast); - _module->blocks.append(_context); - _context->blockIndex = _module->blocks.count() - 1; - { - ControlFlowBlock controlFlow(this, _context); - statementList(ast->statements); - } - leaveContext(); + ControlFlowBlock controlFlow(this, ast); + statementList(ast->statements); return false; } @@ -2600,44 +2606,24 @@ bool Codegen::visit(ForEachStatement *ast) RegisterScope scope(this); Reference iterator = Reference::fromStackSlot(this); - Reference expr = expression(ast->expression); - if (hasError) - return true; + Reference lhsValue = Reference::fromStackSlot(this); - expr.loadInAccumulator(); - Instruction::GetIterator iteratorObjInstr; - iteratorObjInstr.iterator = (ast->type == ForEachType::Of) ? 1 : 0; - bytecodeGenerator->addInstruction(iteratorObjInstr); - iterator.storeConsumeAccumulator(); - - Reference lhs; - if (ExpressionNode *e = ast->lhs->expressionCast()) { - lhs = expression(e); - } else if (PatternElement *p = AST::cast<PatternElement *>(ast->lhs)) { - variableDeclaration(p); - lhs = referenceForName(p->bindingIdentifier, true).asLValue(); - } else { - Q_UNREACHABLE(); - } + // There should be a temporal block, so that variables declared in lhs shadow outside vars. + // This block should define a temporal dead zone for those variables, which is not yet implemented. + { + RegisterScope innerScope(this); + ControlFlowBlock controlFlow(this, ast); + Reference expr = expression(ast->expression); + if (hasError) + return true; - if (hasError) - return false; - if (!lhs.isLValue()) { - throwSyntaxError(ast->forToken, QLatin1String("Destructuring not supported with for-in and for-of loops.")); - return false; + expr.loadInAccumulator(); + Instruction::GetIterator iteratorObjInstr; + iteratorObjInstr.iterator = (ast->type == ForEachType::Of) ? 1 : 0; + bytecodeGenerator->addInstruction(iteratorObjInstr); + iterator.storeConsumeAccumulator(); } - lhs = lhs.asLValue(); - - foreachBody(lhs, ast->statement, ast->forToken, iterator); - return false; -} - -void Codegen::foreachBody(const Reference &lhs, Statement *statements, const SourceLocation &forToken, const Reference &iterator) -{ - RegisterScope scope(this); - Reference nextIterObj = Reference::fromStackSlot(this); - BytecodeGenerator::Label in = bytecodeGenerator->newLabel(); BytecodeGenerator::Label end = bytecodeGenerator->newLabel(); @@ -2647,25 +2633,52 @@ void Codegen::foreachBody(const Reference &lhs, Statement *statements, const Sou BytecodeGenerator::Label body = bytecodeGenerator->label(); - Reference::fromMember(nextIterObj, QStringLiteral("value")).loadInAccumulator(); - lhs.storeConsumeAccumulator(); + // each iteration gets it's own context, as per spec + { + RegisterScope innerScope(this); + ControlFlowBlock controlFlow(this, ast); + + if (ExpressionNode *e = ast->lhs->expressionCast()) { + if (AST::Pattern *p = e->patternCast()) { + RegisterScope scope(this); + Reference right = Reference::fromMember(lhsValue, QStringLiteral("value")).storeOnStack(); + destructurePattern(p, right); + } else { + Reference lhs = expression(e); + if (hasError) + goto error; + lhs = lhs.asLValue(); + Reference::fromMember(lhsValue, QStringLiteral("value")).loadInAccumulator(); + lhs.storeConsumeAccumulator(); + } + } else if (PatternElement *p = AST::cast<PatternElement *>(ast->lhs)) { + Reference::fromMember(lhsValue, QStringLiteral("value")).loadInAccumulator(); + initializeAndDestructureBindingElement(p, Reference::fromAccumulator(this)); + if (hasError) + goto error; + } else { + Q_UNREACHABLE(); + } + + statement(ast->statement); + setJumpOutLocation(bytecodeGenerator, ast->statement, ast->forToken); - statement(statements); - setJumpOutLocation(bytecodeGenerator, statements, forToken); + } + error: in.link(); - Reference next = Reference::fromMember(iterator, QStringLiteral("next")); next.loadInAccumulator(); next = next.asLValue(); Codegen::Arguments args{0, 0}; handleCall(next, args); - nextIterObj.storeConsumeAccumulator(); - Reference done = Reference::fromMember(nextIterObj, QStringLiteral("done")); + lhsValue.storeConsumeAccumulator(); + Reference done = Reference::fromMember(lhsValue, QStringLiteral("done")); done.loadInAccumulator(); bytecodeGenerator->jumpFalse().link(body); end.link(); + return false; } bool Codegen::visit(ForStatement *ast) diff --git a/src/qml/compiler/qv4codegen_p.h b/src/qml/compiler/qv4codegen_p.h index 18ccf04dc8..49752270a0 100644 --- a/src/qml/compiler/qv4codegen_p.h +++ b/src/qml/compiler/qv4codegen_p.h @@ -466,7 +466,10 @@ protected: void enterContext(AST::Node *node); int leaveContext(); - +public: + Context *enterBlock(AST::Node *node); + int leaveBlock() { return leaveContext(); } +protected: void leaveLoop(); enum UnaryOperation { @@ -513,9 +516,10 @@ protected: void variableDeclaration(AST::PatternElement *ast); void variableDeclarationList(AST::VariableDeclarationList *ast); - void initializeAndDestructureBindingElement(AST::PatternElement *e, const Reference &baseRef); + void initializeAndDestructureBindingElement(AST::PatternElement *e, const Reference &baseRef = Reference()); void destructurePropertyList(const Reference &object, AST::PatternPropertyList *bindingList); void destructureElementList(const Reference &array, AST::PatternElementList *bindingList); + void destructurePattern(AST::Pattern *p, const Reference &rhs); // Hook provided to implement QML lookup semantics virtual Reference fallbackNameLookup(const QString &name); @@ -644,8 +648,6 @@ public: void handleTryCatch(AST::TryStatement *ast); void handleTryFinally(AST::TryStatement *ast); - void foreachBody(const Reference &lhs, AST::Statement *body, const AST::SourceLocation &forToken, const Reference &nextIterObj); - Reference referenceForName(const QString &name, bool lhs); @@ -657,6 +659,8 @@ public: void loadClosure(int index); + Module *module() const { return _module; } + protected: friend class ScanFunctions; friend struct ControlFlow; diff --git a/src/qml/compiler/qv4compilercontext.cpp b/src/qml/compiler/qv4compilercontext.cpp index 07e19811a8..bfe0d4b131 100644 --- a/src/qml/compiler/qv4compilercontext.cpp +++ b/src/qml/compiler/qv4compilercontext.cpp @@ -167,6 +167,11 @@ int Context::emitBlockHeader(Codegen *codegen) setupFunctionIndices(bytecodeGenerator); int contextReg = -1; + if (requiresExecutionContext && blockIndex < 0) { + codegen->module()->blocks.append(this); + blockIndex = codegen->module()->blocks.count() - 1; + } + if (requiresExecutionContext && contextType == ContextType::Global) { Instruction::PushScriptContext scriptContext; scriptContext.index = blockIndex; @@ -268,9 +273,15 @@ QT_WARNING_POP void Context::setupFunctionIndices(Moth::BytecodeGenerator *bytecodeGenerator) { + if (registerOffset != -1) { + // already computed, check for consistency + Q_ASSERT(registerOffset == bytecodeGenerator->currentRegister()); + bytecodeGenerator->newRegisterArray(nRegisters); + return; + } Q_ASSERT(locals.size() == 0); Q_ASSERT(nRegisters == 0); - registerOffset = bytecodeGenerator->registerCount(); + registerOffset = bytecodeGenerator->currentRegister(); switch (contextType) { case ContextType::Block: @@ -304,7 +315,7 @@ void Context::setupFunctionIndices(Moth::BytecodeGenerator *bytecodeGenerator) } break; } - nRegisters = bytecodeGenerator->registerCount() - registerOffset; + nRegisters = bytecodeGenerator->currentRegister() - registerOffset; } QT_END_NAMESPACE diff --git a/src/qml/compiler/qv4compilercontrolflow_p.h b/src/qml/compiler/qv4compilercontrolflow_p.h index db83af0022..89791330f9 100644 --- a/src/qml/compiler/qv4compilercontrolflow_p.h +++ b/src/qml/compiler/qv4compilercontrolflow_p.h @@ -331,10 +331,10 @@ struct ControlFlowWith : public ControlFlowUnwind struct ControlFlowBlock : public ControlFlowUnwind { - ControlFlowBlock(Codegen *cg, Context *block) - : ControlFlowUnwind(cg, Block), - block(block) + ControlFlowBlock(Codegen *cg, AST::Node *ast) + : ControlFlowUnwind(cg, Block) { + block = cg->enterBlock(ast); savedContextRegister = block->emitBlockHeader(cg); if (savedContextRegister != -1) { @@ -354,6 +354,7 @@ struct ControlFlowBlock : public ControlFlowUnwind if (savedContextRegister != -1) emitUnwindHandler(); + cg->leaveBlock(); } virtual Handler getHandler(HandlerType type, const QString &label = QString()) { if (savedContextRegister == -1) @@ -411,10 +412,7 @@ struct ControlFlowCatch : public ControlFlowUnwind // exceptions inside the try block go here exceptionLabel.link(); - cg->enterContext(catchExpression); - Context *block = cg->currentContext(); - cg->_module->blocks.append(block); - block->blockIndex = cg->_module->blocks.count() - 1; + Context *block = cg->enterBlock(catchExpression); int savedContextReg = block->emitBlockHeader(cg); @@ -434,7 +432,7 @@ struct ControlFlowCatch : public ControlFlowUnwind catchUnwindLabel.link(); block->emitBlockFooter(cg, savedContextReg); - cg->leaveContext(); + cg->leaveBlock(); // break/continue/return statements in try go here unwindLabel.link(); diff --git a/src/qml/compiler/qv4compilerscanfunctions.cpp b/src/qml/compiler/qv4compilerscanfunctions.cpp index eadbc3ae17..ccf7e49e25 100644 --- a/src/qml/compiler/qv4compilerscanfunctions.cpp +++ b/src/qml/compiler/qv4compilerscanfunctions.cpp @@ -342,6 +342,8 @@ bool ScanFunctions::visit(LocalForStatement *ast) { } bool ScanFunctions::visit(ForEachStatement *ast) { + enterEnvironment(ast, ContextType::Block); + _context->name = QLatin1String("Foreach"); Node::accept(ast->lhs, this); Node::accept(ast->expression, this); @@ -351,6 +353,11 @@ bool ScanFunctions::visit(ForEachStatement *ast) { return false; } +void ScanFunctions::endVisit(ForEachStatement *) +{ + leaveEnvironment(); +} + bool ScanFunctions::visit(ThisExpression *) { _context->usesThis = true; diff --git a/src/qml/compiler/qv4compilerscanfunctions_p.h b/src/qml/compiler/qv4compilerscanfunctions_p.h index 7d29af4fa3..640ee86c0b 100644 --- a/src/qml/compiler/qv4compilerscanfunctions_p.h +++ b/src/qml/compiler/qv4compilerscanfunctions_p.h @@ -127,6 +127,8 @@ protected: bool visit(AST::ForStatement *ast) override; bool visit(AST::LocalForStatement *ast) override; bool visit(AST::ForEachStatement *ast) override; + void endVisit(AST::ForEachStatement *) override; + bool visit(AST::ThisExpression *ast) override; bool visit(AST::Block *ast) override; diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g index 5efc392efa..4b1dc437f4 100644 --- a/src/qml/parser/qqmljs.g +++ b/src/qml/parser/qqmljs.g @@ -3144,14 +3144,14 @@ IterationStatement: T_FOR T_LPAREN LeftHandSideExpression InOrOf Expression_In T /. case $rule_number: { // need to convert the LHS to an AssignmentPattern if it was an Array/ObjectLiteral -// if (AST::Pattern *p = sym(3).Expression->patternCast()) { -// AST::SourceLocation errorLoc; -// QString errorMsg; -// if (!p->convertLiteralToAssignmentPattern(pool, &errorLoc, &errorMsg)) { -// syntaxError(errorLoc, errorMsg); -// return false; -// } -// } + if (AST::Pattern *p = sym(3).Expression->patternCast()) { + AST::SourceLocation errorLoc; + QString errorMsg; + if (!p->convertLiteralToAssignmentPattern(pool, &errorLoc, &errorMsg)) { + syntaxError(errorLoc, errorMsg); + return false; + } + } AST::ForEachStatement *node = new (pool) AST::ForEachStatement(sym(3).Expression, sym(5).Expression, sym(7).Statement); node->forToken = loc(1); node->lparenToken = loc(2); @@ -3175,9 +3175,9 @@ IterationStatement: T_FOR T_LPAREN ForDeclaration InOrOf Expression_In T_RPAREN } break; ./ -ForDeclaration: LetOrConst ForBinding; +ForDeclaration: LetOrConst BindingIdentifier; /. case $rule_number: Q_FALLTHROUGH(); ./ -ForDeclaration: Var ForBinding; +ForDeclaration: Var BindingIdentifier; /. case $rule_number: { auto *node = new (pool) AST::PatternElement(stringRef(2), nullptr); @@ -3187,10 +3187,17 @@ ForDeclaration: Var ForBinding; } break; ./ -ForBinding: BindingIdentifier; - -ForBinding: BindingPattern; -/. case $rule_number: UNIMPLEMENTED; ./ +ForDeclaration: LetOrConst BindingPattern; +/. case $rule_number: Q_FALLTHROUGH(); ./ +ForDeclaration: Var BindingPattern; +/. + case $rule_number: { + auto *node = new (pool) AST::PatternElement(sym(2).Pattern, nullptr); + node->identifierToken = loc(2); + node->scope = sym(1).scope; + sym(1).Node = node; + } break; +./ ContinueStatement: T_CONTINUE T_AUTOMATIC_SEMICOLON; ContinueStatement: T_CONTINUE T_SEMICOLON; diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h index 83fcb6559c..9ed7ba79e5 100644 --- a/src/qml/parser/qqmljsast_p.h +++ b/src/qml/parser/qqmljsast_p.h @@ -1725,6 +1725,10 @@ public: SourceLocation lastSourceLocation() const override { return statement->lastSourceLocation(); } + PatternElement *declaration() const { + return AST::cast<PatternElement *>(lhs); + } + // attributes Node *lhs; ExpressionNode *expression; diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations index fd1e92f4da..dfa5d38ed8 100644 --- a/tests/auto/qml/ecmascripttests/TestExpectations +++ b/tests/auto/qml/ecmascripttests/TestExpectations @@ -3129,7 +3129,6 @@ language/arguments-object/mapped/nonconfigurable-nonenumerable-nonwritable-descr language/arguments-object/mapped/nonconfigurable-nonwritable-descriptors-set-by-arguments.js sloppyFails language/arguments-object/mapped/nonconfigurable-nonwritable-descriptors-set-by-param.js sloppyFails language/arguments-object/mapped/nonwritable-nonconfigurable-descriptors-set-by-arguments.js sloppyFails -language/block-scope/syntax/for-in/mixed-values-in-iteration.js fails language/computed-property-names/basics/string.js fails language/computed-property-names/basics/symbol.js fails language/computed-property-names/class/accessor/getter-duplicates.js fails @@ -5976,22 +5975,14 @@ language/statements/empty/cptn-value.js fails language/statements/for-in/head-const-bound-names-fordecl-tdz.js fails language/statements/for-in/head-const-fresh-binding-per-iteration.js fails language/statements/for-in/head-let-bound-names-fordecl-tdz.js fails -language/statements/for-in/head-let-destructuring.js fails -language/statements/for-in/head-let-fresh-binding-per-iteration.js fails language/statements/for-in/head-lhs-let.js sloppyFails -language/statements/for-in/head-var-bound-names-dup.js fails language/statements/for-in/head-var-bound-names-let.js sloppyFails language/statements/for-in/identifier-let-allowed-as-lefthandside-expression-not-strict.js sloppyFails language/statements/for-in/let-identifier-with-newline.js sloppyFails -language/statements/for-in/scope-body-lex-boundary.js fails -language/statements/for-in/scope-body-lex-close.js fails language/statements/for-in/scope-body-lex-open.js fails -language/statements/for-in/scope-body-var-none.js fails language/statements/for-in/scope-head-lex-close.js fails language/statements/for-in/scope-head-lex-open.js fails -language/statements/for-in/scope-head-var-none.js sloppyFails language/statements/for-of/body-dstr-assign-error.js fails -language/statements/for-of/body-dstr-assign.js fails language/statements/for-of/body-put-error.js fails language/statements/for-of/break-from-catch.js fails language/statements/for-of/break-from-finally.js fails @@ -6009,19 +6000,8 @@ language/statements/for-of/continue-label-from-finally.js fails language/statements/for-of/continue-label-from-try.js fails language/statements/for-of/continue-label.js fails language/statements/for-of/continue.js fails -language/statements/for-of/dstr-array-elem-init-assignment.js fails -language/statements/for-of/dstr-array-elem-init-evaluation.js fails -language/statements/for-of/dstr-array-elem-init-fn-name-arrow.js fails language/statements/for-of/dstr-array-elem-init-fn-name-class.js fails -language/statements/for-of/dstr-array-elem-init-fn-name-cover.js fails -language/statements/for-of/dstr-array-elem-init-fn-name-fn.js fails -language/statements/for-of/dstr-array-elem-init-fn-name-gen.js fails -language/statements/for-of/dstr-array-elem-init-in.js fails language/statements/for-of/dstr-array-elem-init-let.js fails -language/statements/for-of/dstr-array-elem-init-order.js fails -language/statements/for-of/dstr-array-elem-init-simple-no-strict.js sloppyFails -language/statements/for-of/dstr-array-elem-init-yield-expr.js fails -language/statements/for-of/dstr-array-elem-init-yield-ident-valid.js sloppyFails language/statements/for-of/dstr-array-elem-iter-get-err.js fails language/statements/for-of/dstr-array-elem-iter-nrml-close-err.js fails language/statements/for-of/dstr-array-elem-iter-nrml-close-null.js fails @@ -6033,29 +6013,15 @@ language/statements/for-of/dstr-array-elem-iter-rtrn-close.js fails language/statements/for-of/dstr-array-elem-iter-thrw-close-err.js fails language/statements/for-of/dstr-array-elem-iter-thrw-close-skip.js fails language/statements/for-of/dstr-array-elem-iter-thrw-close.js fails -language/statements/for-of/dstr-array-elem-nested-array-null.js fails -language/statements/for-of/dstr-array-elem-nested-array-undefined-hole.js fails -language/statements/for-of/dstr-array-elem-nested-array-undefined-own.js fails -language/statements/for-of/dstr-array-elem-nested-array-undefined.js fails language/statements/for-of/dstr-array-elem-nested-array-yield-expr.js fails language/statements/for-of/dstr-array-elem-nested-array-yield-ident-valid.js sloppyFails -language/statements/for-of/dstr-array-elem-nested-array.js fails -language/statements/for-of/dstr-array-elem-nested-obj-null.js fails -language/statements/for-of/dstr-array-elem-nested-obj-undefined-hole.js fails -language/statements/for-of/dstr-array-elem-nested-obj-undefined-own.js fails -language/statements/for-of/dstr-array-elem-nested-obj-undefined.js fails language/statements/for-of/dstr-array-elem-nested-obj-yield-expr.js fails language/statements/for-of/dstr-array-elem-nested-obj-yield-ident-valid.js sloppyFails -language/statements/for-of/dstr-array-elem-nested-obj.js fails language/statements/for-of/dstr-array-elem-put-const.js fails language/statements/for-of/dstr-array-elem-put-let.js fails language/statements/for-of/dstr-array-elem-put-prop-ref-no-get.js fails language/statements/for-of/dstr-array-elem-put-prop-ref-user-err.js fails language/statements/for-of/dstr-array-elem-put-prop-ref.js fails -language/statements/for-of/dstr-array-elem-put-unresolvable-no-strict.js sloppyFails -language/statements/for-of/dstr-array-elem-put-unresolvable-strict.js strictFails -language/statements/for-of/dstr-array-elem-target-identifier.js fails -language/statements/for-of/dstr-array-elem-target-simple-no-strict.js sloppyFails language/statements/for-of/dstr-array-elem-target-yield-expr.js fails language/statements/for-of/dstr-array-elem-target-yield-valid.js sloppyFails language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-abpt.js fails @@ -6087,22 +6053,18 @@ language/statements/for-of/dstr-array-elision-iter-nrml-close-err.js fails language/statements/for-of/dstr-array-elision-iter-nrml-close-null.js fails language/statements/for-of/dstr-array-elision-iter-nrml-close-skip.js fails language/statements/for-of/dstr-array-elision-iter-nrml-close.js fails -language/statements/for-of/dstr-array-elision-val-array.js fails language/statements/for-of/dstr-array-elision-val-bool.js fails language/statements/for-of/dstr-array-elision-val-null.js fails language/statements/for-of/dstr-array-elision-val-num.js fails -language/statements/for-of/dstr-array-elision-val-string.js fails language/statements/for-of/dstr-array-elision-val-symbol.js fails language/statements/for-of/dstr-array-elision-val-undef.js fails language/statements/for-of/dstr-array-empty-iter-close-err.js fails language/statements/for-of/dstr-array-empty-iter-close-null.js fails language/statements/for-of/dstr-array-empty-iter-close.js fails language/statements/for-of/dstr-array-empty-iter-get-err.js fails -language/statements/for-of/dstr-array-empty-val-array.js fails language/statements/for-of/dstr-array-empty-val-bool.js fails language/statements/for-of/dstr-array-empty-val-null.js fails language/statements/for-of/dstr-array-empty-val-num.js fails -language/statements/for-of/dstr-array-empty-val-string.js fails language/statements/for-of/dstr-array-empty-val-symbol.js fails language/statements/for-of/dstr-array-empty-val-undef.js fails language/statements/for-of/dstr-array-iteration.js fails @@ -6153,9 +6115,6 @@ language/statements/for-of/dstr-const-ary-name-iter-val.js fails language/statements/for-of/dstr-const-ary-ptrn-elem-ary-elem-init.js fails language/statements/for-of/dstr-const-ary-ptrn-elem-ary-elem-iter.js fails language/statements/for-of/dstr-const-ary-ptrn-elem-ary-elision-init.js fails -language/statements/for-of/dstr-const-ary-ptrn-elem-ary-elision-iter.js fails -language/statements/for-of/dstr-const-ary-ptrn-elem-ary-empty-init.js fails -language/statements/for-of/dstr-const-ary-ptrn-elem-ary-empty-iter.js fails language/statements/for-of/dstr-const-ary-ptrn-elem-ary-rest-init.js fails language/statements/for-of/dstr-const-ary-ptrn-elem-ary-rest-iter.js fails language/statements/for-of/dstr-const-ary-ptrn-elem-ary-val-null.js fails @@ -6181,11 +6140,9 @@ language/statements/for-of/dstr-const-ary-ptrn-elem-obj-prop-id-init.js fails language/statements/for-of/dstr-const-ary-ptrn-elem-obj-prop-id.js fails language/statements/for-of/dstr-const-ary-ptrn-elem-obj-val-null.js fails language/statements/for-of/dstr-const-ary-ptrn-elem-obj-val-undef.js fails -language/statements/for-of/dstr-const-ary-ptrn-elision-exhausted.js fails language/statements/for-of/dstr-const-ary-ptrn-elision-iter-close.js fails language/statements/for-of/dstr-const-ary-ptrn-elision-step-err.js fails language/statements/for-of/dstr-const-ary-ptrn-elision.js fails -language/statements/for-of/dstr-const-ary-ptrn-empty.js fails language/statements/for-of/dstr-const-ary-ptrn-rest-ary-elem.js fails language/statements/for-of/dstr-const-ary-ptrn-rest-ary-elision.js fails language/statements/for-of/dstr-const-ary-ptrn-rest-ary-empty.js fails @@ -6199,9 +6156,6 @@ language/statements/for-of/dstr-const-ary-ptrn-rest-id-iter-val-err.js fails language/statements/for-of/dstr-const-ary-ptrn-rest-id.js fails language/statements/for-of/dstr-const-ary-ptrn-rest-obj-id.js fails language/statements/for-of/dstr-const-ary-ptrn-rest-obj-prop-id.js fails -language/statements/for-of/dstr-const-obj-init-null.js fails -language/statements/for-of/dstr-const-obj-init-undefined.js fails -language/statements/for-of/dstr-const-obj-ptrn-empty.js fails language/statements/for-of/dstr-const-obj-ptrn-id-get-value-err.js fails language/statements/for-of/dstr-const-obj-ptrn-id-init-fn-name-arrow.js fails language/statements/for-of/dstr-const-obj-ptrn-id-init-fn-name-class.js fails @@ -6230,45 +6184,17 @@ language/statements/for-of/dstr-const-obj-ptrn-prop-obj-value-null.js fails language/statements/for-of/dstr-const-obj-ptrn-prop-obj-value-undef.js fails language/statements/for-of/dstr-const-obj-ptrn-prop-obj.js fails language/statements/for-of/dstr-let-ary-init-iter-close.js fails -language/statements/for-of/dstr-let-ary-init-iter-get-err.js fails -language/statements/for-of/dstr-let-ary-init-iter-no-close.js fails -language/statements/for-of/dstr-let-ary-name-iter-val.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-ary-elem-init.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-ary-elem-iter.js fails language/statements/for-of/dstr-let-ary-ptrn-elem-ary-elision-init.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-ary-elision-iter.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-ary-empty-init.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-ary-empty-iter.js fails language/statements/for-of/dstr-let-ary-ptrn-elem-ary-rest-init.js fails language/statements/for-of/dstr-let-ary-ptrn-elem-ary-rest-iter.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-ary-val-null.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-exhausted.js fails language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-fn-name-arrow.js fails language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-fn-name-class.js fails language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-fn-name-cover.js fails language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-fn-name-fn.js fails language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-fn-name-gen.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-hole.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-skipped.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-throws.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-undef.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-init-unresolvable.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-iter-complete.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-iter-done.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-iter-step-err.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-iter-val-err.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-id-iter-val.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-obj-id-init.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-obj-id.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-obj-prop-id-init.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-obj-prop-id.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-obj-val-null.js fails -language/statements/for-of/dstr-let-ary-ptrn-elem-obj-val-undef.js fails -language/statements/for-of/dstr-let-ary-ptrn-elision-exhausted.js fails language/statements/for-of/dstr-let-ary-ptrn-elision-iter-close.js fails language/statements/for-of/dstr-let-ary-ptrn-elision-step-err.js fails language/statements/for-of/dstr-let-ary-ptrn-elision.js fails -language/statements/for-of/dstr-let-ary-ptrn-empty.js fails language/statements/for-of/dstr-let-ary-ptrn-rest-ary-elem.js fails language/statements/for-of/dstr-let-ary-ptrn-rest-ary-elision.js fails language/statements/for-of/dstr-let-ary-ptrn-rest-ary-empty.js fails @@ -6282,49 +6208,13 @@ language/statements/for-of/dstr-let-ary-ptrn-rest-id-iter-val-err.js fails language/statements/for-of/dstr-let-ary-ptrn-rest-id.js fails language/statements/for-of/dstr-let-ary-ptrn-rest-obj-id.js fails language/statements/for-of/dstr-let-ary-ptrn-rest-obj-prop-id.js fails -language/statements/for-of/dstr-let-obj-init-null.js fails -language/statements/for-of/dstr-let-obj-init-undefined.js fails -language/statements/for-of/dstr-let-obj-ptrn-empty.js fails -language/statements/for-of/dstr-let-obj-ptrn-id-get-value-err.js fails language/statements/for-of/dstr-let-obj-ptrn-id-init-fn-name-arrow.js fails language/statements/for-of/dstr-let-obj-ptrn-id-init-fn-name-class.js fails language/statements/for-of/dstr-let-obj-ptrn-id-init-fn-name-cover.js fails language/statements/for-of/dstr-let-obj-ptrn-id-init-fn-name-fn.js fails language/statements/for-of/dstr-let-obj-ptrn-id-init-fn-name-gen.js fails -language/statements/for-of/dstr-let-obj-ptrn-id-init-skipped.js fails -language/statements/for-of/dstr-let-obj-ptrn-id-init-throws.js fails -language/statements/for-of/dstr-let-obj-ptrn-id-init-unresolvable.js fails -language/statements/for-of/dstr-let-obj-ptrn-id-trailing-comma.js fails -language/statements/for-of/dstr-let-obj-ptrn-list-err.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-ary-init.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-ary-trailing-comma.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-ary-value-null.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-ary.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-eval-err.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-id-get-value-err.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-id-init-skipped.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-id-init-throws.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-id-init-unresolvable.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-id-init.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-id-trailing-comma.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-id.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-obj-init.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-obj-value-null.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-obj-value-undef.js fails -language/statements/for-of/dstr-let-obj-ptrn-prop-obj.js fails -language/statements/for-of/dstr-obj-empty-bool.js fails language/statements/for-of/dstr-obj-empty-null.js fails -language/statements/for-of/dstr-obj-empty-num.js fails -language/statements/for-of/dstr-obj-empty-obj.js fails -language/statements/for-of/dstr-obj-empty-string.js fails -language/statements/for-of/dstr-obj-empty-symbol.js fails language/statements/for-of/dstr-obj-empty-undef.js fails -language/statements/for-of/dstr-obj-id-identifier-resolution-first.js fails -language/statements/for-of/dstr-obj-id-identifier-resolution-last.js fails -language/statements/for-of/dstr-obj-id-identifier-resolution-lone.js fails -language/statements/for-of/dstr-obj-id-identifier-resolution-middle.js fails -language/statements/for-of/dstr-obj-id-identifier-resolution-trlng.js fails -language/statements/for-of/dstr-obj-id-identifier-yield-ident-valid.js sloppyFails language/statements/for-of/dstr-obj-id-init-assignment-missing.js fails language/statements/for-of/dstr-obj-id-init-assignment-null.js fails language/statements/for-of/dstr-obj-id-init-assignment-truthy.js fails @@ -6343,91 +6233,29 @@ language/statements/for-of/dstr-obj-id-init-yield-expr.js fails language/statements/for-of/dstr-obj-id-init-yield-ident-valid.js sloppyFails language/statements/for-of/dstr-obj-id-put-const.js fails language/statements/for-of/dstr-obj-id-put-let.js fails -language/statements/for-of/dstr-obj-id-put-unresolvable-no-strict.js sloppyFails -language/statements/for-of/dstr-obj-id-put-unresolvable-strict.js strictFails -language/statements/for-of/dstr-obj-id-simple-no-strict.js sloppyFails -language/statements/for-of/dstr-obj-prop-elem-init-assignment-missing.js fails -language/statements/for-of/dstr-obj-prop-elem-init-assignment-null.js fails -language/statements/for-of/dstr-obj-prop-elem-init-assignment-truthy.js fails -language/statements/for-of/dstr-obj-prop-elem-init-assignment-undef.js fails -language/statements/for-of/dstr-obj-prop-elem-init-evaluation.js fails -language/statements/for-of/dstr-obj-prop-elem-init-fn-name-arrow.js fails language/statements/for-of/dstr-obj-prop-elem-init-fn-name-class.js fails -language/statements/for-of/dstr-obj-prop-elem-init-fn-name-cover.js fails -language/statements/for-of/dstr-obj-prop-elem-init-fn-name-fn.js fails -language/statements/for-of/dstr-obj-prop-elem-init-fn-name-gen.js fails -language/statements/for-of/dstr-obj-prop-elem-init-in.js fails language/statements/for-of/dstr-obj-prop-elem-init-let.js fails -language/statements/for-of/dstr-obj-prop-elem-init-yield-expr.js fails -language/statements/for-of/dstr-obj-prop-elem-init-yield-ident-valid.js sloppyFails language/statements/for-of/dstr-obj-prop-elem-target-yield-expr.js fails language/statements/for-of/dstr-obj-prop-elem-target-yield-ident-valid.js sloppyFails -language/statements/for-of/dstr-obj-prop-identifier-resolution-first.js fails -language/statements/for-of/dstr-obj-prop-identifier-resolution-last.js fails -language/statements/for-of/dstr-obj-prop-identifier-resolution-lone.js fails -language/statements/for-of/dstr-obj-prop-identifier-resolution-middle.js fails -language/statements/for-of/dstr-obj-prop-identifier-resolution-trlng.js fails -language/statements/for-of/dstr-obj-prop-name-evaluation.js fails -language/statements/for-of/dstr-obj-prop-nested-array-null.js fails -language/statements/for-of/dstr-obj-prop-nested-array-undefined-own.js fails -language/statements/for-of/dstr-obj-prop-nested-array-undefined.js fails -language/statements/for-of/dstr-obj-prop-nested-array-yield-expr.js fails -language/statements/for-of/dstr-obj-prop-nested-array-yield-ident-valid.js sloppyFails -language/statements/for-of/dstr-obj-prop-nested-array.js fails -language/statements/for-of/dstr-obj-prop-nested-obj-null.js fails -language/statements/for-of/dstr-obj-prop-nested-obj-undefined-own.js fails -language/statements/for-of/dstr-obj-prop-nested-obj-undefined.js fails language/statements/for-of/dstr-obj-prop-nested-obj-yield-expr.js fails language/statements/for-of/dstr-obj-prop-nested-obj-yield-ident-valid.js sloppyFails -language/statements/for-of/dstr-obj-prop-nested-obj.js fails language/statements/for-of/dstr-obj-prop-put-const.js fails language/statements/for-of/dstr-obj-prop-put-let.js fails -language/statements/for-of/dstr-obj-prop-put-order.js fails language/statements/for-of/dstr-obj-prop-put-prop-ref-no-get.js fails language/statements/for-of/dstr-obj-prop-put-prop-ref-user-err.js fails language/statements/for-of/dstr-obj-prop-put-prop-ref.js fails -language/statements/for-of/dstr-obj-prop-put-unresolvable-no-strict.js sloppyFails -language/statements/for-of/dstr-obj-prop-put-unresolvable-strict.js strictFails language/statements/for-of/dstr-var-ary-init-iter-close.js fails -language/statements/for-of/dstr-var-ary-init-iter-get-err.js fails -language/statements/for-of/dstr-var-ary-init-iter-no-close.js fails -language/statements/for-of/dstr-var-ary-name-iter-val.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-ary-elem-init.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-ary-elem-iter.js fails language/statements/for-of/dstr-var-ary-ptrn-elem-ary-elision-init.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-ary-elision-iter.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-ary-empty-init.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-ary-empty-iter.js fails language/statements/for-of/dstr-var-ary-ptrn-elem-ary-rest-init.js fails language/statements/for-of/dstr-var-ary-ptrn-elem-ary-rest-iter.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-ary-val-null.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-exhausted.js fails language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-fn-name-arrow.js fails language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-fn-name-class.js fails language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-fn-name-cover.js fails language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-fn-name-fn.js fails language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-fn-name-gen.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-hole.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-skipped.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-throws.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-undef.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-init-unresolvable.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-iter-complete.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-iter-done.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-iter-step-err.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-iter-val-err.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-id-iter-val.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-obj-id-init.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-obj-id.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-obj-prop-id-init.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-obj-prop-id.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-obj-val-null.js fails -language/statements/for-of/dstr-var-ary-ptrn-elem-obj-val-undef.js fails -language/statements/for-of/dstr-var-ary-ptrn-elision-exhausted.js fails language/statements/for-of/dstr-var-ary-ptrn-elision-iter-close.js fails language/statements/for-of/dstr-var-ary-ptrn-elision-step-err.js fails language/statements/for-of/dstr-var-ary-ptrn-elision.js fails -language/statements/for-of/dstr-var-ary-ptrn-empty.js fails language/statements/for-of/dstr-var-ary-ptrn-rest-ary-elem.js fails language/statements/for-of/dstr-var-ary-ptrn-rest-ary-elision.js fails language/statements/for-of/dstr-var-ary-ptrn-rest-ary-empty.js fails @@ -6441,36 +6269,11 @@ language/statements/for-of/dstr-var-ary-ptrn-rest-id-iter-val-err.js fails language/statements/for-of/dstr-var-ary-ptrn-rest-id.js fails language/statements/for-of/dstr-var-ary-ptrn-rest-obj-id.js fails language/statements/for-of/dstr-var-ary-ptrn-rest-obj-prop-id.js fails -language/statements/for-of/dstr-var-obj-init-null.js fails -language/statements/for-of/dstr-var-obj-init-undefined.js fails -language/statements/for-of/dstr-var-obj-ptrn-empty.js fails -language/statements/for-of/dstr-var-obj-ptrn-id-get-value-err.js fails language/statements/for-of/dstr-var-obj-ptrn-id-init-fn-name-arrow.js fails language/statements/for-of/dstr-var-obj-ptrn-id-init-fn-name-class.js fails language/statements/for-of/dstr-var-obj-ptrn-id-init-fn-name-cover.js fails language/statements/for-of/dstr-var-obj-ptrn-id-init-fn-name-fn.js fails language/statements/for-of/dstr-var-obj-ptrn-id-init-fn-name-gen.js fails -language/statements/for-of/dstr-var-obj-ptrn-id-init-skipped.js fails -language/statements/for-of/dstr-var-obj-ptrn-id-init-throws.js fails -language/statements/for-of/dstr-var-obj-ptrn-id-init-unresolvable.js fails -language/statements/for-of/dstr-var-obj-ptrn-id-trailing-comma.js fails -language/statements/for-of/dstr-var-obj-ptrn-list-err.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-ary-init.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-ary-trailing-comma.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-ary-value-null.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-ary.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-eval-err.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-id-get-value-err.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-id-init-skipped.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-id-init-throws.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-id-init-unresolvable.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-id-init.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-id-trailing-comma.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-id.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-obj-init.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-obj-value-null.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-obj-value-undef.js fails -language/statements/for-of/dstr-var-obj-ptrn-prop-obj.js fails language/statements/for-of/generator-close-via-break.js fails language/statements/for-of/generator-close-via-continue.js fails language/statements/for-of/generator-close-via-return.js fails @@ -6480,9 +6283,6 @@ language/statements/for-of/generator.js fails language/statements/for-of/head-const-bound-names-fordecl-tdz.js fails language/statements/for-of/head-const-fresh-binding-per-iteration.js fails language/statements/for-of/head-let-bound-names-fordecl-tdz.js fails -language/statements/for-of/head-let-destructuring.js fails -language/statements/for-of/head-let-fresh-binding-per-iteration.js fails -language/statements/for-of/head-var-bound-names-dup.js fails language/statements/for-of/head-var-bound-names-let.js sloppyFails language/statements/for-of/iterator-as-proxy.js fails language/statements/for-of/iterator-close-non-object.js fails @@ -6503,13 +6303,9 @@ language/statements/for-of/return-from-catch.js fails language/statements/for-of/return-from-finally.js fails language/statements/for-of/return-from-try.js fails language/statements/for-of/return.js fails -language/statements/for-of/scope-body-lex-boundary.js fails -language/statements/for-of/scope-body-lex-close.js fails language/statements/for-of/scope-body-lex-open.js fails -language/statements/for-of/scope-body-var-none.js fails language/statements/for-of/scope-head-lex-close.js fails language/statements/for-of/scope-head-lex-open.js fails -language/statements/for-of/scope-head-var-none.js sloppyFails language/statements/for-of/set-contract-expand.js fails language/statements/for-of/set-contract.js fails language/statements/for-of/set-expand-contract.js fails |