Revert of [parser] Fix scopes in rewriting of for-of and destructuring assignments. (patchset #6 id:100001 of https://codereview.chromium.org/2520883002/ )

Reason for revert:
Speculative revert: Seems to break jsfunfuzz:
https://build.chromium.org/p/client.v8/builders/V8%20Fuzzer/builds/14385

Original issue's description:
> [parser] Fix scopes in rewriting of for-of and destructuring assignments.
>
> The catch scopes were created with the wrong parent scope.
>
> R=littledan@chromium.org
> BUG=v8:5648
>
> Committed: https://crrev.com/f385268d11d6da9508e481202b39f75f4b56afdd
> Cr-Commit-Position: refs/heads/master@{#41222}

TBR=littledan@chromium.org,verwaest@chromium.org,neis@chromium.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=v8:5648

Review-Url: https://codereview.chromium.org/2519333005
Cr-Commit-Position: refs/heads/master@{#41228}
This commit is contained in:
machenbach 2016-11-23 07:23:00 -08:00 committed by Commit bot
parent f658e41d86
commit 7edbd535a9
7 changed files with 163 additions and 247 deletions

View File

@ -635,36 +635,6 @@ Variable* DeclarationScope::DeclareFunctionVar(const AstRawString* name) {
return function_;
}
bool Scope::HasBeenRemoved() const {
// TODO(neis): Store this information somewhere instead of calculating it.
if (is_declaration_scope()) return false;
DCHECK(is_block_scope());
Scope* parent = outer_scope();
if (parent == nullptr) {
DCHECK(is_script_scope());
return false;
}
Scope* sibling = parent->inner_scope();
for (; sibling != nullptr; sibling = sibling->sibling()) {
if (sibling == this) return false;
}
DCHECK_NULL(inner_scope_);
return true;
}
Scope* Scope::GetUnremovedScope() {
Scope* scope = this;
while (scope != nullptr && scope->HasBeenRemoved()) {
scope = scope->outer_scope();
}
DCHECK_NOT_NULL(scope);
return scope;
}
Scope* Scope::FinalizeBlockScope() {
DCHECK(is_block_scope());

View File

@ -113,11 +113,6 @@ class V8_EXPORT_PRIVATE Scope : public NON_EXPORTED_BASE(ZoneObject) {
// tree and its children are reparented.
Scope* FinalizeBlockScope();
bool HasBeenRemoved() const;
// Find the first scope that hasn't been removed.
Scope* GetUnremovedScope();
// Inserts outer_scope into this scope's scope chain (and removes this
// from the current outer_scope_'s inner scope list).
// Assumes outer_scope_ is non-null.

View File

@ -4332,11 +4332,8 @@ void Parser::RewriteDestructuringAssignments() {
pair.assignment->AsRewritableExpression();
DCHECK_NOT_NULL(to_rewrite);
if (!to_rewrite->is_rewritten()) {
// Since this function is called at the end of parsing the program,
// pair.scope may already have been removed by FinalizeBlockScope in the
// meantime.
Scope* scope = pair.scope->GetUnremovedScope();
PatternRewriter::RewriteDestructuringAssignment(this, to_rewrite, scope);
PatternRewriter::RewriteDestructuringAssignment(this, to_rewrite,
pair.scope);
}
}
}
@ -4771,7 +4768,7 @@ Expression* Parser::RewriteYieldStar(Expression* generator,
Block* then = factory()->NewBlock(nullptr, 4 + 1, false, nopos);
BuildIteratorCloseForCompletion(
scope(), then->statements(), var_iterator,
then->statements(), var_iterator,
factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos));
then->statements()->Add(throw_call, zone());
check_throw = factory()->NewIfStatement(
@ -5139,9 +5136,9 @@ void Parser::BuildIteratorClose(ZoneList<Statement*>* statements,
statements->Add(validate_output, zone());
}
void Parser::FinalizeIteratorUse(Scope* use_scope, Variable* completion,
Expression* condition, Variable* iter,
Block* iterator_use, Block* target) {
void Parser::FinalizeIteratorUse(Variable* completion, Expression* condition,
Variable* iter, Block* iterator_use,
Block* target) {
//
// This function adds two statements to [target], corresponding to the
// following code:
@ -5197,8 +5194,7 @@ void Parser::FinalizeIteratorUse(Scope* use_scope, Variable* completion,
{
Block* block = factory()->NewBlock(nullptr, 2, true, nopos);
Expression* proxy = factory()->NewVariableProxy(completion);
BuildIteratorCloseForCompletion(use_scope, block->statements(), iter,
proxy);
BuildIteratorCloseForCompletion(block->statements(), iter, proxy);
DCHECK(block->statements()->length() == 2);
maybe_close = factory()->NewBlock(nullptr, 1, true, nopos);
@ -5215,7 +5211,7 @@ void Parser::FinalizeIteratorUse(Scope* use_scope, Variable* completion,
// }
Statement* try_catch;
{
Scope* catch_scope = NewScopeWithParent(use_scope, CATCH_SCOPE);
Scope* catch_scope = NewScopeWithParent(scope(), CATCH_SCOPE);
Variable* catch_variable =
catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR,
kCreatedInitialized, NORMAL_VARIABLE);
@ -5255,8 +5251,7 @@ void Parser::FinalizeIteratorUse(Scope* use_scope, Variable* completion,
target->statements()->Add(try_finally, zone());
}
void Parser::BuildIteratorCloseForCompletion(Scope* scope,
ZoneList<Statement*>* statements,
void Parser::BuildIteratorCloseForCompletion(ZoneList<Statement*>* statements,
Variable* iterator,
Expression* completion) {
//
@ -5322,7 +5317,7 @@ void Parser::BuildIteratorCloseForCompletion(Scope* scope,
Block* catch_block = factory()->NewBlock(nullptr, 0, false, nopos);
Scope* catch_scope = NewScopeWithParent(scope, CATCH_SCOPE);
Scope* catch_scope = NewScope(CATCH_SCOPE);
Variable* catch_variable =
catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR,
kCreatedInitialized, NORMAL_VARIABLE);
@ -5459,13 +5454,8 @@ Statement* Parser::FinalizeForOfStatement(ForOfStatement* loop,
Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
try_block->statements()->Add(loop, zone());
// The scope in which the parser creates this loop.
Scope* loop_scope = scope()->outer_scope();
DCHECK_EQ(loop_scope->scope_type(), BLOCK_SCOPE);
DCHECK_EQ(scope()->scope_type(), BLOCK_SCOPE);
FinalizeIteratorUse(loop_scope, var_completion, closing_condition,
loop->iterator(), try_block, final_loop);
FinalizeIteratorUse(var_completion, closing_condition, loop->iterator(),
try_block, final_loop);
}
return final_loop;

View File

@ -638,16 +638,14 @@ class V8_EXPORT_PRIVATE Parser : public NON_EXPORTED_BASE(ParserBase<Parser>) {
MessageTemplate::Template message,
const AstRawString* arg, int pos);
void FinalizeIteratorUse(Scope* use_scope, Variable* completion,
Expression* condition, Variable* iter,
Block* iterator_use, Block* result);
void FinalizeIteratorUse(Variable* completion, Expression* condition,
Variable* iter, Block* iterator_use, Block* result);
Statement* FinalizeForOfStatement(ForOfStatement* loop, Variable* completion,
int pos);
void BuildIteratorClose(ZoneList<Statement*>* statements, Variable* iterator,
Variable* input, Variable* output);
void BuildIteratorCloseForCompletion(Scope* scope,
ZoneList<Statement*>* statements,
void BuildIteratorCloseForCompletion(ZoneList<Statement*>* statements,
Variable* iterator,
Expression* completion);
Statement* CheckCallable(Variable* var, Expression* error, int pos);

View File

@ -37,12 +37,11 @@ void Parser::PatternRewriter::DeclareAndInitializeVariables(
void Parser::PatternRewriter::RewriteDestructuringAssignment(
Parser* parser, RewritableExpression* to_rewrite, Scope* scope) {
DCHECK(!scope->HasBeenRemoved());
PatternRewriter rewriter;
DCHECK(!to_rewrite->is_rewritten());
bool ok = true;
PatternRewriter rewriter;
rewriter.scope_ = scope;
rewriter.parser_ = parser;
rewriter.context_ = ASSIGNMENT;
@ -587,9 +586,8 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node,
Expression* closing_condition = factory()->NewUnaryOperation(
Token::NOT, factory()->NewVariableProxy(done), nopos);
parser_->FinalizeIteratorUse(scope(), completion, closing_condition, iterator,
block_, target);
parser_->FinalizeIteratorUse(completion, closing_condition, iterator, block_,
target);
block_ = target;
}

View File

@ -275,65 +275,65 @@ snippet: "
function* f() { for (let x of [42]) yield x }
f();
"
frame size: 17
frame size: 18
parameter count: 1
bytecode array length: 783
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(28),
B(ResumeGenerator), R(new_target),
B(Star), R(3),
B(Star), R(4),
B(LdaZero),
B(TestEqualStrict), R(3), U8(0),
B(TestEqualStrict), R(4), U8(0),
B(JumpIfTrue), U8(60),
B(LdaSmi), U8(1),
B(TestEqualStrict), R(3), U8(0),
B(TestEqualStrict), R(4), U8(0),
B(JumpIfTrueConstant), U8(3),
B(LdaSmi), U8(77),
B(Star), R(4),
B(CallRuntime), U16(Runtime::kAbort), R(4), U8(1),
B(Star), R(5),
B(CallRuntime), U16(Runtime::kAbort), R(5), U8(1),
B(LdaSmi), U8(-2),
B(Star), R(3),
B(Star), R(4),
B(CreateFunctionContext), U8(9),
B(PushContext), R(0),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(4),
/* 11 E> */ B(StackCheck),
B(Mov), R(context), R(6),
B(Mov), R(context), R(7),
B(LdaCurrentContextSlot), U8(4),
B(Star), R(8),
B(Mov), R(closure), R(7),
/* 11 E> */ B(CallRuntime), U16(Runtime::kCreateJSGeneratorObject), R(7), U8(2),
B(Star), R(9),
B(Mov), R(closure), R(8),
/* 11 E> */ B(CallRuntime), U16(Runtime::kCreateJSGeneratorObject), R(8), U8(2),
B(StaCurrentContextSlot), U8(5),
B(Star), R(7),
B(LdaCurrentContextSlot), U8(5),
B(Star), R(8),
B(LdaCurrentContextSlot), U8(5),
B(Star), R(9),
B(LdaZero),
B(SuspendGenerator), R(8),
B(Ldar), R(7),
B(SuspendGenerator), R(9),
B(Ldar), R(8),
/* 44 S> */ B(Return),
B(LdaSmi), U8(-2),
B(Star), R(3),
B(CallRuntime), U16(Runtime::k_GeneratorGetInputOrDebugPos), R(8), U8(1),
B(Star), R(9),
B(CallRuntime), U16(Runtime::k_GeneratorGetResumeMode), R(8), U8(1),
B(Star), R(4),
B(CallRuntime), U16(Runtime::k_GeneratorGetInputOrDebugPos), R(9), U8(1),
B(Star), R(10),
B(CallRuntime), U16(Runtime::k_GeneratorGetResumeMode), R(9), U8(1),
B(Star), R(11),
B(LdaZero),
B(TestEqualStrict), R(10), U8(0),
B(TestEqualStrict), R(11), U8(0),
B(JumpIfTrue), U8(32),
B(LdaSmi), U8(2),
B(TestEqualStrict), R(10), U8(0),
B(TestEqualStrict), R(11), U8(0),
B(JumpIfTrue), U8(22),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(12),
B(Mov), R(9), R(11),
B(CallRuntime), U16(Runtime::k_CreateIterResultObject), R(11), U8(2),
B(Star), R(5),
B(Star), R(13),
B(Mov), R(10), R(12),
B(CallRuntime), U16(Runtime::k_CreateIterResultObject), R(12), U8(2),
B(Star), R(6),
B(LdaZero),
B(Star), R(4),
B(Star), R(5),
B(JumpConstant), U8(19),
B(Ldar), R(9),
B(Ldar), R(10),
/* 11 E> */ B(Throw),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
@ -342,44 +342,44 @@ bytecodes: [
B(StaCurrentContextSlot), U8(4),
B(LdaZero),
B(StaContextSlot), R(1), U8(9), U8(0),
B(Mov), R(context), R(9),
B(Mov), R(context), R(10),
B(Mov), R(context), R(11),
/* 30 S> */ B(CreateArrayLiteral), U8(1), U8(0), U8(9),
B(Star), R(12),
B(Star), R(13),
B(LdaConstant), U8(2),
/* 30 E> */ B(LdaKeyedProperty), R(12), U8(4),
B(Star), R(11),
/* 30 E> */ B(CallProperty), R(11), R(12), U8(1), U8(2),
/* 30 E> */ B(LdaKeyedProperty), R(13), U8(4),
B(Star), R(12),
/* 30 E> */ B(CallProperty), R(12), R(13), U8(1), U8(2),
/* 30 E> */ B(StaContextSlot), R(1), U8(7), U8(0),
B(LdaSmi), U8(-2),
B(TestEqual), R(3), U8(0),
B(TestEqual), R(4), U8(0),
B(JumpIfTrue), U8(18),
B(LdaSmi), U8(1),
B(TestEqualStrict), R(3), U8(0),
B(TestEqualStrict), R(4), U8(0),
B(JumpIfTrueConstant), U8(8),
B(LdaSmi), U8(77),
B(Star), R(11),
B(CallRuntime), U16(Runtime::kAbort), R(11), U8(1),
/* 27 S> */ B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(13),
B(LdaNamedProperty), R(13), U8(4), U8(8),
B(Star), R(12),
/* 27 E> */ B(CallProperty), R(12), R(13), U8(1), U8(6),
B(CallRuntime), U16(Runtime::kAbort), R(12), U8(1),
/* 27 S> */ B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(14),
B(LdaNamedProperty), R(14), U8(4), U8(8),
B(Star), R(13),
/* 27 E> */ B(CallProperty), R(13), R(14), U8(1), U8(6),
/* 27 E> */ B(StaContextSlot), R(1), U8(8), U8(0),
B(Star), R(11),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(11), U8(1),
B(Star), R(12),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(12), U8(1),
B(ToBooleanLogicalNot),
B(JumpIfFalse), U8(13),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(11),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(11), U8(1),
B(Star), R(12),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(12), U8(1),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(11),
B(LdaNamedProperty), R(11), U8(5), U8(10),
B(Star), R(12),
B(LdaNamedProperty), R(12), U8(5), U8(10),
B(JumpIfToBooleanTrueConstant), U8(9),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(11),
B(LdaNamedProperty), R(11), U8(6), U8(12),
B(Star), R(12),
B(LdaNamedProperty), R(12), U8(6), U8(12),
B(StaContextSlot), R(1), U8(10), U8(0),
B(LdaSmi), U8(2),
B(StaContextSlot), R(1), U8(9), U8(0),
@ -394,215 +394,215 @@ bytecodes: [
B(LdaContextSlot), R(1), U8(6), U8(0),
B(StaCurrentContextSlot), U8(4),
/* 36 S> */ B(LdaCurrentContextSlot), U8(4),
B(Star), R(11),
B(Star), R(12),
B(LdaFalse),
B(Star), R(13),
B(CallRuntime), U16(Runtime::k_CreateIterResultObject), R(12), U8(2),
B(Star), R(12),
B(CallRuntime), U16(Runtime::k_CreateIterResultObject), R(11), U8(2),
B(Star), R(11),
B(LdaContextSlot), R(1), U8(5), U8(0),
B(Star), R(12),
B(Star), R(13),
B(LdaSmi), U8(1),
B(SuspendGenerator), R(12),
B(Ldar), R(11),
B(SuspendGenerator), R(13),
B(Ldar), R(12),
/* 44 S> */ B(Return),
B(LdaSmi), U8(-2),
B(Star), R(3),
B(CallRuntime), U16(Runtime::k_GeneratorGetInputOrDebugPos), R(12), U8(1),
B(Star), R(13),
B(CallRuntime), U16(Runtime::k_GeneratorGetResumeMode), R(12), U8(1),
B(Star), R(4),
B(CallRuntime), U16(Runtime::k_GeneratorGetInputOrDebugPos), R(13), U8(1),
B(Star), R(14),
B(CallRuntime), U16(Runtime::k_GeneratorGetResumeMode), R(13), U8(1),
B(Star), R(15),
B(LdaZero),
B(TestEqualStrict), R(14), U8(0),
B(TestEqualStrict), R(15), U8(0),
B(JumpIfTrue), U8(44),
B(LdaSmi), U8(2),
B(TestEqualStrict), R(14), U8(0),
B(TestEqualStrict), R(15), U8(0),
B(JumpIfTrue), U8(34),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(16),
B(Mov), R(13), R(15),
B(CallRuntime), U16(Runtime::k_CreateIterResultObject), R(15), U8(2),
B(Star), R(17),
B(Mov), R(14), R(16),
B(CallRuntime), U16(Runtime::k_CreateIterResultObject), R(16), U8(2),
B(PopContext), R(2),
B(PopContext), R(2),
B(PopContext), R(2),
B(PopContext), R(2),
B(PopContext), R(2),
B(PopContext), R(2),
B(Star), R(8),
B(Star), R(9),
B(LdaZero),
B(Star), R(7),
B(Star), R(8),
B(Jump), U8(74),
B(Ldar), R(13),
B(Ldar), R(14),
/* 36 E> */ B(Throw),
B(PopContext), R(2),
B(LdaZero),
B(StaContextSlot), R(1), U8(9), U8(0),
B(Wide), B(JumpLoop), U16(-221), U16(0),
B(Jump), U8(44),
B(Star), R(11),
B(Star), R(12),
B(Ldar), R(closure),
B(CreateCatchContext), R(11), U8(10), U8(11),
B(Star), R(10),
B(PushContext), R(2),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(CreateCatchContext), R(12), U8(10), U8(11),
B(Star), R(11),
B(PushContext), R(2),
B(LdaContextSlot), R(0), U8(9), U8(0),
B(Star), R(12),
B(LdaSmi), U8(2),
B(TestEqualStrict), R(11), U8(14),
B(TestEqualStrict), R(12), U8(14),
B(JumpIfFalse), U8(8),
B(LdaSmi), U8(1),
B(StaContextSlot), R(1), U8(9), U8(0),
B(StaContextSlot), R(0), U8(9), U8(0),
B(LdaCurrentContextSlot), U8(4),
B(Star), R(11),
B(CallRuntime), U16(Runtime::kReThrow), R(11), U8(1),
B(Star), R(12),
B(CallRuntime), U16(Runtime::kReThrow), R(12), U8(1),
B(PopContext), R(2),
B(LdaSmi), U8(-1),
B(Star), R(7),
B(Jump), U8(8),
B(Star), R(8),
B(Jump), U8(8),
B(Star), R(9),
B(LdaSmi), U8(1),
B(Star), R(7),
B(Star), R(8),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(9),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(10),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(11),
B(LdaZero),
B(TestEqualStrict), R(10), U8(15),
B(TestEqualStrict), R(11), U8(15),
B(JumpIfTrueConstant), U8(17),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(10),
B(Star), R(11),
B(LdaUndefined),
B(TestEqualStrict), R(10), U8(16),
B(TestEqualStrict), R(11), U8(16),
B(JumpIfTrueConstant), U8(18),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(10),
B(LdaNamedProperty), R(10), U8(12), U8(17),
B(Star), R(11),
B(LdaNamedProperty), R(11), U8(12), U8(17),
B(StaContextSlot), R(1), U8(11), U8(0),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(Star), R(10),
B(Star), R(11),
B(LdaNull),
B(TestEqual), R(10), U8(19),
B(TestEqual), R(11), U8(19),
B(JumpIfFalse), U8(4),
B(JumpConstant), U8(16),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(10),
B(Star), R(11),
B(LdaSmi), U8(1),
B(TestEqualStrict), R(10), U8(20),
B(TestEqualStrict), R(11), U8(20),
B(JumpIfFalse), U8(75),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(TypeOf),
B(Star), R(10),
B(Star), R(11),
B(LdaConstant), U8(13),
B(TestEqualStrict), R(10), U8(21),
B(TestEqualStrict), R(11), U8(21),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), U16(130),
B(Star), R(10),
B(LdaConstant), U8(14),
B(Star), R(11),
B(CallRuntime), U16(Runtime::kNewTypeError), R(10), U8(2),
B(LdaConstant), U8(14),
B(Star), R(12),
B(CallRuntime), U16(Runtime::kNewTypeError), R(11), U8(2),
B(Throw),
B(Mov), R(context), R(10),
B(Mov), R(context), R(11),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(Star), R(12),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(13),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(12), U8(2),
B(Jump), U8(20),
B(Star), R(12),
B(Ldar), R(closure),
B(CreateCatchContext), R(12), U8(10), U8(15),
B(Star), R(11),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(11),
B(PushContext), R(2),
B(PopContext), R(2),
B(Jump), U8(47),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(Star), R(11),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(12),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(11), U8(2),
B(Jump), U8(20),
B(Star), R(11),
B(Ldar), R(closure),
B(CreateCatchContext), R(11), U8(10), U8(15),
B(Star), R(10),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(10),
B(PushContext), R(2),
B(PopContext), R(2),
B(Jump), U8(47),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(Star), R(10),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(11),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(10), U8(2),
B(StaContextSlot), R(1), U8(12), U8(0),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(10),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(10), U8(1),
B(Star), R(11),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(11), U8(1),
B(JumpIfToBooleanFalse), U8(4),
B(Jump), U8(13),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(10),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(10), U8(1),
B(Ldar), R(9),
B(Star), R(11),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(11), U8(1),
B(Ldar), R(10),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrict), R(7), U8(0),
B(TestEqualStrict), R(8), U8(0),
B(JumpIfTrue), U8(11),
B(LdaSmi), U8(1),
B(TestEqualStrict), R(7), U8(0),
B(TestEqualStrict), R(8), U8(0),
B(JumpIfTrue), U8(17),
B(Jump), U8(28),
B(PopContext), R(1),
B(PopContext), R(1),
B(LdaSmi), U8(1),
B(Star), R(4),
B(Mov), R(8), R(5),
B(Star), R(5),
B(Mov), R(9), R(6),
B(Jump), U8(48),
B(PopContext), R(1),
B(PopContext), R(1),
B(LdaSmi), U8(2),
B(Star), R(4),
B(Mov), R(8), R(5),
B(Star), R(5),
B(Mov), R(9), R(6),
B(Jump), U8(35),
B(PopContext), R(1),
B(LdaUndefined),
B(Star), R(7),
B(LdaTrue),
B(Star), R(8),
B(CallRuntime), U16(Runtime::k_CreateIterResultObject), R(7), U8(2),
B(Star), R(5),
B(LdaTrue),
B(Star), R(9),
B(CallRuntime), U16(Runtime::k_CreateIterResultObject), R(8), U8(2),
B(Star), R(6),
B(LdaSmi), U8(3),
B(Star), R(4),
B(Star), R(5),
B(Jump), U8(14),
B(LdaSmi), U8(-1),
B(Star), R(4),
B(Jump), U8(8),
B(Star), R(5),
B(Jump), U8(8),
B(Star), R(6),
B(LdaSmi), U8(4),
B(Star), R(4),
B(Star), R(5),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(6),
B(LdaCurrentContextSlot), U8(5),
B(Star), R(7),
B(CallRuntime), U16(Runtime::k_GeneratorClose), R(7), U8(1),
B(Ldar), R(6),
B(LdaCurrentContextSlot), U8(5),
B(Star), R(8),
B(CallRuntime), U16(Runtime::k_GeneratorClose), R(8), U8(1),
B(Ldar), R(7),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrict), R(4), U8(0),
B(TestEqualStrict), R(5), U8(0),
B(JumpIfTrue), U8(32),
B(LdaSmi), U8(1),
B(TestEqualStrict), R(4), U8(0),
B(TestEqualStrict), R(5), U8(0),
B(JumpIfTrue), U8(28),
B(LdaSmi), U8(2),
B(TestEqualStrict), R(4), U8(0),
B(TestEqualStrict), R(5), U8(0),
B(JumpIfTrue), U8(24),
B(LdaSmi), U8(3),
B(TestEqualStrict), R(4), U8(0),
B(TestEqualStrict), R(5), U8(0),
B(JumpIfTrue), U8(20),
B(LdaSmi), U8(4),
B(TestEqualStrict), R(4), U8(0),
B(TestEqualStrict), R(5), U8(0),
B(JumpIfTrue), U8(16),
B(Jump), U8(17),
B(Ldar), R(5),
B(Ldar), R(6),
/* 44 S> */ B(Return),
B(Ldar), R(5),
B(Ldar), R(6),
/* 44 S> */ B(Return),
B(Ldar), R(5),
B(Ldar), R(6),
B(ReThrow),
B(Ldar), R(5),
B(Ldar), R(6),
/* 44 S> */ B(Return),
B(Ldar), R(5),
B(Ldar), R(6),
B(ReThrow),
B(LdaUndefined),
/* 44 S> */ B(Return),

View File

@ -1,35 +0,0 @@
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var iter = {}
iter[Symbol.iterator] = () => ({
next: () => ({}),
return: () => {throw 666}
});
function* foo() {
for (let x of iter) {throw 42}
}
assertThrowsEquals(() => foo().next(), 42);
function* bar() {
let x;
{ let gaga = () => {x};
[[x]] = iter;
}
}
assertThrows(() => bar().next(), TypeError);
function baz() {
let x;
{ let gaga = () => {x};
let gugu = () => {gaga};
[[x]] = iter;
}
}
assertThrows(baz, TypeError);