diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-05-31 16:06:34 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-09-07 10:32:01 +0000 |
commit | ff5bc526b4868aef9fb3a551afc5636b308a3d83 (patch) | |
tree | 692e956d6fcfd5fc4f064dce7275abeb51429c3a | |
parent | bd4064eabf79a6166805c877ee622931df6fb172 (diff) |
Add support for yield*
Change-Id: I5b054b59519ed825459a5b0b0a7cd2c6fc8a3797
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/qml/compiler/qv4bytecodehandler.cpp | 6 | ||||
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 55 | ||||
-rw-r--r-- | src/qml/compiler/qv4instr_moth.cpp | 7 | ||||
-rw-r--r-- | src/qml/compiler/qv4instr_moth_p.h | 4 | ||||
-rw-r--r-- | src/qml/jit/qv4baselinejit.cpp | 18 | ||||
-rw-r--r-- | src/qml/jit/qv4baselinejit_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4generatorobject.cpp | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 72 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtimeapi_p.h | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4stackframe_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 19 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 45 |
14 files changed, 181 insertions, 56 deletions
diff --git a/src/qml/compiler/qv4bytecodehandler.cpp b/src/qml/compiler/qv4bytecodehandler.cpp index 5b836c2e9c..65293becfd 100644 --- a/src/qml/compiler/qv4bytecodehandler.cpp +++ b/src/qml/compiler/qv4bytecodehandler.cpp @@ -240,6 +240,9 @@ std::vector<int> ByteCodeHandler::collectLabelsInBytecode(const char *code, uint COLLECTOR_BEGIN_INSTR(Yield) COLLECTOR_END_INSTR(Yield) + COLLECTOR_BEGIN_INSTR(YieldStar) + COLLECTOR_END_INSTR(YieldStar) + COLLECTOR_BEGIN_INSTR(Resume) COLLECTOR_END_INSTR(Resume) @@ -335,6 +338,9 @@ std::vector<int> ByteCodeHandler::collectLabelsInBytecode(const char *code, uint COLLECTOR_BEGIN_INSTR(IteratorNext) COLLECTOR_END_INSTR(IteratorNext) + COLLECTOR_BEGIN_INSTR(IteratorNextForYieldStar) + COLLECTOR_END_INSTR(IteratorNextForYieldStar) + COLLECTOR_BEGIN_INSTR(IteratorClose) COLLECTOR_END_INSTR(IteratorClose) diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index 2415142df4..09f08e8bf2 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -2826,25 +2826,64 @@ bool Codegen::visit(FunctionDeclaration * ast) bool Codegen::visit(YieldExpression *ast) { - if (ast->isYieldStar) { - throwSyntaxError(ast->firstSourceLocation(), QLatin1String("yield* is not currently supported")); - return false; - } if (inFormalParameterList) { throwSyntaxError(ast->firstSourceLocation(), QLatin1String("yield is not allowed inside parameter lists")); return false; } - - Reference result = ast->expression ? expression(ast->expression) : Reference::fromConst(this, Encode::undefined()); + RegisterScope scope(this); + Reference expr = ast->expression ? expression(ast->expression) : Reference::fromConst(this, Encode::undefined()); if (hasError) return false; - result.loadInAccumulator(); + + Reference acc = Reference::fromAccumulator(this); + + if (ast->isYieldStar) { + Reference iterator = Reference::fromStackSlot(this); + Reference lhsValue = Reference::fromConst(this, Encode::undefined()).storeOnStack(); + + expr.loadInAccumulator(); + Instruction::GetIterator getIterator; + getIterator.iterator = /*ForEachType::Of*/ 1; + bytecodeGenerator->addInstruction(getIterator); + iterator.storeConsumeAccumulator(); + Instruction::LoadUndefined load; + bytecodeGenerator->addInstruction(load); + + BytecodeGenerator::Label in = bytecodeGenerator->newLabel(); + bytecodeGenerator->jump().link(in); + + BytecodeGenerator::Label loop = bytecodeGenerator->label(); + + lhsValue.loadInAccumulator(); + Instruction::YieldStar yield; + bytecodeGenerator->addInstruction(yield); + + in.link(); + + Instruction::IteratorNextForYieldStar next; + next.object = lhsValue.stackSlot(); + next.iterator = iterator.stackSlot(); + bytecodeGenerator->addInstruction(next); + + BytecodeGenerator::Jump done = bytecodeGenerator->jumpTrue(); + bytecodeGenerator->jumpNotUndefined().link(loop); + lhsValue.loadInAccumulator(); + emitReturn(acc); + + + done.link(); + + lhsValue.loadInAccumulator(); + _expr.setResult(acc); + return false; + } + + expr.loadInAccumulator(); Instruction::Yield yield; bytecodeGenerator->addInstruction(yield); Instruction::Resume resume; BytecodeGenerator::Jump jump = bytecodeGenerator->addJumpInstruction(resume); - Reference acc = Reference::fromAccumulator(this); emitReturn(acc); jump.link(); _expr.setResult(acc); diff --git a/src/qml/compiler/qv4instr_moth.cpp b/src/qml/compiler/qv4instr_moth.cpp index 00a1e8470b..a125f0ce28 100644 --- a/src/qml/compiler/qv4instr_moth.cpp +++ b/src/qml/compiler/qv4instr_moth.cpp @@ -349,6 +349,9 @@ void dumpBytecode(const char *code, int len, int nLocals, int nFormals, int /*st MOTH_BEGIN_INSTR(Yield) MOTH_END_INSTR(Yield) + MOTH_BEGIN_INSTR(YieldStar) + MOTH_END_INSTR(YieldStar) + MOTH_BEGIN_INSTR(Resume) d << ABSOLUTE_OFFSET(); MOTH_END_INSTR(Resume) @@ -467,6 +470,10 @@ void dumpBytecode(const char *code, int len, int nLocals, int nFormals, int /*st d << dumpRegister(value, nFormals) << ", " << dumpRegister(done, nFormals); MOTH_END_INSTR(IteratorNext) + MOTH_BEGIN_INSTR(IteratorNextForYieldStar) + d << dumpRegister(iterator, nFormals) << ", " << dumpRegister(object, nFormals); + MOTH_END_INSTR(IteratorNextForYieldStar) + MOTH_BEGIN_INSTR(IteratorClose) d << dumpRegister(done, nFormals); MOTH_END_INSTR(IteratorClose) diff --git a/src/qml/compiler/qv4instr_moth_p.h b/src/qml/compiler/qv4instr_moth_p.h index 34c80db0e8..f9bd3cdd4a 100644 --- a/src/qml/compiler/qv4instr_moth_p.h +++ b/src/qml/compiler/qv4instr_moth_p.h @@ -94,7 +94,9 @@ QT_BEGIN_NAMESPACE #define INSTR_LoadContextObjectProperty(op) INSTRUCTION(op, LoadContextObjectProperty, 3, propertyIndex, base, captureRequired) #define INSTR_LoadIdObject(op) INSTRUCTION(op, LoadIdObject, 2, index, base) #define INSTR_Yield(op) INSTRUCTION(op, Yield, 0) +#define INSTR_YieldStar(op) INSTRUCTION(op, YieldStar, 0) #define INSTR_Resume(op) INSTRUCTION(op, Resume, 1, offset) +#define INSTR_IteratorNextForYieldStar(op) INSTRUCTION(op, IteratorNextForYieldStar, 2, iterator, object) #define INSTR_StoreProperty(op) INSTRUCTION(op, StoreProperty, 2, name, base) #define INSTR_SetLookup(op) INSTRUCTION(op, SetLookup, 2, index, base) #define INSTR_LoadSuperProperty(op) INSTRUCTION(op, LoadSuperProperty, 1, property) @@ -327,7 +329,9 @@ QT_BEGIN_NAMESPACE F(LoadQmlContext) \ F(LoadQmlImportedScripts) \ F(Yield) \ + F(YieldStar) \ F(Resume) \ + F(IteratorNextForYieldStar) \ F(CreateClass) \ F(LoadSuperConstructor) \ F(PushScriptContext) \ diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index baaab75158..1e77c1a001 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -400,6 +400,12 @@ void BaselineJIT::generate_Yield() Q_UNREACHABLE(); } +void BaselineJIT::generate_YieldStar() +{ + // ##### + Q_UNREACHABLE(); +} + void BaselineJIT::generate_Resume(int) { // ##### @@ -694,6 +700,18 @@ void BaselineJIT::generate_IteratorNext(int value, int done) as->checkException(); } +void BaselineJIT::generate_IteratorNextForYieldStar(int iterator, int object) +{ + as->saveAccumulatorInFrame(); + as->prepareCallWithArgCount(4); + as->passJSSlotAsArg(object, 3); + as->passJSSlotAsArg(iterator, 2); + as->passAccumulatorAsArg(1); + as->passEngineAsArg(0); + BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_iteratorNextForYieldStar, CallResultDestination::InAccumulator); + as->checkException(); +} + void BaselineJIT::generate_IteratorClose(int done) { as->saveAccumulatorInFrame(); diff --git a/src/qml/jit/qv4baselinejit_p.h b/src/qml/jit/qv4baselinejit_p.h index f9c876a1e9..d4c1b074f6 100644 --- a/src/qml/jit/qv4baselinejit_p.h +++ b/src/qml/jit/qv4baselinejit_p.h @@ -117,6 +117,7 @@ public: int captureRequired) override; void generate_LoadIdObject(int index, int base) override; void generate_Yield() override; + void generate_YieldStar() override; void generate_Resume(int) override; void generate_CallValue(int name, int argc, int argv) override; @@ -149,6 +150,7 @@ public: void generate_PopContext() override; void generate_GetIterator(int iterator) override; void generate_IteratorNext(int value, int done) override; + void generate_IteratorNextForYieldStar(int iterator, int object) override; void generate_IteratorClose(int done) override; void generate_DestructureRestElement() override; void generate_DeleteProperty(int base, int index) override; diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 7b1fd720a7..8747676685 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -286,6 +286,7 @@ ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine) jsStrings[String_next] = newIdentifier(QStringLiteral("next")); jsStrings[String_done] = newIdentifier(QStringLiteral("done")); jsStrings[String_return] = newIdentifier(QStringLiteral("return")); + jsStrings[String_throw] = newIdentifier(QStringLiteral("throw")); jsStrings[String_global] = newIdentifier(QStringLiteral("global")); jsStrings[String_ignoreCase] = newIdentifier(QStringLiteral("ignoreCase")); jsStrings[String_multiline] = newIdentifier(QStringLiteral("multiline")); diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 0b5d8663eb..276efe6e13 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -337,6 +337,7 @@ public: String_next, String_done, String_return, + String_throw, String_global, String_ignoreCase, String_multiline, @@ -408,6 +409,7 @@ public: String *id_next() const { return reinterpret_cast<String *>(jsStrings + String_next); } String *id_done() const { return reinterpret_cast<String *>(jsStrings + String_done); } String *id_return() const { return reinterpret_cast<String *>(jsStrings + String_return); } + String *id_throw() const { return reinterpret_cast<String *>(jsStrings + String_throw); } String *id_global() const { return reinterpret_cast<String *>(jsStrings + String_global); } String *id_ignoreCase() const { return reinterpret_cast<String *>(jsStrings + String_ignoreCase); } String *id_multiline() const { return reinterpret_cast<String *>(jsStrings + String_multiline); } diff --git a/src/qml/jsruntime/qv4generatorobject.cpp b/src/qml/jsruntime/qv4generatorobject.cpp index 82d8d88882..dd3d0328b0 100644 --- a/src/qml/jsruntime/qv4generatorobject.cpp +++ b/src/qml/jsruntime/qv4generatorobject.cpp @@ -215,6 +215,7 @@ ReturnedValue GeneratorObject::resume(ExecutionEngine *engine, const Value &arg) const char *code = gp->cppFrame.yield; gp->cppFrame.yield = nullptr; gp->cppFrame.jsFrame->accumulator = arg; + gp->cppFrame.yieldIsIterator = false; Scope scope(engine); ScopedValue result(scope, Moth::VME::interpret(&gp->cppFrame, engine, code)); @@ -225,6 +226,8 @@ ReturnedValue GeneratorObject::resume(ExecutionEngine *engine, const Value &arg) gp->state = done ? GeneratorState::Completed : GeneratorState::SuspendedYield; if (engine->hasException) return Encode::undefined(); + if (gp->cppFrame.yieldIsIterator) + return result->asReturnedValue(); return IteratorPrototype::createIterResultObject(engine, result, done); } diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 59fff91e7b..b59b9c3f50 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -782,6 +782,78 @@ ReturnedValue Runtime::method_iteratorNext(ExecutionEngine *engine, const Value return Encode(false); } +ReturnedValue Runtime::method_iteratorNextForYieldStar(ExecutionEngine *engine, const Value &received, const Value &iterator, Value *object) +{ + // the return value encodes how to continue the yield* iteration. + // true implies iteration is done, false for iteration to continue + // a return value of undefines is a special marker, that the iterator has been invoked with return() + + Scope scope(engine); + Q_ASSERT(iterator.isObject()); + + const Value *arg = &received; + bool returnCalled = false; + FunctionObject *f = nullptr; + if (engine->hasException) { + if (engine->exceptionValue->isEmpty()) { + // generator called with return() + *engine->exceptionValue = Encode::undefined(); + engine->hasException = false; + + ScopedValue ret(scope, static_cast<const Object &>(iterator).get(engine->id_return())); + if (ret->isUndefined()) { + // propagate return() + return Encode::undefined(); + } + returnCalled = true; + f = ret->as<FunctionObject>(); + } else { + // generator called with throw + ScopedValue exceptionValue(scope, *engine->exceptionValue); + *engine->exceptionValue = Encode::undefined(); + engine->hasException = false; + + ScopedValue t(scope, static_cast<const Object &>(iterator).get(engine->id_throw())); + if (engine->hasException) + return Encode::undefined(); + if (t->isUndefined()) { + // no throw method on the iterator + ScopedValue done(scope, Encode(false)); + method_iteratorClose(engine, iterator, done); + if (engine->hasException) + return Encode::undefined(); + return engine->throwTypeError(); + } + f = t->as<FunctionObject>(); + arg = exceptionValue; + } + } else { + // generator called with next() + ScopedFunctionObject next(scope, static_cast<const Object &>(iterator).get(engine->id_next())); + f = next->as<FunctionObject>(); + } + + if (!f) + return engine->throwTypeError(); + + ScopedObject o(scope, f->call(&iterator, arg, 1)); + if (scope.hasException()) + return Encode(true); + if (!o) + return engine->throwTypeError(); + + ScopedValue d(scope, o->get(engine->id_done())); + if (scope.hasException()) + return Encode(true); + bool done = d->toBoolean(); + if (done) { + *object = o->get(engine->id_value()); + return returnCalled ? Encode::undefined() : Encode(true); + } + *object = o; + return Encode(false); +} + ReturnedValue Runtime::method_iteratorClose(ExecutionEngine *engine, const Value &iterator, const Value &done) { Q_ASSERT(iterator.isObject()); diff --git a/src/qml/jsruntime/qv4runtimeapi_p.h b/src/qml/jsruntime/qv4runtimeapi_p.h index 62ba85efde..34b04929af 100644 --- a/src/qml/jsruntime/qv4runtimeapi_p.h +++ b/src/qml/jsruntime/qv4runtimeapi_p.h @@ -153,6 +153,7 @@ struct ExceptionCheck<void (*)(QV4::NoThrowEngine *, A, B, C)> { /* for-in, for-of and array destructuring */ \ F(ReturnedValue, getIterator, (ExecutionEngine *engine, const Value &in, int iterator)) \ F(ReturnedValue, iteratorNext, (ExecutionEngine *engine, const Value &iterator, Value *value)) \ + F(ReturnedValue, iteratorNextForYieldStar, (ExecutionEngine *engine, const Value &received, const Value &iterator, Value *object)) \ F(ReturnedValue, iteratorClose, (ExecutionEngine *engine, const Value &iterator, const Value &done)) \ F(ReturnedValue, destructureRestElement, (ExecutionEngine *engine, const Value &iterator)) \ \ diff --git a/src/qml/jsruntime/qv4stackframe_p.h b/src/qml/jsruntime/qv4stackframe_p.h index ca39a8f7bb..39e7c25a4e 100644 --- a/src/qml/jsruntime/qv4stackframe_p.h +++ b/src/qml/jsruntime/qv4stackframe_p.h @@ -122,6 +122,7 @@ struct Q_QML_EXPORT CppStackFrame { const char *unwindHandler; const char *unwindLabel; int unwindLevel; + bool yieldIsIterator; void init(EngineBase *engine, Function *v4Function, const Value *argv, int argc) { this->engine = engine; @@ -134,6 +135,7 @@ struct Q_QML_EXPORT CppStackFrame { unwindHandler = nullptr; unwindLabel = nullptr; unwindLevel = 0; + yieldIsIterator = false; } void push() { diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index 6ed371bbf2..07eb054350 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -661,9 +661,16 @@ QV4::ReturnedValue VME::interpret(CppStackFrame *frame, ExecutionEngine *engine, MOTH_BEGIN_INSTR(Yield) frame->yield = code; + frame->yieldIsIterator = false; return acc; MOTH_END_INSTR(Yield) + MOTH_BEGIN_INSTR(YieldStar) + frame->yield = code; + frame->yieldIsIterator = true; + return acc; + MOTH_END_INSTR(YieldStar) + MOTH_BEGIN_INSTR(Resume) // check exception, in case the generator was called with throw() or return() if (engine->hasException) { @@ -672,11 +679,17 @@ QV4::ReturnedValue VME::interpret(CppStackFrame *frame, ExecutionEngine *engine, goto handleUnwind; engine->hasException = false; *engine->exceptionValue = Primitive::undefinedValue(); - } else { - code += offset; - } + } else { + code += offset; + } MOTH_END_INSTR(Resume) + MOTH_BEGIN_INSTR(IteratorNextForYieldStar) + STORE_ACC(); + acc = Runtime::method_iteratorNextForYieldStar(engine, accumulator, STACK_VALUE(iterator), &STACK_VALUE(object)); + CHECK_EXCEPTION; + MOTH_END_INSTR(IteratorNextForYieldStar) + MOTH_BEGIN_INSTR(CallValue) STORE_IP(); Value func = STACK_VALUE(name); diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations index 26a9f4fc23..97c71c7a60 100644 --- a/tests/auto/qml/ecmascripttests/TestExpectations +++ b/tests/auto/qml/ecmascripttests/TestExpectations @@ -813,7 +813,6 @@ language/expressions/generators/yield-as-identifier-in-nested-function.js sloppy language/expressions/generators/yield-as-literal-property-name.js fails language/expressions/generators/yield-as-property-name.js fails language/expressions/generators/yield-identifier-non-strict.js sloppyFails -language/expressions/generators/yield-star-before-newline.js fails language/expressions/logical-and/tco-right.js strictFails language/expressions/logical-or/tco-right.js strictFails language/expressions/new/non-ctor-err-realm.js fails @@ -830,7 +829,6 @@ language/expressions/object/method-definition/yield-as-function-expression-bindi language/expressions/object/method-definition/yield-as-identifier-in-nested-function.js sloppyFails language/expressions/object/method-definition/yield-as-literal-property-name.js fails language/expressions/object/method-definition/yield-as-property-name.js fails -language/expressions/object/method-definition/yield-star-before-newline.js fails language/expressions/object/properties-names-eval-arguments.js strictFails language/expressions/object/scope-gen-meth-body-lex-distinct.js sloppyFails language/expressions/object/scope-gen-meth-param-elem-var-close.js sloppyFails @@ -897,44 +895,7 @@ language/expressions/template-literal/tv-template-middle.js fails language/expressions/template-literal/tv-template-tail.js fails language/expressions/template-literal/tv-utf16-escape-sequence.js fails language/expressions/template-literal/tv-zwnbsp.js fails -language/expressions/yield/star-array.js fails -language/expressions/yield/star-in-rltn-expr.js fails -language/expressions/yield/star-iterable.js fails -language/expressions/yield/star-rhs-iter-get-call-err.js fails -language/expressions/yield/star-rhs-iter-get-call-non-obj.js fails -language/expressions/yield/star-rhs-iter-get-get-err.js fails -language/expressions/yield/star-rhs-iter-nrml-next-call-err.js fails -language/expressions/yield/star-rhs-iter-nrml-next-call-non-obj.js fails -language/expressions/yield/star-rhs-iter-nrml-next-get-err.js fails -language/expressions/yield/star-rhs-iter-nrml-next-invoke.js fails -language/expressions/yield/star-rhs-iter-nrml-res-done-err.js fails -language/expressions/yield/star-rhs-iter-nrml-res-done-no-value.js fails -language/expressions/yield/star-rhs-iter-nrml-res-value-err.js fails -language/expressions/yield/star-rhs-iter-nrml-res-value-final.js fails -language/expressions/yield/star-rhs-iter-rtrn-no-rtrn.js fails -language/expressions/yield/star-rhs-iter-rtrn-res-done-err.js fails -language/expressions/yield/star-rhs-iter-rtrn-res-done-no-value.js fails -language/expressions/yield/star-rhs-iter-rtrn-res-value-err.js fails -language/expressions/yield/star-rhs-iter-rtrn-res-value-final.js fails -language/expressions/yield/star-rhs-iter-rtrn-rtrn-call-err.js fails -language/expressions/yield/star-rhs-iter-rtrn-rtrn-call-non-obj.js fails -language/expressions/yield/star-rhs-iter-rtrn-rtrn-get-err.js fails -language/expressions/yield/star-rhs-iter-rtrn-rtrn-invoke.js fails -language/expressions/yield/star-rhs-iter-thrw-res-done-err.js fails -language/expressions/yield/star-rhs-iter-thrw-res-done-no-value.js fails -language/expressions/yield/star-rhs-iter-thrw-res-value-err.js fails -language/expressions/yield/star-rhs-iter-thrw-res-value-final.js fails -language/expressions/yield/star-rhs-iter-thrw-thrw-call-err.js fails -language/expressions/yield/star-rhs-iter-thrw-thrw-call-non-obj.js fails -language/expressions/yield/star-rhs-iter-thrw-thrw-get-err.js fails -language/expressions/yield/star-rhs-iter-thrw-thrw-invoke.js fails -language/expressions/yield/star-rhs-iter-thrw-violation-no-rtrn.js fails -language/expressions/yield/star-rhs-iter-thrw-violation-rtrn-call-err.js fails -language/expressions/yield/star-rhs-iter-thrw-violation-rtrn-call-non-obj.js fails language/expressions/yield/star-rhs-iter-thrw-violation-rtrn-get-err.js fails -language/expressions/yield/star-rhs-iter-thrw-violation-rtrn-invoke.js fails -language/expressions/yield/star-rhs-unresolvable.js fails -language/expressions/yield/star-string.js fails language/function-code/each-param-has-own-non-shared-eval-scope.js sloppyFails language/function-code/each-param-has-own-scope.js sloppyFails language/function-code/eval-param-env-with-computed-key.js sloppyFails @@ -964,7 +925,6 @@ language/statements/class/definition/class-method-returns-promise.js fails language/statements/class/definition/getters-restricted-ids.js fails language/statements/class/definition/methods-gen-yield-as-literal-property-name.js fails language/statements/class/definition/methods-gen-yield-as-property-name.js fails -language/statements/class/definition/methods-gen-yield-star-before-newline.js fails language/statements/class/definition/methods-named-eval-arguments.js fails language/statements/class/definition/prototype-property.js fails language/statements/class/definition/setters-prop-desc.js fails @@ -1016,10 +976,6 @@ language/statements/for-of/dstr-obj-id-put-let.js fails language/statements/for-of/dstr-obj-prop-put-let.js fails language/statements/for-of/head-var-bound-names-let.js sloppyFails language/statements/for-of/iterator-next-reference.js fails -language/statements/for-of/yield-star-from-catch.js fails -language/statements/for-of/yield-star-from-finally.js fails -language/statements/for-of/yield-star-from-try.js fails -language/statements/for-of/yield-star.js fails language/statements/for/head-lhs-let.js sloppyFails language/statements/for/scope-body-lex-open.js fails language/statements/for/tco-const-body.js strictFails @@ -1055,7 +1011,6 @@ language/statements/generators/yield-as-identifier-in-nested-function.js sloppyF language/statements/generators/yield-as-literal-property-name.js fails language/statements/generators/yield-as-property-name.js fails language/statements/generators/yield-identifier-non-strict.js sloppyFails -language/statements/generators/yield-star-before-newline.js fails language/statements/if/tco-else-body.js strictFails language/statements/if/tco-if-body.js strictFails language/statements/labeled/tco.js strictFails |