diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-06-05 13:07:50 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-06-21 13:30:44 +0000 |
commit | ce18e987d4ea623c0db6d10f2a97a16b639a234e (patch) | |
tree | 793ce0624f971de8015d5580e6c06d2b1a1b9aab | |
parent | a12da297946b5a6e767b972bc635a3308683b2e5 (diff) |
Fix more issues with destructuring
Fix destructuring targets that are complex lhs expressions.
There are still some failures remaining, but this fixes
another larger chunk of test cases.
Change-Id: Icf08f42d7c70d4e81be5d5d2e27ebe6249d25467
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 31 | ||||
-rw-r--r-- | src/qml/compiler/qv4codegen_p.h | 1 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast.cpp | 32 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 16 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 73 |
5 files changed, 60 insertions, 93 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index 1a47730979..d71d36845b 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -469,10 +469,27 @@ void Codegen::variableDeclarationList(VariableDeclarationList *ast) } } -void Codegen::initializeAndDestructureBindingElement(AST::PatternElement *e, const Reference &baseRef) +Codegen::Reference Codegen::targetForPatternElement(AST::PatternElement *p) +{ + if (!p->bindingIdentifier.isNull()) + return referenceForName(p->bindingIdentifier, true); + if (!p->bindingTarget || p->destructuringPattern()) + return Codegen::Reference::fromStackSlot(this); + Reference lhs = expression(p->bindingTarget); + if (hasError) + return lhs; + lhs = lhs.asLValue(); + return lhs; +} + +void Codegen::initializeAndDestructureBindingElement(AST::PatternElement *e, const Reference &base) { RegisterScope scope(this); - Reference varToStore = e->bindingIdentifier.isNull() ? Reference::fromStackSlot(this, bytecodeGenerator->newRegister()) : referenceForName(e->bindingIdentifier, true); + Reference baseRef = (base.isAccumulator()) ? base.storeOnStack() : base; + Reference varToStore = targetForPatternElement(e); + if (hasError) + return; + if (e->initializer) { if (!baseRef.isValid()) { // assignment @@ -508,13 +525,17 @@ void Codegen::initializeAndDestructureBindingElement(AST::PatternElement *e, con baseRef.loadInAccumulator(); varToStore.storeConsumeAccumulator(); } + Pattern *p = e->destructuringPattern(); + if (!p) + return; + if (!varToStore.isStackSlot()) varToStore = varToStore.storeOnStack(); if (PatternElementList *l = e->elementList()) { destructureElementList(varToStore, l); } else if (PatternPropertyList *p = e->propertyList()) { destructurePropertyList(varToStore, p); - } else if (e->bindingPattern) { + } else if (e->bindingTarget) { // empty binding pattern. For spec compatibility, try to coerce the argument to an object varToStore.loadInAccumulator(); Instruction::ToObject toObject; @@ -537,7 +558,7 @@ void Codegen::destructurePropertyList(const Codegen::Reference &object, PatternP if (hasError) return; computedName = computedName.storeOnStack(); - property = Reference::fromSubscript(object, computedName); + property = Reference::fromSubscript(object, computedName).asLValue(); } else { QString propertyName = p->name->asString(); property = Reference::fromMember(object, propertyName); @@ -2496,7 +2517,7 @@ int Codegen::defineFunction(const QString &name, AST::Node *ast, bytecodeGenerator->addInstruction(rest); arg.storeConsumeAccumulator(); } else { - if (e->bindingPattern || e->initializer) { + if (e->bindingTarget || e->initializer) { initializeAndDestructureBindingElement(e, arg); if (hasError) break; diff --git a/src/qml/compiler/qv4codegen_p.h b/src/qml/compiler/qv4codegen_p.h index 39309f78ce..713b040ad1 100644 --- a/src/qml/compiler/qv4codegen_p.h +++ b/src/qml/compiler/qv4codegen_p.h @@ -516,6 +516,7 @@ protected: void variableDeclaration(AST::PatternElement *ast); void variableDeclarationList(AST::VariableDeclarationList *ast); + Reference targetForPatternElement(AST::PatternElement *p); 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); diff --git a/src/qml/parser/qqmljsast.cpp b/src/qml/parser/qqmljsast.cpp index b63feb3362..e9e33f7561 100644 --- a/src/qml/parser/qqmljsast.cpp +++ b/src/qml/parser/qqmljsast.cpp @@ -268,7 +268,7 @@ void ArrayPattern::accept0(Visitor *visitor) bool ArrayPattern::isValidArrayLiteral(SourceLocation *errorLocation) const { for (PatternElementList *it = elements; it != nullptr; it = it->next) { PatternElement *e = it->element; - if (e && e->bindingPattern != nullptr) { + if (e && e->bindingTarget != nullptr) { if (errorLocation) *errorLocation = e->firstSourceLocation(); return false; @@ -386,8 +386,8 @@ bool PatternElement::convertLiteralToAssignmentPattern(MemoryPool *pool, SourceL { Q_ASSERT(type == Literal || type == SpreadElement); Q_ASSERT(bindingIdentifier.isNull()); - Q_ASSERT(bindingPattern == nullptr); - Q_ASSERT(bindingPattern == nullptr); + Q_ASSERT(bindingTarget == nullptr); + Q_ASSERT(bindingTarget == nullptr); Q_ASSERT(initializer); ExpressionNode *init = initializer; @@ -399,8 +399,7 @@ bool PatternElement::convertLiteralToAssignmentPattern(MemoryPool *pool, SourceL *errorMessage = QString::fromLatin1("Invalid lhs expression after '...' in destructuring expression."); return false; } - // ### Should be binding - initializer = lhs; + bindingTarget = lhs; return true; } type = PatternElement::Binding; @@ -422,21 +421,18 @@ bool PatternElement::convertLiteralToAssignmentPattern(MemoryPool *pool, SourceL *errorMessage = QString::fromLatin1("Destructuring target is not a left hand side expression."); return false; } - - if (auto *p = lhs->patternCast()) { - bindingPattern = p; - if (!p->convertLiteralToAssignmentPattern(pool, errorLocation, errorMessage)) - return false; - return true; - } if (auto *i = cast<IdentifierExpression *>(lhs)) { bindingIdentifier = i->name.toString(); identifierToken = i->identifierToken; return true; } - *errorLocation = lastSourceLocation(); - *errorMessage = QLatin1String("Unimplemented!"); - return false; + + bindingTarget = lhs; + if (auto *p = lhs->patternCast()) { + if (!p->convertLiteralToAssignmentPattern(pool, errorLocation, errorMessage)) + return false; + } + return true; } bool PatternProperty::convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage) @@ -1209,7 +1205,7 @@ void TaggedTemplate::accept0(Visitor *visitor) void PatternElement::accept0(Visitor *visitor) { if (visitor->visit(this)) { - accept(bindingPattern, visitor); + accept(bindingTarget, visitor); accept(initializer, visitor); } @@ -1218,7 +1214,7 @@ void PatternElement::accept0(Visitor *visitor) void PatternElement::boundNames(QStringList *names) { - if (bindingPattern) { + if (bindingTarget) { if (PatternElementList *e = elementList()) e->boundNames(names); else if (PatternPropertyList *p = propertyList()) @@ -1252,7 +1248,7 @@ void PatternProperty::accept0(Visitor *visitor) { if (visitor->visit(this)) { accept(name, visitor); - accept(bindingPattern, visitor); + accept(bindingTarget, visitor); accept(initializer, visitor); } diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h index 2d4d5662bd..66a4e357e9 100644 --- a/src/qml/parser/qqmljsast_p.h +++ b/src/qml/parser/qqmljsast_p.h @@ -678,7 +678,7 @@ public: } PatternElement(Pattern *pattern, ExpressionNode *i = nullptr, Type t = Binding) - : bindingPattern(pattern), initializer(i), type(t) + : bindingTarget(pattern), initializer(i), type(t) { Q_ASSERT(t >= RestElement); kind = K; @@ -688,13 +688,15 @@ public: virtual bool convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage); SourceLocation firstSourceLocation() const override - { return identifierToken.isValid() ? identifierToken : (bindingPattern ? bindingPattern->firstSourceLocation() : initializer->firstSourceLocation()); } + { return identifierToken.isValid() ? identifierToken : (bindingTarget ? bindingTarget->firstSourceLocation() : initializer->firstSourceLocation()); } SourceLocation lastSourceLocation() const override - { return initializer ? initializer->lastSourceLocation() : (bindingPattern ? bindingPattern->lastSourceLocation() : identifierToken); } + { return initializer ? initializer->lastSourceLocation() : (bindingTarget ? bindingTarget->lastSourceLocation() : identifierToken); } - PatternElementList *elementList() const { ArrayPattern *a = cast<ArrayPattern *>(bindingPattern); return a ? a->elements : nullptr; } - PatternPropertyList *propertyList() const { ObjectPattern *o = cast<ObjectPattern *>(bindingPattern); return o ? o->properties : nullptr; } + ExpressionNode *destructuringTarget() const { return bindingTarget; } + Pattern *destructuringPattern() const { return bindingTarget ? bindingTarget->patternCast() : nullptr; } + PatternElementList *elementList() const { ArrayPattern *a = cast<ArrayPattern *>(bindingTarget); return a ? a->elements : nullptr; } + PatternPropertyList *propertyList() const { ObjectPattern *o = cast<ObjectPattern *>(bindingTarget); return o ? o->properties : nullptr; } bool isVariableDeclaration() const { return scope != VariableScope::NoScope; } bool isLexicallyScoped() const { return scope == VariableScope::Let || scope == VariableScope::Const; } @@ -704,7 +706,7 @@ public: // attributes SourceLocation identifierToken; QString bindingIdentifier; - Pattern *bindingPattern = nullptr; + ExpressionNode *bindingTarget = nullptr; ExpressionNode *initializer = nullptr; Type type = Literal; // when used in a VariableDeclarationList @@ -2164,7 +2166,7 @@ public: PatternElement *e = formals->element; if (e && e->type == PatternElement::RestElement) return false; - if (e && (e->initializer || e->bindingPattern)) + if (e && (e->initializer || e->bindingTarget)) return false; formals = formals->next; } diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations index 4967ea67d2..ead465917b 100644 --- a/tests/auto/qml/ecmascripttests/TestExpectations +++ b/tests/auto/qml/ecmascripttests/TestExpectations @@ -2477,24 +2477,24 @@ language/expressions/array/spread-sngl-literal.js fails language/expressions/arrow-function/cannot-override-this-with-thisArg.js fails language/expressions/arrow-function/dflt-params-ref-later.js fails language/expressions/arrow-function/dflt-params-ref-self.js fails -language/expressions/arrow-function/dstr-ary-ptrn-elem-ary-rest-init.js fails -language/expressions/arrow-function/dstr-ary-ptrn-elem-ary-rest-iter.js fails +language/expressions/arrow-function/dstr-ary-ptrn-elem-ary-rest-init.js strictFails +language/expressions/arrow-function/dstr-ary-ptrn-elem-ary-rest-iter.js strictFails language/expressions/arrow-function/dstr-ary-ptrn-elem-id-init-fn-name-class.js fails language/expressions/arrow-function/dstr-ary-ptrn-rest-ary-elem.js fails language/expressions/arrow-function/dstr-ary-ptrn-rest-ary-rest.js fails -language/expressions/arrow-function/dstr-ary-ptrn-rest-id-elision.js fails -language/expressions/arrow-function/dstr-ary-ptrn-rest-id-exhausted.js fails -language/expressions/arrow-function/dstr-ary-ptrn-rest-id.js fails +language/expressions/arrow-function/dstr-ary-ptrn-rest-id-elision.js strictFails +language/expressions/arrow-function/dstr-ary-ptrn-rest-id-exhausted.js strictFails +language/expressions/arrow-function/dstr-ary-ptrn-rest-id.js strictFails language/expressions/arrow-function/dstr-ary-ptrn-rest-obj-id.js fails language/expressions/arrow-function/dstr-ary-ptrn-rest-obj-prop-id.js fails -language/expressions/arrow-function/dstr-dflt-ary-ptrn-elem-ary-rest-init.js fails -language/expressions/arrow-function/dstr-dflt-ary-ptrn-elem-ary-rest-iter.js fails +language/expressions/arrow-function/dstr-dflt-ary-ptrn-elem-ary-rest-init.js strictFails +language/expressions/arrow-function/dstr-dflt-ary-ptrn-elem-ary-rest-iter.js strictFails language/expressions/arrow-function/dstr-dflt-ary-ptrn-elem-id-init-fn-name-class.js fails language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-ary-elem.js fails language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-ary-rest.js fails -language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-id-elision.js fails -language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-id-exhausted.js fails -language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-id.js fails +language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-id-elision.js strictFails +language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-id-exhausted.js strictFails +language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-id.js strictFails language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-obj-id.js fails language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-obj-prop-id.js fails language/expressions/arrow-function/dstr-dflt-obj-ptrn-id-init-fn-name-class.js fails @@ -2535,37 +2535,24 @@ language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js fails language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js fails language/expressions/assignment/dstr-array-elem-iter-thrw-close-err.js fails language/expressions/assignment/dstr-array-elem-iter-thrw-close.js fails -language/expressions/assignment/dstr-array-elem-nested-array-yield-expr.js fails -language/expressions/assignment/dstr-array-elem-nested-array-yield-ident-valid.js sloppyFails language/expressions/assignment/dstr-array-elem-put-const.js fails language/expressions/assignment/dstr-array-elem-put-let.js fails -language/expressions/assignment/dstr-array-elem-put-prop-ref-no-get.js fails -language/expressions/assignment/dstr-array-elem-put-prop-ref-user-err.js fails -language/expressions/assignment/dstr-array-elem-put-prop-ref.js fails -language/expressions/assignment/dstr-array-elem-target-yield-expr.js fails -language/expressions/assignment/dstr-array-elem-target-yield-valid.js sloppyFails language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js fails language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js fails language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js fails language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-err.js fails language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close.js fails -language/expressions/assignment/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js fails language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js fails language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js fails language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close.js fails language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-err.js fails language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close.js fails -language/expressions/assignment/dstr-array-rest-after-element.js fails -language/expressions/assignment/dstr-array-rest-after-elision.js fails -language/expressions/assignment/dstr-array-rest-elision.js fails language/expressions/assignment/dstr-array-rest-iter-rtrn-close-err.js fails language/expressions/assignment/dstr-array-rest-iter-rtrn-close-null.js fails language/expressions/assignment/dstr-array-rest-iter-rtrn-close.js fails language/expressions/assignment/dstr-array-rest-iter-thrw-close-err.js fails language/expressions/assignment/dstr-array-rest-iter-thrw-close.js fails language/expressions/assignment/dstr-array-rest-lref-err.js fails -language/expressions/assignment/dstr-array-rest-lref.js fails -language/expressions/assignment/dstr-array-rest-nested-array-iter-thrw-close-skip.js fails language/expressions/assignment/dstr-array-rest-nested-array-null.js fails language/expressions/assignment/dstr-array-rest-nested-array-undefined-hole.js fails language/expressions/assignment/dstr-array-rest-nested-array-undefined-own.js fails @@ -2577,17 +2564,9 @@ language/expressions/assignment/dstr-array-rest-nested-obj-null.js fails language/expressions/assignment/dstr-array-rest-nested-obj-undefined-hole.js fails language/expressions/assignment/dstr-array-rest-nested-obj-undefined-own.js fails language/expressions/assignment/dstr-array-rest-nested-obj-undefined.js fails -language/expressions/assignment/dstr-array-rest-nested-obj-yield-expr.js fails -language/expressions/assignment/dstr-array-rest-nested-obj-yield-ident-valid.js sloppyFails language/expressions/assignment/dstr-array-rest-nested-obj.js fails language/expressions/assignment/dstr-array-rest-put-const.js fails language/expressions/assignment/dstr-array-rest-put-let.js fails -language/expressions/assignment/dstr-array-rest-put-prop-ref-no-get.js fails -language/expressions/assignment/dstr-array-rest-put-prop-ref.js fails -language/expressions/assignment/dstr-array-rest-put-unresolvable-no-strict.js sloppyFails -language/expressions/assignment/dstr-array-rest-put-unresolvable-strict.js strictFails -language/expressions/assignment/dstr-array-rest-yield-expr.js fails -language/expressions/assignment/dstr-array-rest-yield-ident-valid.js sloppyFails language/expressions/assignment/dstr-obj-empty-null.js fails language/expressions/assignment/dstr-obj-empty-undef.js fails language/expressions/assignment/dstr-obj-id-init-fn-name-class.js fails @@ -2596,13 +2575,8 @@ language/expressions/assignment/dstr-obj-id-put-const.js fails language/expressions/assignment/dstr-obj-id-put-let.js fails language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-class.js fails language/expressions/assignment/dstr-obj-prop-elem-init-let.js fails -language/expressions/assignment/dstr-obj-prop-elem-target-yield-expr.js fails -language/expressions/assignment/dstr-obj-prop-elem-target-yield-ident-valid.js sloppyFails language/expressions/assignment/dstr-obj-prop-put-const.js fails language/expressions/assignment/dstr-obj-prop-put-let.js fails -language/expressions/assignment/dstr-obj-prop-put-prop-ref-no-get.js fails -language/expressions/assignment/dstr-obj-prop-put-prop-ref-user-err.js fails -language/expressions/assignment/dstr-obj-prop-put-prop-ref.js fails language/expressions/assignment/fn-name-class.js fails language/expressions/assignment/fn-name-lhs-cover.js fails language/expressions/assignment/fn-name-lhs-member.js fails @@ -4853,36 +4827,24 @@ language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js fails 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.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-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-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-list-rtrn-close-err.js fails language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js fails language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js fails language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-err.js fails language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close.js fails -language/statements/for-of/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js fails language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js fails language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js fails language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js fails language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-err.js fails language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close.js fails -language/statements/for-of/dstr-array-rest-after-element.js fails -language/statements/for-of/dstr-array-rest-after-elision.js fails -language/statements/for-of/dstr-array-rest-elision.js fails language/statements/for-of/dstr-array-rest-iter-rtrn-close-err.js fails language/statements/for-of/dstr-array-rest-iter-rtrn-close-null.js fails language/statements/for-of/dstr-array-rest-iter-rtrn-close.js fails language/statements/for-of/dstr-array-rest-iter-thrw-close-err.js fails language/statements/for-of/dstr-array-rest-iter-thrw-close.js fails language/statements/for-of/dstr-array-rest-lref-err.js fails -language/statements/for-of/dstr-array-rest-lref.js fails language/statements/for-of/dstr-array-rest-nested-array-iter-thrw-close-skip.js fails language/statements/for-of/dstr-array-rest-nested-array-null.js fails language/statements/for-of/dstr-array-rest-nested-array-undefined-hole.js fails @@ -4895,19 +4857,9 @@ language/statements/for-of/dstr-array-rest-nested-obj-null.js fails language/statements/for-of/dstr-array-rest-nested-obj-undefined-hole.js fails language/statements/for-of/dstr-array-rest-nested-obj-undefined-own.js fails language/statements/for-of/dstr-array-rest-nested-obj-undefined.js fails -language/statements/for-of/dstr-array-rest-nested-obj-yield-expr.js fails -language/statements/for-of/dstr-array-rest-nested-obj-yield-ident-valid.js sloppyFails language/statements/for-of/dstr-array-rest-nested-obj.js fails language/statements/for-of/dstr-array-rest-put-const.js fails language/statements/for-of/dstr-array-rest-put-let.js fails -language/statements/for-of/dstr-array-rest-put-prop-ref-no-get.js fails -language/statements/for-of/dstr-array-rest-put-prop-ref-user-err-iter-close-skip.js fails -language/statements/for-of/dstr-array-rest-put-prop-ref-user-err.js fails -language/statements/for-of/dstr-array-rest-put-prop-ref.js fails -language/statements/for-of/dstr-array-rest-put-unresolvable-no-strict.js sloppyFails -language/statements/for-of/dstr-array-rest-put-unresolvable-strict.js strictFails -language/statements/for-of/dstr-array-rest-yield-expr.js fails -language/statements/for-of/dstr-array-rest-yield-ident-valid.js sloppyFails language/statements/for-of/dstr-const-ary-init-iter-close.js fails language/statements/for-of/dstr-const-ary-init-iter-get-err.js fails language/statements/for-of/dstr-const-ary-init-iter-no-close.js fails @@ -4987,13 +4939,8 @@ 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-prop-elem-init-fn-name-class.js fails language/statements/for-of/dstr-obj-prop-elem-init-let.js fails -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-put-const.js fails language/statements/for-of/dstr-obj-prop-put-let.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-var-ary-ptrn-elem-id-init-fn-name-class.js fails language/statements/for-of/dstr-var-obj-ptrn-id-init-fn-name-class.js fails language/statements/for-of/generator-close-via-continue.js fails |