aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-05-31 16:06:34 +0200
committerLars Knoll <lars.knoll@qt.io>2018-09-07 10:32:01 +0000
commitff5bc526b4868aef9fb3a551afc5636b308a3d83 (patch)
tree692e956d6fcfd5fc4f064dce7275abeb51429c3a
parentbd4064eabf79a6166805c877ee622931df6fb172 (diff)
Add support for yield*
Change-Id: I5b054b59519ed825459a5b0b0a7cd2c6fc8a3797 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/qml/compiler/qv4bytecodehandler.cpp6
-rw-r--r--src/qml/compiler/qv4codegen.cpp55
-rw-r--r--src/qml/compiler/qv4instr_moth.cpp7
-rw-r--r--src/qml/compiler/qv4instr_moth_p.h4
-rw-r--r--src/qml/jit/qv4baselinejit.cpp18
-rw-r--r--src/qml/jit/qv4baselinejit_p.h2
-rw-r--r--src/qml/jsruntime/qv4engine.cpp1
-rw-r--r--src/qml/jsruntime/qv4engine_p.h2
-rw-r--r--src/qml/jsruntime/qv4generatorobject.cpp3
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp72
-rw-r--r--src/qml/jsruntime/qv4runtimeapi_p.h1
-rw-r--r--src/qml/jsruntime/qv4stackframe_p.h2
-rw-r--r--src/qml/jsruntime/qv4vme_moth.cpp19
-rw-r--r--tests/auto/qml/ecmascripttests/TestExpectations45
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