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:
parent
f658e41d86
commit
7edbd535a9
@ -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());
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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),
|
||||
|
@ -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);
|
Loading…
Reference in New Issue
Block a user