Commit 267115da authored by Caitlin Potter's avatar Caitlin Potter Committed by Commit Bot

[parser] avoid complex for-loop desugaring when possible

let/const declarations in "standard" C-style for-loops have
some complex desugaring to accommodate the case where loop
loop variables may be captured. This slows down the baseline
performance of for-loops with let variables.

This change attempts to avoid this desugaring if it's known that
the loop variable is not captured at any point. A side effect of
this change is that let/const loop variables, when not captured
within the loop body, are not necessarily shown in the debugger,
similar to other stack-allocated vars.

BUG=v8:4762, v8:5460
R=marja@chromium.org, adamk@chromium.org, yangguo@chromium.org

Change-Id: I8dbe545a12c086f675972bdba60c94998268311a
Reviewed-on: https://chromium-review.googlesource.com/472247
Commit-Queue: Caitlin Potter <caitp@igalia.com>
Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Reviewed-by: 's avatarAdam Klein <adamk@chromium.org>
Reviewed-by: 's avatarMarja Hölttä <marja@chromium.org>
Cr-Commit-Position: refs/heads/master@{#44731}
parent 468ddfa6
...@@ -451,6 +451,30 @@ class ParserBase { ...@@ -451,6 +451,30 @@ class ParserBase {
next_function_is_likely_called_ = true; next_function_is_likely_called_ = true;
} }
void RecordFunctionOrEvalCall() { contains_function_or_eval_ = true; }
bool contains_function_or_eval() const {
return contains_function_or_eval_;
}
class FunctionOrEvalRecordingScope {
public:
explicit FunctionOrEvalRecordingScope(FunctionState* state)
: state_(state) {
prev_value_ = state->contains_function_or_eval_;
state->contains_function_or_eval_ = false;
}
~FunctionOrEvalRecordingScope() {
bool found = state_->contains_function_or_eval_;
if (!found) {
state_->contains_function_or_eval_ = prev_value_;
}
}
private:
FunctionState* state_;
bool prev_value_;
};
private: private:
void AddDestructuringAssignment(DestructuringAssignment pair) { void AddDestructuringAssignment(DestructuringAssignment pair) {
destructuring_assignments_to_rewrite_.Add(pair, scope_->zone()); destructuring_assignments_to_rewrite_.Add(pair, scope_->zone());
...@@ -485,6 +509,9 @@ class ParserBase { ...@@ -485,6 +509,9 @@ class ParserBase {
bool next_function_is_likely_called_; bool next_function_is_likely_called_;
bool previous_function_was_likely_called_; bool previous_function_was_likely_called_;
// Track if a function or eval occurs within this FunctionState
bool contains_function_or_eval_;
friend Impl; friend Impl;
}; };
...@@ -656,6 +683,10 @@ class ParserBase { ...@@ -656,6 +683,10 @@ class ParserBase {
if (target_zone == nullptr) target_zone = zone(); if (target_zone == nullptr) target_zone = zone();
DeclarationScope* result = new (target_zone) DeclarationScope* result = new (target_zone)
DeclarationScope(zone(), scope(), FUNCTION_SCOPE, kind); DeclarationScope(zone(), scope(), FUNCTION_SCOPE, kind);
// Record presence of an inner function scope
function_state_->RecordFunctionOrEvalCall();
// TODO(verwaest): Move into the DeclarationScope constructor. // TODO(verwaest): Move into the DeclarationScope constructor.
if (!IsArrowFunction(kind)) { if (!IsArrowFunction(kind)) {
result->DeclareDefaultFunctionVariables(ast_value_factory()); result->DeclareDefaultFunctionVariables(ast_value_factory());
...@@ -1340,6 +1371,7 @@ class ParserBase { ...@@ -1340,6 +1371,7 @@ class ParserBase {
if (impl()->IsIdentifier(expression) && if (impl()->IsIdentifier(expression) &&
impl()->IsEval(impl()->AsIdentifier(expression))) { impl()->IsEval(impl()->AsIdentifier(expression))) {
scope->RecordEvalCall(); scope->RecordEvalCall();
function_state_->RecordFunctionOrEvalCall();
if (is_sloppy(scope->language_mode())) { if (is_sloppy(scope->language_mode())) {
// For sloppy scopes we also have to record the call at function level, // For sloppy scopes we also have to record the call at function level,
// in case it includes declarations that will be hoisted. // in case it includes declarations that will be hoisted.
...@@ -1534,7 +1566,8 @@ ParserBase<Impl>::FunctionState::FunctionState( ...@@ -1534,7 +1566,8 @@ ParserBase<Impl>::FunctionState::FunctionState(
non_patterns_to_rewrite_(0, scope->zone()), non_patterns_to_rewrite_(0, scope->zone()),
reported_errors_(16, scope->zone()), reported_errors_(16, scope->zone()),
next_function_is_likely_called_(false), next_function_is_likely_called_(false),
previous_function_was_likely_called_(false) { previous_function_was_likely_called_(false),
contains_function_or_eval_(false) {
*function_state_stack = this; *function_state_stack = this;
if (outer_function_state_) { if (outer_function_state_) {
outer_function_state_->previous_function_was_likely_called_ = outer_function_state_->previous_function_was_likely_called_ =
...@@ -5471,6 +5504,8 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseTryStatement( ...@@ -5471,6 +5504,8 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseTryStatement(
template <typename Impl> template <typename Impl>
typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseForStatement( typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseForStatement(
ZoneList<const AstRawString*>* labels, bool* ok) { ZoneList<const AstRawString*>* labels, bool* ok) {
typename FunctionState::FunctionOrEvalRecordingScope recording_scope(
function_state_);
int stmt_pos = peek_position(); int stmt_pos = peek_position();
ForInfo for_info(this); ForInfo for_info(this);
bool bound_names_are_lexical = false; bool bound_names_are_lexical = false;
...@@ -5480,7 +5515,6 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseForStatement( ...@@ -5480,7 +5515,6 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseForStatement(
Expect(Token::FOR, CHECK_OK); Expect(Token::FOR, CHECK_OK);
Expect(Token::LPAREN, CHECK_OK); Expect(Token::LPAREN, CHECK_OK);
scope()->set_start_position(scanner()->location().beg_pos); scope()->set_start_position(scanner()->location().beg_pos);
scope()->set_is_hidden();
StatementT init = impl()->NullStatement(); StatementT init = impl()->NullStatement();
...@@ -5538,6 +5572,7 @@ typename ParserBase<Impl>::StatementT ...@@ -5538,6 +5572,7 @@ typename ParserBase<Impl>::StatementT
ParserBase<Impl>::ParseForEachStatementWithDeclarations( ParserBase<Impl>::ParseForEachStatementWithDeclarations(
int stmt_pos, ForInfo* for_info, ZoneList<const AstRawString*>* labels, int stmt_pos, ForInfo* for_info, ZoneList<const AstRawString*>* labels,
bool* ok) { bool* ok) {
scope()->set_is_hidden();
// Just one declaration followed by in/of. // Just one declaration followed by in/of.
if (for_info->parsing_result.declarations.length() != 1) { if (for_info->parsing_result.declarations.length() != 1) {
impl()->ReportMessageAt(for_info->parsing_result.bindings_loc, impl()->ReportMessageAt(for_info->parsing_result.bindings_loc,
...@@ -5618,6 +5653,7 @@ typename ParserBase<Impl>::StatementT ...@@ -5618,6 +5653,7 @@ typename ParserBase<Impl>::StatementT
ParserBase<Impl>::ParseForEachStatementWithoutDeclarations( ParserBase<Impl>::ParseForEachStatementWithoutDeclarations(
int stmt_pos, ExpressionT expression, int lhs_beg_pos, int lhs_end_pos, int stmt_pos, ExpressionT expression, int lhs_beg_pos, int lhs_end_pos,
ForInfo* for_info, ZoneList<const AstRawString*>* labels, bool* ok) { ForInfo* for_info, ZoneList<const AstRawString*>* labels, bool* ok) {
scope()->set_is_hidden();
// Initializer is reference followed by in/of. // Initializer is reference followed by in/of.
if (!expression->IsArrayLiteral() && !expression->IsObjectLiteral()) { if (!expression->IsArrayLiteral() && !expression->IsObjectLiteral()) {
expression = impl()->CheckAndRewriteReferenceExpression( expression = impl()->CheckAndRewriteReferenceExpression(
...@@ -5701,15 +5737,15 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStandardForLoop( ...@@ -5701,15 +5737,15 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStandardForLoop(
body = ParseStatement(nullptr, CHECK_OK); body = ParseStatement(nullptr, CHECK_OK);
} }
if (bound_names_are_lexical && for_info->bound_names.length() > 0) { scope()->set_end_position(scanner()->location().end_pos);
auto result = impl()->DesugarLexicalBindingsInForStatement( inner_scope->set_end_position(scanner()->location().end_pos);
if (bound_names_are_lexical && for_info->bound_names.length() > 0 &&
(is_resumable() || function_state_->contains_function_or_eval())) {
scope()->set_is_hidden();
return impl()->DesugarLexicalBindingsInForStatement(
loop, init, cond, next, body, inner_scope, *for_info, CHECK_OK); loop, init, cond, next, body, inner_scope, *for_info, CHECK_OK);
scope()->set_end_position(scanner()->location().end_pos);
inner_scope->set_end_position(scanner()->location().end_pos);
return result;
} }
scope()->set_end_position(scanner()->location().end_pos);
Scope* for_scope = scope()->FinalizeBlockScope(); Scope* for_scope = scope()->FinalizeBlockScope();
if (for_scope != nullptr) { if (for_scope != nullptr) {
// Rewrite a for statement of the form // Rewrite a for statement of the form
...@@ -5733,6 +5769,7 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStandardForLoop( ...@@ -5733,6 +5769,7 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStandardForLoop(
BlockT block = factory()->NewBlock(nullptr, 2, false, kNoSourcePosition); BlockT block = factory()->NewBlock(nullptr, 2, false, kNoSourcePosition);
if (!impl()->IsNullStatement(init)) { if (!impl()->IsNullStatement(init)) {
block->statements()->Add(init, zone()); block->statements()->Add(init, zone());
init = impl()->NullStatement();
} }
block->statements()->Add(loop, zone()); block->statements()->Add(loop, zone());
block->set_scope(for_scope); block->set_scope(for_scope);
......
#
# Autogenerated by generate-bytecode-expectations.
#
---
wrap: no
test function name: f
---
snippet: "
function f(arr) {
for (let x of arr) { let y = x; }
}
f([1, 2, 3]);
"
frame size: 17
parameter count: 2
bytecode array length: 271
bytecodes: [
/* 10 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(2),
B(LdaZero),
B(Star), R(6),
B(Mov), R(context), R(13),
B(Mov), R(context), R(14),
/* 34 S> */ B(LdaNamedProperty), R(arg0), U8(0), U8(2),
B(Star), R(16),
B(CallProperty0), R(16), R(arg0), U8(4),
B(Mov), R(arg0), R(15),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
B(Star), R(4),
/* 31 S> */ B(LdaNamedProperty), R(4), U8(1), U8(8),
B(Star), R(15),
/* 31 E> */ B(CallProperty0), R(15), R(4), U8(6),
B(Star), R(5),
/* 31 E> */ B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(5), U8(1),
B(ToBooleanLogicalNot),
B(JumpIfFalse), U8(7),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(5), U8(1),
B(LdaNamedProperty), R(5), U8(2), U8(10),
B(JumpIfToBooleanTrue), U8(34),
B(LdaNamedProperty), R(5), U8(3), U8(12),
B(Star), R(7),
B(LdaSmi), I8(2),
B(Star), R(6),
B(Mov), R(7), R(3),
/* 20 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(1),
B(Mov), R(7), R(1),
B(LdaTheHole),
B(Star), R(0),
/* 49 S> */ B(Mov), R(7), R(0),
B(LdaZero),
B(Star), R(6),
B(JumpLoop), U8(59), I8(0),
B(Jump), U8(36),
B(Star), R(15),
B(Ldar), R(closure),
/* 49 E> */ B(CreateCatchContext), R(15), U8(4), U8(5),
B(Star), R(14),
B(PushContext), R(10),
B(LdaSmi), I8(2),
B(TestEqualStrict), R(6), U8(14),
B(JumpIfFalse), U8(6),
B(LdaSmi), I8(1),
B(Star), R(6),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(15),
B(CallRuntime), U16(Runtime::kReThrow), R(15), U8(1),
B(PopContext), R(10),
B(LdaSmi), I8(-1),
B(Star), R(11),
B(Jump), U8(7),
B(Star), R(12),
B(LdaZero),
B(Star), R(11),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(13),
B(LdaZero),
B(TestEqualStrict), R(6), U8(15),
B(JumpIfTrue), U8(104),
B(LdaNamedProperty), R(4), U8(6), U8(16),
B(Star), R(8),
B(TestUndetectable),
B(JumpIfFalse), U8(4),
B(Jump), U8(93),
B(LdaSmi), I8(1),
B(TestEqualStrict), R(6), U8(19),
B(JumpIfFalse), U8(61),
B(Ldar), R(8),
B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(132),
B(Star), R(14),
B(LdaConstant), U8(7),
B(Star), R(15),
B(CallRuntime), U16(Runtime::kNewTypeError), R(14), U8(2),
B(Throw),
B(Mov), R(context), R(14),
B(Mov), R(8), R(15),
B(Mov), R(4), R(16),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(15), U8(2),
B(Jump), U8(20),
B(Star), R(15),
B(Ldar), R(closure),
B(CreateCatchContext), R(15), U8(4), U8(8),
B(Star), R(14),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(14),
B(PushContext), R(10),
B(PopContext), R(10),
B(Jump), U8(27),
B(Mov), R(8), R(14),
B(Mov), R(4), R(15),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(14), U8(2),
B(Star), R(9),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(9), U8(1),
B(JumpIfToBooleanFalse), U8(4),
B(Jump), U8(7),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(9), U8(1),
B(Ldar), R(13),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(11),
B(JumpIfTrue), U8(4),
B(Jump), U8(5),
B(Ldar), R(12),
B(ReThrow),
B(LdaUndefined),
/* 54 S> */ B(Return),
]
constant pool: [
SYMBOL_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["next"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
FIXED_ARRAY_TYPE,
]
handlers: [
[10, 133, 139],
[13, 97, 99],
[199, 209, 211],
]
---
snippet: "
function f(arr) {
for (let x of arr) { eval('1'); }
}
f([1, 2, 3]);
"
frame size: 22
parameter count: 2
bytecode array length: 347
bytecodes: [
B(CreateFunctionContext), U8(4),
B(PushContext), R(7),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(5),
B(Ldar), R(arg0),
B(StaCurrentContextSlot), U8(4),
B(CreateMappedArguments),
B(StaCurrentContextSlot), U8(7),
B(Ldar), R(new_target),
B(StaCurrentContextSlot), U8(6),
/* 10 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(8),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaZero),
B(Star), R(3),
B(Mov), R(context), R(12),
B(Mov), R(context), R(13),
/* 34 S> */ B(LdaContextSlot), R(8), U8(4), U8(0),
B(Star), R(14),
B(LdaNamedProperty), R(14), U8(1), U8(2),
B(Star), R(15),
B(CallProperty0), R(15), R(14), U8(4),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
B(Star), R(1),
/* 31 S> */ B(LdaNamedProperty), R(1), U8(2), U8(8),
B(Star), R(14),
/* 31 E> */ B(CallProperty0), R(14), R(1), U8(6),
B(Star), R(2),
/* 31 E> */ B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(2), U8(1),
B(ToBooleanLogicalNot),
B(JumpIfFalse), U8(7),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(2), U8(1),
B(LdaNamedProperty), R(2), U8(3), U8(10),
B(JumpIfToBooleanTrue), U8(78),
B(LdaNamedProperty), R(2), U8(4), U8(12),
B(Star), R(4),
B(LdaSmi), I8(2),
B(Star), R(3),
B(Mov), R(4), R(0),
/* 20 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(5),
B(PushContext), R(9),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(Ldar), R(4),
B(StaCurrentContextSlot), U8(4),
/* 41 S> */ B(LdaLookupGlobalSlot), U8(6), U8(16), U8(1),
B(Star), R(14),
B(LdaConstant), U8(7),
B(Star), R(15),
B(LdaZero),
B(Star), R(19),
B(LdaSmi), I8(37),
B(Star), R(20),
B(LdaSmi), I8(41),
B(Star), R(21),
B(Mov), R(14), R(16),
B(Mov), R(15), R(17),
B(Mov), R(closure), R(18),
B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(16), U8(6),
B(Star), R(14),
/* 41 E> */ B(CallUndefinedReceiver1), R(14), R(15), U8(14),
B(PopContext), R(9),
B(LdaZero),
B(Star), R(3),
B(JumpLoop), U8(103), I8(0),
B(Jump), U8(36),
B(Star), R(14),
B(Ldar), R(closure),
B(CreateCatchContext), R(14), U8(8), U8(9),
B(Star), R(13),
B(PushContext), R(9),
B(LdaSmi), I8(2),
B(TestEqualStrict), R(3), U8(18),
B(JumpIfFalse), U8(6),
B(LdaSmi), I8(1),
B(Star), R(3),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(14),
B(CallRuntime), U16(Runtime::kReThrow), R(14), U8(1),
B(PopContext), R(9),
B(LdaSmi), I8(-1),
B(Star), R(10),
B(Jump), U8(7),
B(Star), R(11),
B(LdaZero),
B(Star), R(10),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(12),
B(LdaZero),
B(TestEqualStrict), R(3), U8(19),
B(JumpIfTrue), U8(104),
B(LdaNamedProperty), R(1), U8(10), U8(20),
B(Star), R(5),
B(TestUndetectable),
B(JumpIfFalse), U8(4),
B(Jump), U8(93),
B(LdaSmi), I8(1),
B(TestEqualStrict), R(3), U8(23),
B(JumpIfFalse), U8(61),
B(Ldar), R(5),
B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(132),
B(Star), R(13),
B(LdaConstant), U8(11),
B(Star), R(14),
B(CallRuntime), U16(Runtime::kNewTypeError), R(13), U8(2),
B(Throw),
B(Mov), R(context), R(13),
B(Mov), R(5), R(14),
B(Mov), R(1), R(15),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(14), U8(2),
B(Jump), U8(20),
B(Star), R(14),
B(Ldar), R(closure),
B(CreateCatchContext), R(14), U8(8), U8(12),
B(Star), R(13),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(13),
B(PushContext), R(9),
B(PopContext), R(9),
B(Jump), U8(27),
B(Mov), R(5), R(13),
B(Mov), R(1), R(14),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(13), U8(2),
B(Star), R(6),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(6), U8(1),
B(JumpIfToBooleanFalse), U8(4),
B(Jump), U8(7),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(6), U8(1),
B(Ldar), R(12),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(10),
B(JumpIfTrue), U8(4),
B(Jump), U8(7),
B(PopContext), R(7),
B(Ldar), R(11),
B(ReThrow),
B(PopContext), R(8),
B(LdaUndefined),
/* 54 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
SYMBOL_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["next"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["eval"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["1"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
FIXED_ARRAY_TYPE,
]
handlers: [
[35, 205, 211],
[38, 169, 171],
[271, 281, 283],
]
---
snippet: "
function f(arr) {
for (let x of arr) { (function() { return x; })(); }
}
f([1, 2, 3]);
"
frame size: 15
parameter count: 2
bytecode array length: 283
bytecodes: [
/* 10 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(0),
B(LdaZero),
B(Star), R(4),
B(Mov), R(context), R(11),
B(Mov), R(context), R(12),
/* 34 S> */ B(LdaNamedProperty), R(arg0), U8(0), U8(2),
B(Star), R(14),
B(CallProperty0), R(14), R(arg0), U8(4),
B(Mov), R(arg0), R(13),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
B(Star), R(2),
/* 31 S> */ B(LdaNamedProperty), R(2), U8(1), U8(8),
B(Star), R(13),
/* 31 E> */ B(CallProperty0), R(13), R(2), U8(6),
B(Star), R(3),
/* 31 E> */ B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(3), U8(1),
B(ToBooleanLogicalNot),
B(JumpIfFalse), U8(7),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(3), U8(1),
B(LdaNamedProperty), R(3), U8(2), U8(10),
B(JumpIfToBooleanTrue), U8(46),
B(LdaNamedProperty), R(3), U8(3), U8(12),
B(Star), R(5),
B(LdaSmi), I8(2),
B(Star), R(4),
B(Mov), R(5), R(1),
/* 20 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(4),
B(PushContext), R(8),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(Ldar), R(5),
B(StaCurrentContextSlot), U8(4),
/* 41 S> */ B(CreateClosure), U8(5), U8(16), U8(2),
B(Star), R(13),
/* 67 E> */ B(CallUndefinedReceiver0), R(13), U8(14),
B(PopContext), R(8),
B(LdaZero),
B(Star), R(4),
B(JumpLoop), U8(71), I8(0),
B(Jump), U8(36),
B(Star), R(13),
B(Ldar), R(closure),
B(CreateCatchContext), R(13), U8(6), U8(7),
B(Star), R(12),
B(PushContext), R(8),
B(LdaSmi), I8(2),
B(TestEqualStrict), R(4), U8(17),
B(JumpIfFalse), U8(6),
B(LdaSmi), I8(1),
B(Star), R(4),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kReThrow), R(13), U8(1),
B(PopContext), R(8),
B(LdaSmi), I8(-1),
B(Star), R(9),
B(Jump), U8(7),
B(Star), R(10),
B(LdaZero),
B(Star), R(9),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(11),
B(LdaZero),
B(TestEqualStrict), R(4), U8(18),
B(JumpIfTrue), U8(104),
B(LdaNamedProperty), R(2), U8(8), U8(19),
B(Star), R(6),
B(TestUndetectable),
B(JumpIfFalse), U8(4),
B(Jump), U8(93),
B(LdaSmi), I8(1),
B(TestEqualStrict), R(4), U8(22),
B(JumpIfFalse), U8(61),
B(Ldar), R(6),
B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(132),
B(Star), R(12),
B(LdaConstant), U8(9),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kNewTypeError), R(12), U8(2),
B(Throw),
B(Mov), R(context), R(12),
B(Mov), R(6), R(13),
B(Mov), R(2), R(14),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(13), U8(2),
B(Jump), U8(20),
B(Star), R(13),
B(Ldar), R(closure),
B(CreateCatchContext), R(13), U8(6), U8(10),
B(Star), R(12),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(12),
B(PushContext), R(8),
B(PopContext), R(8),
B(Jump), U8(27),
B(Mov), R(6), R(12),
B(Mov), R(2), R(13),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(12), U8(2),
B(Star), R(7),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(7), U8(1),
B(JumpIfToBooleanFalse), U8(4),
B(Jump), U8(7),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(7), U8(1),
B(Ldar), R(11),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(9),
B(JumpIfTrue), U8(4),
B(Jump), U8(5),
B(Ldar), R(10),
B(ReThrow),
B(LdaUndefined),
/* 73 S> */ B(Return),
]
constant pool: [
SYMBOL_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["next"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
FIXED_ARRAY_TYPE,
SHARED_FUNCTION_INFO_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
FIXED_ARRAY_TYPE,
]
handlers: [
[10, 145, 151],
[13, 109, 111],
[211, 221, 223],
]
---
snippet: "
function f(arr) {
for (let { x, y } of arr) { let z = x + y; }
}
f([{ x: 0, y: 3 }, { x: 1, y: 9 }, { x: -12, y: 17 }]);
"
frame size: 20
parameter count: 2
bytecode array length: 315
bytecodes: [
/* 10 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(3),
B(LdaTheHole),
B(Star), R(4),
B(LdaZero),
B(Star), R(9),
B(Mov), R(context), R(16),
B(Mov), R(context), R(17),
/* 41 S> */ B(LdaNamedProperty), R(arg0), U8(0), U8(2),
B(Star), R(19),
B(CallProperty0), R(19), R(arg0), U8(4),
B(Mov), R(arg0), R(18),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
B(Star), R(7),
/* 38 S> */ B(LdaNamedProperty), R(7), U8(1), U8(8),
B(Star), R(18),
/* 38 E> */ B(CallProperty0), R(18), R(7), U8(6),
B(Star), R(8),
/* 38 E> */ B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(8), U8(1),
B(ToBooleanLogicalNot),
B(JumpIfFalse), U8(7),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(8), U8(1),
B(LdaNamedProperty), R(8), U8(2), U8(10),
B(JumpIfToBooleanTrue), U8(75),
B(LdaNamedProperty), R(8), U8(3), U8(12),
B(Star), R(10),
B(LdaSmi), I8(2),
B(Star), R(9),
B(Mov), R(10), R(5),
/* 20 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(1),
B(LdaTheHole),
B(Star), R(2),
B(Mov), R(10), R(6),
B(Ldar), R(5),
B(JumpIfUndefined), U8(6),
B(Ldar), R(6),
B(JumpIfNotNull), U8(16),
B(LdaSmi), I8(61),
B(Star), R(18),
B(LdaConstant), U8(4),
B(Star), R(19),
B(CallRuntime), U16(Runtime::kNewTypeError), R(18), U8(2),
B(Throw),
/* 31 S> */ B(LdaNamedProperty), R(6), U8(5), U8(16),
B(Star), R(1),
/* 34 S> */ B(LdaNamedProperty), R(6), U8(6), U8(18),
B(Star), R(2),
B(LdaTheHole),
B(Star), R(0),
/* 58 S> */ B(Ldar), R(2),
/* 58 E> */ B(Add), R(1), U8(20),
B(Star), R(0),
B(LdaZero),
B(Star), R(9),
B(JumpLoop), U8(100), I8(0),
B(Jump), U8(36),
B(Star), R(18),
B(Ldar), R(closure),
/* 58 E> */ B(CreateCatchContext), R(18), U8(7), U8(8),
B(Star), R(17),
B(PushContext), R(13),
B(LdaSmi), I8(2),
B(TestEqualStrict), R(9), U8(21),
B(JumpIfFalse), U8(6),
B(LdaSmi), I8(1),
B(Star), R(9),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(18),
B(CallRuntime), U16(Runtime::kReThrow), R(18), U8(1),
B(PopContext), R(13),
B(LdaSmi), I8(-1),
B(Star), R(14),
B(Jump), U8(7),
B(Star), R(15),
B(LdaZero),
B(Star), R(14),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(16),
B(LdaZero),
B(TestEqualStrict), R(9), U8(22),
B(JumpIfTrue), U8(104),
B(LdaNamedProperty), R(7), U8(9), U8(23),
B(Star), R(11),
B(TestUndetectable),
B(JumpIfFalse), U8(4),
B(Jump), U8(93),
B(LdaSmi), I8(1),
B(TestEqualStrict), R(9), U8(26),
B(JumpIfFalse), U8(61),
B(Ldar), R(11),
B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(132),
B(Star), R(17),
B(LdaConstant), U8(4),
B(Star), R(18),
B(CallRuntime), U16(Runtime::kNewTypeError), R(17), U8(2),
B(Throw),
B(Mov), R(context), R(17),
B(Mov), R(11), R(18),
B(Mov), R(7), R(19),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(18), U8(2),
B(Jump), U8(20),
B(Star), R(18),
B(Ldar), R(closure),
B(CreateCatchContext), R(18), U8(7), U8(10),
B(Star), R(17),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(17),
B(PushContext), R(13),
B(PopContext), R(13),
B(Jump), U8(27),
B(Mov), R(11), R(17),
B(Mov), R(7), R(18),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(17), U8(2),
B(Star), R(12),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(12), U8(1),
B(JumpIfToBooleanFalse), U8(4),
B(Jump), U8(7),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(12), U8(1),
B(Ldar), R(16),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(14),
B(JumpIfTrue), U8(4),
B(Jump), U8(5),
B(Ldar), R(15),
B(ReThrow),
B(LdaUndefined),
/* 65 S> */ B(Return),
]
constant pool: [
SYMBOL_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["next"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["x"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["y"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
FIXED_ARRAY_TYPE,
]
handlers: [
[13, 177, 183],
[16, 141, 143],
[243, 253, 255],
]
---
snippet: "
function* f(arr) {
for (let x of arr) { let y = x; }
}
f([1, 2, 3]);
"
frame size: 15
parameter count: 2
bytecode array length: 626
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(27),
B(CallRuntime), U16(Runtime::k_GeneratorGetContext), R(new_target), U8(1),
B(PushContext), R(5),
B(ResumeGenerator), R(new_target),
B(Star), R(4),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(4),
B(JumpIfTrue), U8(58),
B(LdaSmi), I8(79),
B(Star), R(6),
B(CallRuntime), U16(Runtime::kAbort), R(6), U8(1),
B(LdaSmi), I8(-2),
B(Star), R(4),
B(CreateFunctionContext), U8(10),
B(PushContext), R(0),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(5),
B(Ldar), R(arg0),
B(StaCurrentContextSlot), U8(4),
/* 11 E> */ B(StackCheck),
B(Mov), R(context), R(8),
B(LdaImmutableCurrentContextSlot), U8(5),
B(Star), R(10),
B(Mov), R(closure), R(9),
/* 11 E> */ B(CallRuntime), U16(Runtime::kCreateJSGeneratorObject), R(9), U8(2),
B(StaCurrentContextSlot), U8(6),
B(Star), R(9),
B(LdaImmutableCurrentContextSlot), U8(6),
B(Star), R(10),
B(LdaZero),
B(SuspendGenerator), R(10), U8(0),
B(Ldar), R(9),
/* 55 S> */ B(Return),
B(LdaSmi), I8(-2),
B(Star), R(4),
B(CallRuntime), U16(Runtime::k_GeneratorGetInputOrDebugPos), R(10), U8(1),
B(Star), R(11),
B(CallRuntime), U16(Runtime::k_GeneratorGetResumeMode), R(10), U8(1),
B(Star), R(12),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(12),
B(JumpIfTrue), U8(30),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(12),
B(JumpIfTrue), U8(21),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(14),
B(Mov), R(11), R(13),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(13), U8(2),
B(Star), R(7),
B(LdaZero),
B(Star), R(6),
B(JumpConstant), U8(12),
B(Ldar), R(11),
/* 11 E> */ B(Throw),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(1),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaZero),
B(StaContextSlot), R(1), U8(10), U8(0),
B(Mov), R(context), R(11),
B(Mov), R(context), R(12),
/* 35 S> */ B(LdaImmutableContextSlot), R(1), U8(4), U8(0),
B(Star), R(13),
B(LdaNamedProperty), R(13), U8(1), U8(2),
B(Star), R(14),
B(CallProperty0), R(14), R(13), U8(4),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
/* 35 E> */ B(StaContextSlot), R(1), U8(8), U8(0),
/* 32 S> */ B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(14),
B(LdaNamedProperty), R(14), U8(2), U8(8),
B(Star), R(13),
/* 32 E> */ B(CallProperty0), R(13), R(14), U8(6),
/* 32 E> */ B(StaContextSlot), R(1), U8(9), U8(0),
B(Star), R(13),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(13), U8(1),
B(ToBooleanLogicalNot),
B(JumpIfFalse), U8(13),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(13), U8(1),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(13),
B(LdaNamedProperty), R(13), U8(3), U8(10),
B(JumpIfToBooleanTrue), U8(73),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(13),
B(LdaNamedProperty), R(13), U8(4), U8(12),
B(StaContextSlot), R(1), U8(11), U8(0),
B(LdaSmi), I8(2),
B(StaContextSlot), R(1), U8(10), U8(0),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(StaContextSlot), R(1), U8(7), U8(0),
/* 21 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(5),
B(PushContext), R(2),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(StaCurrentContextSlot), U8(4),
B(Ldar), R(closure),
B(CreateBlockContext), U8(6),
B(PushContext), R(3),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 50 S> */ B(LdaImmutableContextSlot), R(3), U8(4), U8(0),
/* 50 E> */ B(StaCurrentContextSlot), U8(4),
B(PopContext), R(3),
B(PopContext), R(2),
B(LdaZero),
B(StaContextSlot), R(1), U8(10), U8(0),
B(JumpLoop), U8(120), I8(0),
B(Jump), U8(44),
B(Star), R(13),
B(Ldar), R(closure),
B(CreateCatchContext), R(13), U8(7), U8(8),
B(Star), R(12),
B(PushContext), R(2),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(13),
B(LdaSmi), I8(2),
B(TestEqualStrict), R(13), U8(14),
B(JumpIfFalse), U8(8),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(10), U8(0),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kReThrow), R(13), U8(1),
B(PopContext), R(2),
B(LdaSmi), I8(-1),
B(Star), R(9),
B(Jump), U8(7),
B(Star), R(10),
B(LdaZero),
B(Star), R(9),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(11),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(12),
B(LdaZero),
B(TestEqualStrict), R(12), U8(15),
B(JumpIfTrue), U8(150),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(12),
B(LdaNamedProperty), R(12), U8(9), U8(16),
B(StaContextSlot), R(1), U8(12), U8(0),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(TestUndetectable),
B(JumpIfFalse), U8(4),
B(Jump), U8(127),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(12),
B(LdaSmi), I8(1),
B(TestEqualStrict), R(12), U8(19),
B(JumpIfFalse), U8(69),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(132),
B(Star), R(12),
B(LdaConstant), U8(10),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kNewTypeError), R(12), U8(2),
B(Throw),
B(Mov), R(context), R(12),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(13),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(14),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(13), U8(2),
B(Jump), U8(20),
B(Star), R(13),
B(Ldar), R(closure),
B(CreateCatchContext), R(13), U8(7), U8(11),
B(Star), R(12),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(12),
B(PushContext), R(2),
B(PopContext), R(2),
B(Jump), U8(47),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(12),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(13),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(12), U8(2),
B(StaContextSlot), R(1), U8(13), U8(0),
B(LdaContextSlot), R(1), U8(13), U8(0),
B(Star), R(12),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(12), U8(1),
B(JumpIfToBooleanFalse), U8(4),
B(Jump), U8(13),
B(LdaContextSlot), R(1), U8(13), U8(0),
B(Star), R(12),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(12), U8(1),
B(Ldar), R(11),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(9),
B(JumpIfTrue), U8(4),
B(Jump), U8(15),
B(PopContext), R(1),
B(PopContext), R(1),
B(LdaSmi), I8(1),
B(Star), R(6),
B(Mov), R(10), R(7),
B(Jump), U8(34),
B(PopContext), R(1),
B(LdaUndefined),
B(Star), R(9),
B(LdaTrue),
B(Star), R(10),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(9), U8(2),
B(Star), R(7),
B(LdaSmi), I8(2),
B(Star), R(6),
B(Jump), U8(14),
B(LdaSmi), I8(-1),
B(Star), R(6),
B(Jump), U8(8),
B(Star), R(7),
B(LdaSmi), I8(3),
B(Star), R(6),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(8),
B(LdaImmutableCurrentContextSlot), U8(6),
B(Star), R(9),
B(CallRuntime), U16(Runtime::k_GeneratorClose), R(9), U8(1),
B(Ldar), R(8),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(22),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(19),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(16),
B(LdaSmi), I8(3),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(13),
B(Jump), U8(14),
B(Ldar), R(7),
/* 55 S> */ B(Return),
B(Ldar), R(7),
B(ReThrow),
B(Ldar), R(7),
/* 55 S> */ B(Return),
B(Ldar), R(7),
B(ReThrow),
B(LdaUndefined),
/* 55 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
SYMBOL_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["next"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
FIXED_ARRAY_TYPE,
Smi [449],
]
handlers: [
[49, 559, 565],
[144, 341, 347],
[147, 297, 299],
[433, 449, 451],
]
---
snippet: "
function* f(arr) {
for (let x of arr) yield x;
}
f([1, 2, 3]);
"
frame size: 18
parameter count: 2
bytecode array length: 755
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(33),
B(CallRuntime), U16(Runtime::k_GeneratorGetContext), R(new_target), U8(1),
B(PushContext), R(4),
B(ResumeGenerator), R(new_target),
B(Star), R(3),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(64),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(156),
B(LdaSmi), I8(79),
B(Star), R(5),
B(CallRuntime), U16(Runtime::kAbort), R(5), U8(1),
B(LdaSmi), I8(-2),
B(Star), R(3),
B(CreateFunctionContext), U8(10),
B(PushContext), R(0),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(5),
B(Ldar), R(arg0),
B(StaCurrentContextSlot), U8(4),
/* 11 E> */ B(StackCheck),
B(Mov), R(context), R(7),
B(LdaImmutableCurrentContextSlot), U8(5),
B(Star), R(9),
B(Mov), R(closure), R(8),
/* 11 E> */ B(CallRuntime), U16(Runtime::kCreateJSGeneratorObject), R(8), U8(2),
B(StaCurrentContextSlot), U8(6),
B(Star), R(8),
B(LdaImmutableCurrentContextSlot), U8(6),
B(Star), R(9),
B(LdaZero),
B(SuspendGenerator), R(9), U8(0),
B(Ldar), R(8),
/* 49 S> */ B(Return),
B(LdaSmi), I8(-2),
B(Star), R(3),
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(TestEqualStrictNoFeedback), R(11),
B(JumpIfTrue), U8(30),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(11),
B(JumpIfTrue), U8(21),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(13),
B(Mov), R(10), R(12),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(12), U8(2),
B(Star), R(6),
B(LdaZero),
B(Star), R(5),
B(JumpConstant), U8(11),
B(Ldar), R(10),
/* 11 E> */ B(Throw),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(1),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaZero),
B(StaContextSlot), R(1), U8(10), U8(0),
B(Mov), R(context), R(10),
B(Mov), R(context), R(11),
/* 35 S> */ B(LdaImmutableContextSlot), R(1), U8(4), U8(0),
B(Star), R(12),
B(LdaNamedProperty), R(12), U8(1), U8(2),
B(Star), R(13),
B(CallProperty0), R(13), R(12), U8(4),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
/* 35 E> */ B(StaContextSlot), R(1), U8(8), U8(0),
B(LdaSmi), I8(-2),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(17),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(134),
B(LdaSmi), I8(79),
B(Star), R(12),
B(CallRuntime), U16(Runtime::kAbort), R(12), U8(1),
/* 32 S> */ B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(13),
B(LdaNamedProperty), R(13), U8(2), U8(8),
B(Star), R(12),
/* 32 E> */ B(CallProperty0), R(12), R(13), U8(6),
/* 32 E> */ B(StaContextSlot), R(1), U8(9), U8(0),
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(9), U8(0),
B(Star), R(12),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(12), U8(1),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(12),
B(LdaNamedProperty), R(12), U8(3), U8(10),
B(JumpIfToBooleanTrue), U8(146),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(12),
B(LdaNamedProperty), R(12), U8(4), U8(12),
B(StaContextSlot), R(1), U8(11), U8(0),
B(LdaSmi), I8(2),
B(StaContextSlot), R(1), U8(10), U8(0),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(StaContextSlot), R(1), U8(7), U8(0),
/* 21 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(5),
B(PushContext), R(2),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(StaCurrentContextSlot), U8(4),
/* 40 S> */ B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(12),
B(LdaFalse),
B(Star), R(13),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(12), U8(2),
B(Star), R(12),
B(LdaImmutableContextSlot), R(1), U8(6), U8(0),
B(Star), R(13),
B(LdaSmi), I8(1),
B(SuspendGenerator), R(13), U8(0),
B(Ldar), R(12),
/* 49 S> */ B(Return),
B(LdaSmi), I8(-2),
B(Star), R(3),
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(TestEqualStrictNoFeedback), R(15),
B(JumpIfTrue), U8(42),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(15),
B(JumpIfTrue), U8(33),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(17),
B(Mov), R(14), R(16),
B(InvokeIntrinsic), U8(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(9),
B(LdaZero),
B(Star), R(8),
B(Jump), U8(71),
B(Ldar), R(14),
/* 40 E> */ B(Throw),
B(PopContext), R(2),
B(LdaZero),
B(StaContextSlot), R(1), U8(10), U8(0),
B(JumpLoop), U8(214), I8(0),
B(Jump), U8(44),
B(Star), R(12),
B(Ldar), R(closure),
B(CreateCatchContext), R(12), U8(6), U8(7),
B(Star), R(11),
B(PushContext), R(2),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(12),
B(LdaSmi), I8(2),
B(TestEqualStrict), R(12), U8(14),
B(JumpIfFalse), U8(8),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(10), U8(0),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(12),
B(CallRuntime), U16(Runtime::kReThrow), R(12), U8(1),
B(PopContext), R(2),
B(LdaSmi), I8(-1),
B(Star), R(8),
B(Jump), U8(8),
B(Star), R(9),
B(LdaSmi), I8(1),
B(Star), R(8),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(10),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(11),
B(LdaZero),
B(TestEqualStrict), R(11), U8(15),
B(JumpIfTrue), U8(150),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(11),
B(LdaNamedProperty), R(11), U8(8), U8(16),
B(StaContextSlot), R(1), U8(12), U8(0),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(TestUndetectable),
B(JumpIfFalse), U8(4),
B(Jump), U8(127),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(11),
B(LdaSmi), I8(1),
B(TestEqualStrict), R(11), U8(19),
B(JumpIfFalse), U8(69),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(132),
B(Star), R(11),
B(LdaConstant), U8(9),
B(Star), R(12),
B(CallRuntime), U16(Runtime::kNewTypeError), R(11), U8(2),
B(Throw),
B(Mov), R(context), R(11),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(12),
B(LdaContextSlot), R(1), U8(8), 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(6), U8(10),
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(12), U8(0),
B(Star), R(11),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(12),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(11), U8(2),
B(StaContextSlot), R(1), U8(13), U8(0),
B(LdaContextSlot), R(1), U8(13), U8(0),
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(13), U8(0),
B(Star), R(11),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(11), U8(1),
B(Ldar), R(10),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(8),
B(JumpIfTrue), U8(10),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(8),
B(JumpIfTrue), U8(17),
B(Jump), U8(28),
B(PopContext), R(1),
B(PopContext), R(1),
B(LdaSmi), I8(1),
B(Star), R(5),
B(Mov), R(9), R(6),
B(Jump), U8(47),
B(PopContext), R(1),
B(PopContext), R(1),
B(LdaSmi), I8(2),
B(Star), R(5),
B(Mov), R(9), R(6),
B(Jump), U8(34),
B(PopContext), R(1),
B(LdaUndefined),
B(Star), R(8),
B(LdaTrue),
B(Star), R(9),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(8), U8(2),
B(Star), R(6),
B(LdaSmi), I8(3),
B(Star), R(5),
B(Jump), U8(14),
B(LdaSmi), I8(-1),
B(Star), R(5),
B(Jump), U8(8),
B(Star), R(6),
B(LdaSmi), I8(4),
B(Star), R(5),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(7),
B(LdaImmutableCurrentContextSlot), U8(6),
B(Star), R(8),
B(CallRuntime), U16(Runtime::k_GeneratorClose), R(8), U8(1),
B(Ldar), R(7),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(28),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(25),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(22),
B(LdaSmi), I8(3),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(19),
B(LdaSmi), I8(4),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(16),
B(Jump), U8(17),
B(Ldar), R(6),
/* 49 S> */ B(Return),
B(Ldar), R(6),
/* 49 S> */ B(Return),
B(Ldar), R(6),
B(ReThrow),
B(Ldar), R(6),
/* 49 S> */ B(Return),
B(Ldar), R(6),
B(ReThrow),
B(LdaUndefined),
/* 49 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
SYMBOL_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["next"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
FIXED_ARRAY_TYPE,
Smi [563],
]
handlers: [
[55, 679, 685],
[150, 441, 447],
[153, 397, 399],
[534, 550, 552],
]
---
snippet: "
async function f(arr) {
for (let x of arr) { let y = x; }
}
f([1, 2, 3]);
"
frame size: 16
parameter count: 2
bytecode array length: 619
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(22),
B(CallRuntime), U16(Runtime::k_GeneratorGetContext), R(new_target), U8(1),
B(PushContext), R(5),
B(ResumeGenerator), R(new_target),
B(Star), R(4),
B(LdaSmi), I8(79),
B(Star), R(6),
B(CallRuntime), U16(Runtime::kAbort), R(6), U8(1),
B(LdaSmi), I8(-2),
B(Star), R(4),
B(CreateFunctionContext), U8(11),
B(PushContext), R(0),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(5),
B(Ldar), R(arg0),
B(StaCurrentContextSlot), U8(4),
/* 16 E> */ B(StackCheck),
B(LdaImmutableCurrentContextSlot), U8(5),
B(Star), R(7),
B(Mov), R(closure), R(6),
B(CallRuntime), U16(Runtime::kCreateJSGeneratorObject), R(6), U8(2),
B(StaCurrentContextSlot), U8(6),
B(LdaUndefined),
B(Star), R(6),
B(CallJSRuntime), U8(%async_function_promise_create), R(6), U8(1),
B(StaCurrentContextSlot), U8(14),
B(Mov), R(context), R(8),
B(Mov), R(context), R(9),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(1),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaZero),
B(StaContextSlot), R(1), U8(10), U8(0),
B(Mov), R(context), R(12),
B(Mov), R(context), R(13),
/* 40 S> */ B(LdaImmutableContextSlot), R(1), U8(4), U8(0),
B(Star), R(14),
B(LdaNamedProperty), R(14), U8(1), U8(2),
B(Star), R(15),
B(CallProperty0), R(15), R(14), U8(4),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
/* 40 E> */ B(StaContextSlot), R(1), U8(8), U8(0),
/* 37 S> */ B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(15),
B(LdaNamedProperty), R(15), U8(2), U8(8),
B(Star), R(14),
/* 37 E> */ B(CallProperty0), R(14), R(15), U8(6),
/* 37 E> */ B(StaContextSlot), R(1), U8(9), U8(0),
B(Star), R(14),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(14), U8(1),
B(ToBooleanLogicalNot),
B(JumpIfFalse), U8(13),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(14),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(14), U8(1),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(14),
B(LdaNamedProperty), R(14), U8(3), U8(10),
B(JumpIfToBooleanTrue), U8(73),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(14),
B(LdaNamedProperty), R(14), U8(4), U8(12),
B(StaContextSlot), R(1), U8(11), U8(0),
B(LdaSmi), I8(2),
B(StaContextSlot), R(1), U8(10), U8(0),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(StaContextSlot), R(1), U8(7), U8(0),
/* 26 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(5),
B(PushContext), R(2),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(StaCurrentContextSlot), U8(4),
B(Ldar), R(closure),
B(CreateBlockContext), U8(6),
B(PushContext), R(3),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 55 S> */ B(LdaImmutableContextSlot), R(3), U8(4), U8(0),
/* 55 E> */ B(StaCurrentContextSlot), U8(4),
B(PopContext), R(3),
B(PopContext), R(2),
B(LdaZero),
B(StaContextSlot), R(1), U8(10), U8(0),
B(JumpLoop), U8(120), I8(0),
B(Jump), U8(48),
B(Star), R(14),
B(Ldar), R(closure),
B(CreateCatchContext), R(14), U8(7), U8(8),
B(Star), R(13),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(13),
B(PushContext), R(2),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(14),
B(LdaSmi), I8(2),
B(TestEqualStrict), R(14), U8(14),
B(JumpIfFalse), U8(8),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(10), U8(0),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(14),
B(CallRuntime), U16(Runtime::kReThrow), R(14), U8(1),
B(PopContext), R(2),
B(LdaSmi), I8(-1),
B(Star), R(10),
B(Jump), U8(7),
B(Star), R(11),
B(LdaZero),
B(Star), R(10),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(12),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(13),
B(LdaZero),
B(TestEqualStrict), R(13), U8(15),
B(JumpIfTrue), U8(150),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(13),
B(LdaNamedProperty), R(13), U8(9), U8(16),
B(StaContextSlot), R(1), U8(12), U8(0),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(TestUndetectable),
B(JumpIfFalse), U8(4),
B(Jump), U8(127),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(13),
B(LdaSmi), I8(1),
B(TestEqualStrict), R(13), U8(19),
B(JumpIfFalse), U8(69),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(132),
B(Star), R(13),
B(LdaConstant), U8(10),
B(Star), R(14),
B(CallRuntime), U16(Runtime::kNewTypeError), R(13), U8(2),
B(Throw),
B(Mov), R(context), R(13),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(14),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(15),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(14), U8(2),
B(Jump), U8(20),
B(Star), R(14),
B(Ldar), R(closure),
B(CreateCatchContext), R(14), U8(7), U8(11),
B(Star), R(13),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(13),
B(PushContext), R(2),
B(PopContext), R(2),
B(Jump), U8(47),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(13),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(14),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(13), U8(2),
B(StaContextSlot), R(1), U8(13), U8(0),
B(LdaContextSlot), R(1), U8(13), U8(0),
B(Star), R(13),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(13), U8(1),
B(JumpIfToBooleanFalse), U8(4),
B(Jump), U8(13),
B(LdaContextSlot), R(1), U8(13), U8(0),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(13), U8(1),
B(Ldar), R(12),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(10),
B(JumpIfTrue), U8(4),
B(Jump), U8(9),
B(PopContext), R(1),
B(PopContext), R(1),
B(Ldar), R(11),
B(ReThrow),
B(PopContext), R(1),
B(LdaUndefined),
B(Star), R(10),
B(LdaCurrentContextSlot), U8(14),
B(Star), R(11),
B(LdaUndefined),
B(Star), R(12),
B(CallJSRuntime), U8(%promise_resolve), R(10), U8(3),
B(LdaCurrentContextSlot), U8(14),
B(Star), R(7),
B(LdaZero),
B(Star), R(6),
B(Jump), U8(68),
B(Jump), U8(54),
B(Star), R(10),
B(Ldar), R(closure),
B(CreateCatchContext), R(10), U8(7), U8(12),
B(Star), R(9),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(9),
B(PushContext), R(1),
B(LdaUndefined),
B(Star), R(10),
B(LdaContextSlot), R(1), U8(14), U8(0),
B(Star), R(11),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(12),
B(LdaFalse),
B(Star), R(13),
B(CallJSRuntime), U8(%promise_internal_reject), R(10), U8(4),
B(LdaContextSlot), R(1), U8(14), U8(0),
B(PopContext), R(1),
B(PopContext), R(1),
B(Star), R(7),
B(LdaSmi), I8(1),
B(Star), R(6),
B(Jump), U8(14),
B(LdaSmi), I8(-1),
B(Star), R(6),
B(Jump), U8(8),
B(Star), R(7),
B(LdaSmi), I8(2),
B(Star), R(6),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(8),
B(LdaUndefined),
B(Star), R(9),
B(LdaCurrentContextSlot), U8(14),
B(Star), R(10),
B(CallJSRuntime), U8(%async_function_promise_release), R(9), U8(2),
B(Ldar), R(8),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(16),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(13),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(10),
B(Jump), U8(11),
B(Ldar), R(7),
/* 60 S> */ B(Return),
B(Ldar), R(7),
/* 60 S> */ B(Return),
B(Ldar), R(7),
B(ReThrow),
B(LdaUndefined),
/* 60 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
SYMBOL_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["next"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
]
handlers: [
[67, 559, 565],
[70, 505, 507],
[87, 288, 294],
[90, 240, 242],
[380, 396, 398],
]
---
snippet: "
async function f(arr) {
for (let x of arr) await x;
}
f([1, 2, 3]);
"
frame size: 19
parameter count: 2
bytecode array length: 773
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(27),
B(CallRuntime), U16(Runtime::k_GeneratorGetContext), R(new_target), U8(1),
B(PushContext), R(4),
B(ResumeGenerator), R(new_target),
B(Star), R(3),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(104),
B(LdaSmi), I8(79),
B(Star), R(5),
B(CallRuntime), U16(Runtime::kAbort), R(5), U8(1),
B(LdaSmi), I8(-2),
B(Star), R(3),
B(CreateFunctionContext), U8(12),
B(PushContext), R(0),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(5),
B(Ldar), R(arg0),
B(StaCurrentContextSlot), U8(4),
/* 16 E> */ B(StackCheck),
B(LdaImmutableCurrentContextSlot), U8(5),
B(Star), R(6),
B(Mov), R(closure), R(5),
B(CallRuntime), U16(Runtime::kCreateJSGeneratorObject), R(5), U8(2),
B(StaCurrentContextSlot), U8(6),
B(LdaUndefined),
B(Star), R(5),
B(CallJSRuntime), U8(%async_function_promise_create), R(5), U8(1),
B(StaCurrentContextSlot), U8(8),
B(Mov), R(context), R(7),
B(Mov), R(context), R(8),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(1),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaZero),
B(StaContextSlot), R(1), U8(12), U8(0),
B(Mov), R(context), R(11),
B(Mov), R(context), R(12),
/* 40 S> */ B(LdaImmutableContextSlot), R(1), U8(4), U8(0),
B(Star), R(13),
B(LdaNamedProperty), R(13), U8(1), U8(2),
B(Star), R(14),
B(CallProperty0), R(14), R(13), U8(4),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
/* 40 E> */ B(StaContextSlot), R(1), U8(10), U8(0),
B(LdaSmi), I8(-2),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(16),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(157),
B(LdaSmi), I8(79),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kAbort), R(13), U8(1),
/* 37 S> */ B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(14),
B(LdaNamedProperty), R(14), U8(2), U8(8),
B(Star), R(13),
/* 37 E> */ B(CallProperty0), R(13), R(14), U8(6),
/* 37 E> */ B(StaContextSlot), R(1), U8(11), U8(0),
B(Star), R(13),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(13), U8(1),
B(ToBooleanLogicalNot),
B(JumpIfFalse), U8(13),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(13), U8(1),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(Star), R(13),
B(LdaNamedProperty), R(13), U8(3), U8(10),
B(JumpIfToBooleanTrue), U8(169),
B(LdaContextSlot), R(1), U8(11), U8(0),
B(Star), R(13),
B(LdaNamedProperty), R(13), U8(4), U8(12),
B(StaContextSlot), R(1), U8(13), U8(0),
B(LdaSmi), I8(2),
B(StaContextSlot), R(1), U8(12), U8(0),
B(LdaContextSlot), R(1), U8(13), U8(0),
B(StaContextSlot), R(1), U8(9), U8(0),
/* 26 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(5),
B(PushContext), R(2),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(StaCurrentContextSlot), U8(4),
/* 51 S> */ B(LdaImmutableCurrentContextSlot), U8(4),
B(StaContextSlot), R(1), U8(7), U8(0),
/* 45 S> */ B(LdaUndefined),
B(Star), R(13),
B(LdaImmutableContextSlot), R(1), U8(6), U8(0),
B(Star), R(14),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(15),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(16),
B(CallJSRuntime), U8(%async_function_await_uncaught), R(13), U8(4),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(13),
B(LdaImmutableContextSlot), R(1), U8(6), U8(0),
B(Star), R(14),
B(LdaZero),
B(SuspendGenerator), R(14), U8(2),
B(Ldar), R(13),
/* 54 S> */ B(Return),
B(LdaSmi), I8(-2),
B(Star), R(3),
B(CallRuntime), U16(Runtime::k_GeneratorGetInputOrDebugPos), R(14), U8(1),
B(Star), R(15),
B(CallRuntime), U16(Runtime::k_GeneratorGetResumeMode), R(14), U8(1),
B(Star), R(16),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(16),
B(JumpIfTrue), U8(42),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(16),
B(JumpIfTrue), U8(33),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(18),
B(Mov), R(15), R(17),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(17), 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(10),
B(LdaZero),
B(Star), R(9),
B(Jump), U8(75),
B(Ldar), R(15),
B(ReThrow),
B(PopContext), R(2),
B(LdaZero),
B(StaContextSlot), R(1), U8(12), U8(0),
B(JumpLoop), U8(236), I8(0),
B(Jump), U8(48),
B(Star), R(13),
B(Ldar), R(closure),
B(CreateCatchContext), R(13), U8(6), U8(7),
B(Star), R(12),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(12),
B(PushContext), R(2),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(13),
B(LdaSmi), I8(2),
B(TestEqualStrict), R(13), U8(14),
B(JumpIfFalse), U8(8),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(12), U8(0),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kReThrow), R(13), U8(1),
B(PopContext), R(2),
B(LdaSmi), I8(-1),
B(Star), R(9),
B(Jump), U8(8),
B(Star), R(10),
B(LdaSmi), I8(1),
B(Star), R(9),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(11),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(12),
B(LdaZero),
B(TestEqualStrict), R(12), U8(15),
B(JumpIfTrue), U8(150),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(12),
B(LdaNamedProperty), R(12), U8(8), U8(16),
B(StaContextSlot), R(1), U8(14), U8(0),
B(LdaContextSlot), R(1), U8(14), U8(0),
B(TestUndetectable),
B(JumpIfFalse), U8(4),
B(Jump), U8(127),
B(LdaContextSlot), R(1), U8(12), U8(0),
B(Star), R(12),
B(LdaSmi), I8(1),
B(TestEqualStrict), R(12), U8(19),
B(JumpIfFalse), U8(69),
B(LdaContextSlot), R(1), U8(14), U8(0),
B(TestTypeOf), U8(5),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(132),
B(Star), R(12),
B(LdaConstant), U8(9),
B(Star), R(13),
B(CallRuntime), U16(Runtime::kNewTypeError), R(12), U8(2),
B(Throw),
B(Mov), R(context), R(12),
B(LdaContextSlot), R(1), U8(14), U8(0),
B(Star), R(13),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(14),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(13), U8(2),
B(Jump), U8(20),
B(Star), R(13),
B(Ldar), R(closure),
B(CreateCatchContext), R(13), U8(6), U8(10),
B(Star), R(12),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(12),
B(PushContext), R(2),
B(PopContext), R(2),
B(Jump), U8(47),
B(LdaContextSlot), R(1), U8(14), U8(0),
B(Star), R(12),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(13),
B(InvokeIntrinsic), U8(Runtime::k_Call), R(12), U8(2),
B(StaContextSlot), R(1), U8(15), U8(0),
B(LdaContextSlot), R(1), U8(15), U8(0),
B(Star), R(12),
B(InvokeIntrinsic), U8(Runtime::k_IsJSReceiver), R(12), U8(1),
B(JumpIfToBooleanFalse), U8(4),
B(Jump), U8(13),
B(LdaContextSlot), R(1), U8(15), U8(0),
B(Star), R(12),
B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), R(12), U8(1),
B(Ldar), R(11),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(9),
B(JumpIfTrue), U8(10),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(9),
B(JumpIfTrue), U8(20),
B(Jump), U8(25),
B(PopContext), R(1),
B(PopContext), R(1),
B(PopContext), R(1),
B(PopContext), R(1),
B(LdaZero),
B(Star), R(5),
B(Mov), R(10), R(6),
B(Jump), U8(101),
B(PopContext), R(1),
B(PopContext), R(1),
B(Ldar), R(10),
B(ReThrow),
B(PopContext), R(1),
B(LdaUndefined),
B(Star), R(9),
B(LdaCurrentContextSlot), U8(8),
B(Star), R(10),
B(LdaUndefined),
B(Star), R(11),
B(CallJSRuntime), U8(%promise_resolve), R(9), U8(3),
B(LdaCurrentContextSlot), U8(8),
B(Star), R(6),
B(LdaSmi), I8(1),
B(Star), R(5),
B(Jump), U8(68),
B(Jump), U8(54),
B(Star), R(9),
B(Ldar), R(closure),
B(CreateCatchContext), R(9), U8(6), U8(11),
B(Star), R(8),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(8),
B(PushContext), R(1),
B(LdaUndefined),
B(Star), R(9),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(10),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(11),
B(LdaFalse),
B(Star), R(12),
B(CallJSRuntime), U8(%promise_internal_reject), R(9), U8(4),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(PopContext), R(1),
B(PopContext), R(1),
B(Star), R(6),
B(LdaSmi), I8(2),
B(Star), R(5),
B(Jump), U8(14),
B(LdaSmi), I8(-1),
B(Star), R(5),
B(Jump), U8(8),
B(Star), R(6),
B(LdaSmi), I8(3),
B(Star), R(5),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(7),
B(LdaUndefined),
B(Star), R(8),
B(LdaCurrentContextSlot), U8(8),
B(Star), R(9),
B(CallJSRuntime), U8(%async_function_promise_release), R(8), U8(2),
B(Ldar), R(7),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(22),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(19),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(16),
B(LdaSmi), I8(3),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(13),
B(Jump), U8(14),
B(Ldar), R(6),
/* 54 S> */ B(Return),
B(Ldar), R(6),
/* 54 S> */ B(Return),
B(Ldar), R(6),
/* 54 S> */ B(Return),
B(Ldar), R(6),
B(ReThrow),
B(LdaUndefined),
/* 54 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
SYMBOL_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["next"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
]
handlers: [
[72, 704, 710],
[75, 650, 652],
[92, 409, 415],
[95, 361, 363],
[502, 518, 520],
]
#
# Autogenerated by generate-bytecode-expectations.
#
---
wrap: no
test function name: f
---
snippet: "
function f() {
for (let x = 0; x < 10; ++x) { let y = x; }
}
f();
"
frame size: 2
parameter count: 1
bytecode array length: 32
bytecodes: [
/* 10 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(1),
/* 30 S> */ B(LdaZero),
B(Star), R(1),
/* 35 S> */ B(LdaSmi), I8(10),
/* 35 E> */ B(TestLessThan), R(1), U8(2),
B(JumpIfFalse), U8(18),
/* 17 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(0),
/* 56 S> */ B(Mov), R(1), R(0),
/* 43 S> */ B(Ldar), R(0),
B(Inc), U8(3),
B(Star), R(1),
B(JumpLoop), U8(20), I8(0),
B(LdaUndefined),
/* 61 S> */ B(Return),
]
constant pool: [
]
handlers: [
]
---
snippet: "
function f() {
for (let x = 0; x < 10; ++x) { eval('1'); }
}
f();
"
frame size: 14
parameter count: 1
bytecode array length: 168
bytecodes: [
B(CreateFunctionContext), U8(3),
B(PushContext), R(3),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(4),
B(CreateMappedArguments),
B(StaCurrentContextSlot), U8(6),
B(Ldar), R(new_target),
B(StaCurrentContextSlot), U8(5),
/* 10 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(4),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 30 S> */ B(LdaZero),
/* 30 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaCurrentContextSlot), U8(4),
B(Star), R(0),
B(LdaSmi), I8(1),
B(Star), R(1),
/* 59 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(1),
B(PushContext), R(5),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(Ldar), R(0),
B(StaCurrentContextSlot), U8(4),
B(LdaSmi), I8(1),
B(TestEqual), R(1), U8(2),
B(JumpIfFalse), U8(7),
B(LdaZero),
B(Star), R(1),
B(Jump), U8(8),
/* 43 S> */ B(LdaCurrentContextSlot), U8(4),
B(Inc), U8(3),
/* 43 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaSmi), I8(1),
B(Star), R(2),
/* 35 S> */ B(LdaCurrentContextSlot), U8(4),
B(Star), R(6),
B(LdaSmi), I8(10),
/* 35 E> */ B(TestLessThan), R(6), U8(4),
B(JumpIfFalse), U8(4),
B(Jump), U8(6),
B(PopContext), R(5),
B(Jump), U8(77),
B(LdaSmi), I8(1),
B(TestEqual), R(2), U8(5),
B(JumpIfFalse), U8(54),
/* 17 E> */ B(StackCheck),
/* 48 S> */ B(LdaLookupGlobalSlot), U8(2), U8(8), U8(1),
B(Star), R(6),
B(LdaConstant), U8(3),
B(Star), R(7),
B(LdaZero),
B(Star), R(11),
B(LdaSmi), I8(31),
B(Star), R(12),
B(LdaSmi), I8(48),
B(Star), R(13),
B(Mov), R(6), R(8),
B(Mov), R(7), R(9),
B(Mov), R(closure), R(10),
B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(8), U8(6),
B(Star), R(6),
/* 48 E> */ B(CallUndefinedReceiver1), R(6), R(7), U8(6),
B(LdaZero),
B(Star), R(2),
B(LdaCurrentContextSlot), U8(4),
B(Star), R(0),
B(JumpLoop), U8(56), I8(1),
B(LdaSmi), I8(1),
/* 59 E> */ B(TestEqual), R(2), U8(10),
B(JumpIfFalse), U8(6),
B(PopContext), R(5),
B(Jump), U8(7),
B(PopContext), R(5),
B(JumpLoop), U8(125), I8(0),
B(PopContext), R(4),
B(LdaUndefined),
/* 61 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["eval"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["1"],
]
handlers: [
]
---
snippet: "
function f() {
for (let x = 0; x < 10; ++x) { (function() { return x; })(); }
}
f();
"
frame size: 6
parameter count: 1
bytecode array length: 111
bytecodes: [
/* 10 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(0),
/* 30 S> */ B(LdaZero),
B(Star), R(0),
B(Star), R(1),
B(LdaSmi), I8(1),
B(Star), R(2),
/* 78 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(4),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(Ldar), R(1),
B(StaCurrentContextSlot), U8(4),
B(LdaSmi), I8(1),
B(TestEqual), R(2), U8(2),
B(JumpIfFalse), U8(7),
B(LdaZero),
B(Star), R(2),
B(Jump), U8(8),
/* 43 S> */ B(LdaCurrentContextSlot), U8(4),
B(Inc), U8(3),
/* 43 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaSmi), I8(1),
B(Star), R(3),
/* 35 S> */ B(LdaCurrentContextSlot), U8(4),
B(Star), R(5),
B(LdaSmi), I8(10),
/* 35 E> */ B(TestLessThan), R(5), U8(4),
B(JumpIfFalse), U8(4),
B(Jump), U8(6),
B(PopContext), R(4),
B(Jump), U8(45),
B(LdaSmi), I8(1),
B(TestEqual), R(3), U8(5),
B(JumpIfFalse), U8(22),
/* 17 E> */ B(StackCheck),
/* 48 S> */ B(CreateClosure), U8(1), U8(8), U8(2),
B(Star), R(5),
/* 74 E> */ B(CallUndefinedReceiver0), R(5), U8(6),
B(LdaZero),
B(Star), R(3),
B(LdaCurrentContextSlot), U8(4),
B(Star), R(1),
B(JumpLoop), U8(24), I8(1),
B(LdaSmi), I8(1),
/* 78 E> */ B(TestEqual), R(3), U8(9),
B(JumpIfFalse), U8(6),
B(PopContext), R(4),
B(Jump), U8(7),
B(PopContext), R(4),
B(JumpLoop), U8(93), I8(0),
B(LdaUndefined),
/* 80 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]
---
snippet: "
function f() {
for (let { x, y } = { x: 0, y: 3 }; y > 0; --y) { let z = x + y; }
}
f();
"
frame size: 6
parameter count: 1
bytecode array length: 77
bytecodes: [
/* 10 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(1),
B(LdaTheHole),
B(Star), R(2),
B(CreateObjectLiteral), U8(0), U8(2), U8(1), R(4),
B(Mov), R(4), R(3),
B(Ldar), R(3),
B(JumpIfUndefined), U8(6),
B(Ldar), R(3),
B(JumpIfNotNull), U8(16),
B(LdaSmi), I8(61),
B(Star), R(4),
B(LdaConstant), U8(1),
B(Star), R(5),
B(CallRuntime), U16(Runtime::kNewTypeError), R(4), U8(2),
B(Throw),
/* 28 S> */ B(LdaNamedProperty), R(3), U8(2), U8(5),
B(Star), R(1),
/* 31 S> */ B(LdaNamedProperty), R(3), U8(3), U8(7),
B(Star), R(2),
/* 55 S> */ B(LdaZero),
/* 55 E> */ B(TestGreaterThan), R(2), U8(9),
B(JumpIfFalse), U8(22),
/* 17 E> */ B(StackCheck),
B(LdaTheHole),
B(Star), R(0),
/* 77 S> */ B(Ldar), R(2),
/* 77 E> */ B(Add), R(1), U8(11),
B(Star), R(0),
/* 62 S> */ B(Ldar), R(2),
B(Dec), U8(10),
B(Star), R(2),
B(JumpLoop), U8(23), I8(0),
B(LdaUndefined),
/* 84 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["x"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["y"],
]
handlers: [
]
---
snippet: "
function* f() {
for (let x = 0; x < 10; ++x) { let y = x; }
}
f();
"
frame size: 15
parameter count: 1
bytecode array length: 357
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(27),
B(CallRuntime), U16(Runtime::k_GeneratorGetContext), R(new_target), U8(1),
B(PushContext), R(5),
B(ResumeGenerator), R(new_target),
B(Star), R(4),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(4),
B(JumpIfTrue), U8(54),
B(LdaSmi), I8(79),
B(Star), R(6),
B(CallRuntime), U16(Runtime::kAbort), R(6), U8(1),
B(LdaSmi), I8(-2),
B(Star), R(4),
B(CreateFunctionContext), U8(5),
B(PushContext), R(0),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(4),
/* 11 E> */ B(StackCheck),
B(Mov), R(context), R(8),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(10),
B(Mov), R(closure), R(9),
/* 11 E> */ B(CallRuntime), U16(Runtime::kCreateJSGeneratorObject), R(9), U8(2),
B(StaCurrentContextSlot), U8(5),
B(Star), R(9),
B(LdaImmutableCurrentContextSlot), U8(5),
B(Star), R(10),
B(LdaZero),
B(SuspendGenerator), R(10), U8(0),
B(Ldar), R(9),
/* 62 S> */ B(Return),
B(LdaSmi), I8(-2),
B(Star), R(4),
B(CallRuntime), U16(Runtime::k_GeneratorGetInputOrDebugPos), R(10), U8(1),
B(Star), R(11),
B(CallRuntime), U16(Runtime::k_GeneratorGetResumeMode), R(10), U8(1),
B(Star), R(12),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(12),
B(JumpIfTrue), U8(30),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(12),
B(JumpIfTrue), U8(21),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(14),
B(Mov), R(11), R(13),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(13), U8(2),
B(Star), R(7),
B(LdaZero),
B(Star), R(6),
B(Jump), U8(193),
B(Ldar), R(11),
/* 11 E> */ B(Throw),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(1),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 31 S> */ B(LdaZero),
/* 31 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaImmutableCurrentContextSlot), U8(4),
/* 60 E> */ B(StaContextSlot), R(1), U8(6), U8(0),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(7), U8(0),
B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(1),
B(PushContext), R(2),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(6), U8(0),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(9),
B(LdaSmi), I8(1),
B(TestEqual), R(9), U8(2),
B(JumpIfFalse), U8(9),
B(LdaZero),
B(StaContextSlot), R(1), U8(7), U8(0),
B(Jump), U8(8),
/* 44 S> */ B(LdaCurrentContextSlot), U8(4),
B(Inc), U8(3),
/* 44 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(8), U8(0),
/* 36 S> */ B(LdaCurrentContextSlot), U8(4),
B(Star), R(9),
B(LdaSmi), I8(10),
/* 36 E> */ B(TestLessThan), R(9), U8(4),
B(JumpIfFalse), U8(4),
B(Jump), U8(6),
B(PopContext), R(2),
B(Jump), U8(69),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(9),
B(LdaSmi), I8(1),
B(TestEqual), R(9), U8(5),
B(JumpIfFalse), U8(34),
/* 18 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(2),
B(PushContext), R(3),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 57 S> */ B(LdaContextSlot), R(3), U8(4), U8(0),
/* 57 E> */ B(StaCurrentContextSlot), U8(4),
B(PopContext), R(3),
B(LdaZero),
B(StaContextSlot), R(1), U8(8), U8(0),
B(LdaCurrentContextSlot), U8(4),
/* 60 E> */ B(StaContextSlot), R(1), U8(6), U8(0),
B(JumpLoop), U8(42), I8(1),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(9),
B(LdaSmi), I8(1),
B(TestEqual), R(9), U8(6),
B(JumpIfFalse), U8(6),
B(PopContext), R(2),
B(Jump), U8(7),
B(PopContext), R(2),
B(JumpLoop), U8(129), I8(0),
B(PopContext), R(1),
B(LdaUndefined),
B(Star), R(9),
B(LdaTrue),
B(Star), R(10),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(9), U8(2),
B(Star), R(7),
B(LdaSmi), I8(1),
B(Star), R(6),
B(Jump), U8(14),
B(LdaSmi), I8(-1),
B(Star), R(6),
B(Jump), U8(8),
B(Star), R(7),
B(LdaSmi), I8(2),
B(Star), R(6),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(8),
B(LdaImmutableCurrentContextSlot), U8(5),
B(Star), R(9),
B(CallRuntime), U16(Runtime::k_GeneratorClose), R(9), U8(1),
B(Ldar), R(8),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(16),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(13),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(10),
B(Jump), U8(11),
B(Ldar), R(7),
/* 62 S> */ B(Return),
B(Ldar), R(7),
/* 62 S> */ B(Return),
B(Ldar), R(7),
B(ReThrow),
B(LdaUndefined),
/* 62 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
]
handlers: [
[45, 299, 305],
]
---
snippet: "
function* f() {
for (let x = 0; x < 10; ++x) yield x;
}
f();
"
frame size: 14
parameter count: 1
bytecode array length: 484
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(33),
B(CallRuntime), U16(Runtime::k_GeneratorGetContext), R(new_target), U8(1),
B(PushContext), R(4),
B(ResumeGenerator), R(new_target),
B(Star), R(3),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(60),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(129),
B(LdaSmi), I8(79),
B(Star), R(5),
B(CallRuntime), U16(Runtime::kAbort), R(5), U8(1),
B(LdaSmi), I8(-2),
B(Star), R(3),
B(CreateFunctionContext), U8(5),
B(PushContext), R(0),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(4),
/* 11 E> */ B(StackCheck),
B(Mov), R(context), R(7),
B(LdaImmutableCurrentContextSlot), U8(4),
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(8),
B(LdaImmutableCurrentContextSlot), U8(5),
B(Star), R(9),
B(LdaZero),
B(SuspendGenerator), R(9), U8(0),
B(Ldar), R(8),
/* 56 S> */ B(Return),
B(LdaSmi), I8(-2),
B(Star), R(3),
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(TestEqualStrictNoFeedback), R(11),
B(JumpIfTrue), U8(30),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(11),
B(JumpIfTrue), U8(21),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(13),
B(Mov), R(10), R(12),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(12), U8(2),
B(Star), R(6),
B(LdaZero),
B(Star), R(5),
B(JumpConstant), U8(2),
B(Ldar), R(10),
/* 11 E> */ B(Throw),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(1),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 31 S> */ B(LdaZero),
/* 31 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaImmutableCurrentContextSlot), U8(4),
/* 54 E> */ B(StaContextSlot), R(1), U8(6), U8(0),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(7), U8(0),
B(LdaSmi), I8(-2),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(17),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(76),
B(LdaSmi), I8(79),
B(Star), R(8),
B(CallRuntime), U16(Runtime::kAbort), R(8), U8(1),
B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(1),
B(PushContext), R(2),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(6), U8(0),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(8),
B(LdaSmi), I8(1),
B(TestEqual), R(8), U8(2),
B(JumpIfFalse), U8(9),
B(LdaZero),
B(StaContextSlot), R(1), U8(7), U8(0),
B(Jump), U8(8),
/* 44 S> */ B(LdaCurrentContextSlot), U8(4),
B(Inc), U8(3),
/* 44 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(8), U8(0),
/* 36 S> */ B(LdaCurrentContextSlot), U8(4),
B(Star), R(8),
B(LdaSmi), I8(10),
/* 36 E> */ B(TestLessThan), R(8), U8(4),
B(JumpIfFalse), U8(4),
B(Jump), U8(6),
B(PopContext), R(2),
B(Jump), U8(160),
B(LdaSmi), I8(-2),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(17),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(52),
B(LdaSmi), I8(79),
B(Star), R(8),
B(CallRuntime), U16(Runtime::kAbort), R(8), U8(1),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(8),
B(LdaSmi), I8(1),
B(TestEqual), R(8), U8(5),
B(JumpIfFalse), U8(104),
/* 18 E> */ B(StackCheck),
/* 47 S> */ B(LdaCurrentContextSlot), U8(4),
B(Star), R(8),
B(LdaFalse),
B(Star), R(9),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(8), U8(2),
B(Star), R(8),
B(LdaImmutableContextSlot), R(1), U8(5), U8(0),
B(Star), R(9),
B(LdaSmi), I8(1),
B(SuspendGenerator), R(9), U8(0),
B(Ldar), R(8),
/* 56 S> */ B(Return),
B(LdaSmi), I8(-2),
B(Star), R(3),
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(TestEqualStrictNoFeedback), R(11),
B(JumpIfTrue), U8(39),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(11),
B(JumpIfTrue), U8(30),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(13),
B(Mov), R(10), R(12),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(12), U8(2),
B(PopContext), R(2),
B(PopContext), R(2),
B(PopContext), R(1),
B(PopContext), R(1),
B(Star), R(6),
B(LdaSmi), I8(1),
B(Star), R(5),
B(Jump), U8(73),
B(Ldar), R(10),
/* 47 E> */ B(Throw),
B(LdaZero),
B(StaContextSlot), R(1), U8(8), U8(0),
B(LdaCurrentContextSlot), U8(4),
/* 54 E> */ B(StaContextSlot), R(1), U8(6), U8(0),
B(JumpLoop), U8(133), I8(1),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(8),
B(LdaSmi), I8(1),
B(TestEqual), R(8), U8(6),
B(JumpIfFalse), U8(6),
B(PopContext), R(2),
B(Jump), U8(7),
B(PopContext), R(2),
B(JumpLoop), U8(241), I8(0),
B(PopContext), R(1),
B(LdaUndefined),
B(Star), R(8),
B(LdaTrue),
B(Star), R(9),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(8), U8(2),
B(Star), R(6),
B(LdaSmi), I8(2),
B(Star), R(5),
B(Jump), U8(14),
B(LdaSmi), I8(-1),
B(Star), R(5),
B(Jump), U8(8),
B(Star), R(6),
B(LdaSmi), I8(3),
B(Star), R(5),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(7),
B(LdaImmutableCurrentContextSlot), 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(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(22),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(19),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(16),
B(LdaSmi), I8(3),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(13),
B(Jump), U8(14),
B(Ldar), R(6),
/* 56 S> */ B(Return),
B(Ldar), R(6),
/* 56 S> */ B(Return),
B(Ldar), R(6),
/* 56 S> */ B(Return),
B(Ldar), R(6),
B(ReThrow),
B(LdaUndefined),
/* 56 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
Smi [305],
]
handlers: [
[51, 417, 423],
]
---
snippet: "
async function f() {
for (let x = 0; x < 10; ++x) { let y = x; }
}
f();
"
frame size: 14
parameter count: 1
bytecode array length: 361
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(22),
B(CallRuntime), U16(Runtime::k_GeneratorGetContext), R(new_target), U8(1),
B(PushContext), R(5),
B(ResumeGenerator), R(new_target),
B(Star), R(4),
B(LdaSmi), I8(79),
B(Star), R(6),
B(CallRuntime), U16(Runtime::kAbort), R(6), U8(1),
B(LdaSmi), I8(-2),
B(Star), R(4),
B(CreateFunctionContext), U8(6),
B(PushContext), R(0),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(4),
/* 16 E> */ B(StackCheck),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(7),
B(Mov), R(closure), R(6),
B(CallRuntime), U16(Runtime::kCreateJSGeneratorObject), R(6), U8(2),
B(StaCurrentContextSlot), U8(5),
B(LdaUndefined),
B(Star), R(6),
B(CallJSRuntime), U8(%async_function_promise_create), R(6), U8(1),
B(StaCurrentContextSlot), U8(9),
B(Mov), R(context), R(8),
B(Mov), R(context), R(9),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(1),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 36 S> */ B(LdaZero),
/* 36 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaImmutableCurrentContextSlot), U8(4),
/* 65 E> */ B(StaContextSlot), R(1), U8(6), U8(0),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(7), U8(0),
B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(1),
B(PushContext), R(2),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(6), U8(0),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(10),
B(LdaSmi), I8(1),
B(TestEqual), R(10), U8(2),
B(JumpIfFalse), U8(9),
B(LdaZero),
B(StaContextSlot), R(1), U8(7), U8(0),
B(Jump), U8(8),
/* 49 S> */ B(LdaCurrentContextSlot), U8(4),
B(Inc), U8(3),
/* 49 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(8), U8(0),
/* 41 S> */ B(LdaCurrentContextSlot), U8(4),
B(Star), R(10),
B(LdaSmi), I8(10),
/* 41 E> */ B(TestLessThan), R(10), U8(4),
B(JumpIfFalse), U8(4),
B(Jump), U8(6),
B(PopContext), R(2),
B(Jump), U8(69),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(10),
B(LdaSmi), I8(1),
B(TestEqual), R(10), U8(5),
B(JumpIfFalse), U8(34),
/* 23 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(2),
B(PushContext), R(3),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 62 S> */ B(LdaContextSlot), R(3), U8(4), U8(0),
/* 62 E> */ B(StaCurrentContextSlot), U8(4),
B(PopContext), R(3),
B(LdaZero),
B(StaContextSlot), R(1), U8(8), U8(0),
B(LdaCurrentContextSlot), U8(4),
/* 65 E> */ B(StaContextSlot), R(1), U8(6), U8(0),
B(JumpLoop), U8(42), I8(1),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(Star), R(10),
B(LdaSmi), I8(1),
B(TestEqual), R(10), U8(6),
B(JumpIfFalse), U8(6),
B(PopContext), R(2),
B(Jump), U8(7),
B(PopContext), R(2),
B(JumpLoop), U8(129), I8(0),
B(PopContext), R(1),
B(LdaUndefined),
B(Star), R(10),
B(LdaCurrentContextSlot), U8(9),
B(Star), R(11),
B(LdaUndefined),
B(Star), R(12),
B(CallJSRuntime), U8(%promise_resolve), R(10), U8(3),
B(LdaCurrentContextSlot), U8(9),
B(Star), R(7),
B(LdaZero),
B(Star), R(6),
B(Jump), U8(68),
B(Jump), U8(54),
B(Star), R(10),
B(Ldar), R(closure),
B(CreateCatchContext), R(10), U8(3), U8(4),
B(Star), R(9),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(9),
B(PushContext), R(1),
B(LdaUndefined),
B(Star), R(10),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(11),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(12),
B(LdaFalse),
B(Star), R(13),
B(CallJSRuntime), U8(%promise_internal_reject), R(10), U8(4),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(PopContext), R(1),
B(PopContext), R(1),
B(Star), R(7),
B(LdaSmi), I8(1),
B(Star), R(6),
B(Jump), U8(14),
B(LdaSmi), I8(-1),
B(Star), R(6),
B(Jump), U8(8),
B(Star), R(7),
B(LdaSmi), I8(2),
B(Star), R(6),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(8),
B(LdaUndefined),
B(Star), R(9),
B(LdaCurrentContextSlot), U8(9),
B(Star), R(10),
B(CallJSRuntime), U8(%async_function_promise_release), R(9), U8(2),
B(Ldar), R(8),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(16),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(13),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(6),
B(JumpIfTrue), U8(10),
B(Jump), U8(11),
B(Ldar), R(7),
/* 67 S> */ B(Return),
B(Ldar), R(7),
/* 67 S> */ B(Return),
B(Ldar), R(7),
B(ReThrow),
B(LdaUndefined),
/* 67 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
]
handlers: [
[63, 301, 307],
[66, 247, 249],
]
---
snippet: "
async function f() {
for (let x = 0; x < 10; ++x) await x;
}
f();
"
frame size: 15
parameter count: 1
bytecode array length: 515
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(27),
B(CallRuntime), U16(Runtime::k_GeneratorGetContext), R(new_target), U8(1),
B(PushContext), R(4),
B(ResumeGenerator), R(new_target),
B(Star), R(3),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(77),
B(LdaSmi), I8(79),
B(Star), R(5),
B(CallRuntime), U16(Runtime::kAbort), R(5), U8(1),
B(LdaSmi), I8(-2),
B(Star), R(3),
B(CreateFunctionContext), U8(7),
B(PushContext), R(0),
B(Ldar), R(this),
B(StaCurrentContextSlot), U8(4),
/* 16 E> */ B(StackCheck),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(6),
B(Mov), R(closure), R(5),
B(CallRuntime), U16(Runtime::kCreateJSGeneratorObject), R(5), U8(2),
B(StaCurrentContextSlot), U8(5),
B(LdaUndefined),
B(Star), R(5),
B(CallJSRuntime), U8(%async_function_promise_create), R(5), U8(1),
B(StaCurrentContextSlot), U8(7),
B(Mov), R(context), R(7),
B(Mov), R(context), R(8),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(1),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 36 S> */ B(LdaZero),
/* 36 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaImmutableCurrentContextSlot), U8(4),
/* 59 E> */ B(StaContextSlot), R(1), U8(8), U8(0),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(9), U8(0),
B(LdaSmi), I8(-2),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(16),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(76),
B(LdaSmi), I8(79),
B(Star), R(9),
B(CallRuntime), U16(Runtime::kAbort), R(9), U8(1),
B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(1),
B(PushContext), R(2),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(8), U8(0),
B(StaCurrentContextSlot), U8(4),
B(LdaContextSlot), R(1), U8(9), U8(0),
B(Star), R(9),
B(LdaSmi), I8(1),
B(TestEqual), R(9), U8(2),
B(JumpIfFalse), U8(9),
B(LdaZero),
B(StaContextSlot), R(1), U8(9), U8(0),
B(Jump), U8(8),
/* 49 S> */ B(LdaCurrentContextSlot), U8(4),
B(Inc), U8(3),
/* 49 E> */ B(StaCurrentContextSlot), U8(4),
B(LdaSmi), I8(1),
B(StaContextSlot), R(1), U8(10), U8(0),
/* 41 S> */ B(LdaCurrentContextSlot), U8(4),
B(Star), R(9),
B(LdaSmi), I8(10),
/* 41 E> */ B(TestLessThan), R(9), U8(4),
B(JumpIfFalse), U8(4),
B(Jump), U8(6),
B(PopContext), R(2),
B(Jump), U8(188),
B(LdaSmi), I8(-2),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(16),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(3),
B(JumpIfTrue), U8(75),
B(LdaSmi), I8(79),
B(Star), R(9),
B(CallRuntime), U16(Runtime::kAbort), R(9), U8(1),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(9),
B(LdaSmi), I8(1),
B(TestEqual), R(9), U8(5),
B(JumpIfFalse), U8(130),
/* 23 E> */ B(StackCheck),
/* 58 S> */ B(LdaCurrentContextSlot), U8(4),
B(StaContextSlot), R(1), U8(6), U8(0),
/* 52 S> */ B(LdaUndefined),
B(Star), R(9),
B(LdaImmutableContextSlot), R(1), U8(5), U8(0),
B(Star), R(10),
B(LdaContextSlot), R(1), U8(6), U8(0),
B(Star), R(11),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(12),
B(CallJSRuntime), U8(%async_function_await_uncaught), R(9), U8(4),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(9),
B(LdaImmutableContextSlot), R(1), U8(5), U8(0),
B(Star), R(10),
B(LdaZero),
B(SuspendGenerator), R(10), U8(2),
B(Ldar), R(9),
/* 61 S> */ B(Return),
B(LdaSmi), I8(-2),
B(Star), R(3),
B(CallRuntime), U16(Runtime::k_GeneratorGetInputOrDebugPos), R(10), U8(1),
B(Star), R(11),
B(CallRuntime), U16(Runtime::k_GeneratorGetResumeMode), R(10), U8(1),
B(Star), R(12),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(12),
B(JumpIfTrue), U8(42),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(12),
B(JumpIfTrue), U8(33),
B(Jump), U8(2),
B(LdaTrue),
B(Star), R(14),
B(Mov), R(11), R(13),
B(InvokeIntrinsic), U8(Runtime::k_CreateIterResultObject), R(13), U8(2),
B(PopContext), R(2),
B(PopContext), R(2),
B(PopContext), R(1),
B(PopContext), R(1),
B(PopContext), R(1),
B(PopContext), R(1),
B(Star), R(6),
B(LdaZero),
B(Star), R(5),
B(Jump), U8(136),
B(Ldar), R(11),
B(ReThrow),
B(LdaZero),
B(StaContextSlot), R(1), U8(10), U8(0),
B(LdaCurrentContextSlot), U8(4),
/* 59 E> */ B(StaContextSlot), R(1), U8(8), U8(0),
B(JumpLoop), U8(158), I8(1),
B(LdaContextSlot), R(1), U8(10), U8(0),
B(Star), R(9),
B(LdaSmi), I8(1),
B(TestEqual), R(9), U8(6),
B(JumpIfFalse), U8(6),
B(PopContext), R(2),
B(Jump), U8(10),
B(PopContext), R(2),
B(Wide), B(JumpLoop), U16(266), I16(0),
B(PopContext), R(1),
B(LdaUndefined),
B(Star), R(9),
B(LdaCurrentContextSlot), U8(7),
B(Star), R(10),
B(LdaUndefined),
B(Star), R(11),
B(CallJSRuntime), U8(%promise_resolve), R(9), U8(3),
B(LdaCurrentContextSlot), U8(7),
B(Star), R(6),
B(LdaSmi), I8(1),
B(Star), R(5),
B(Jump), U8(68),
B(Jump), U8(54),
B(Star), R(9),
B(Ldar), R(closure),
B(CreateCatchContext), R(9), U8(2), U8(3),
B(Star), R(8),
B(LdaTheHole),
B(SetPendingMessage),
B(Ldar), R(8),
B(PushContext), R(1),
B(LdaUndefined),
B(Star), R(9),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(Star), R(10),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(11),
B(LdaFalse),
B(Star), R(12),
B(CallJSRuntime), U8(%promise_internal_reject), R(9), U8(4),
B(LdaContextSlot), R(1), U8(7), U8(0),
B(PopContext), R(1),
B(PopContext), R(1),
B(Star), R(6),
B(LdaSmi), I8(2),
B(Star), R(5),
B(Jump), U8(14),
B(LdaSmi), I8(-1),
B(Star), R(5),
B(Jump), U8(8),
B(Star), R(6),
B(LdaSmi), I8(3),
B(Star), R(5),
B(LdaTheHole),
B(SetPendingMessage),
B(Star), R(7),
B(LdaUndefined),
B(Star), R(8),
B(LdaCurrentContextSlot), U8(7),
B(Star), R(9),
B(CallJSRuntime), U8(%async_function_promise_release), R(8), U8(2),
B(Ldar), R(7),
B(SetPendingMessage),
B(LdaZero),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(22),
B(LdaSmi), I8(1),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(19),
B(LdaSmi), I8(2),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(16),
B(LdaSmi), I8(3),
B(TestEqualStrictNoFeedback), R(5),
B(JumpIfTrue), U8(13),
B(Jump), U8(14),
B(Ldar), R(6),
/* 61 S> */ B(Return),
B(Ldar), R(6),
/* 61 S> */ B(Return),
B(Ldar), R(6),
/* 61 S> */ B(Return),
B(Ldar), R(6),
B(ReThrow),
B(LdaUndefined),
/* 61 S> */ B(Return),
]
constant pool: [
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE [".catch"],
FIXED_ARRAY_TYPE,
]
handlers: [
[68, 446, 452],
[71, 392, 394],
]
...@@ -2507,6 +2507,108 @@ TEST(ForAwaitOf) { ...@@ -2507,6 +2507,108 @@ TEST(ForAwaitOf) {
i::FLAG_harmony_async_iteration = old_flag; i::FLAG_harmony_async_iteration = old_flag;
} }
TEST(StandardForLoop) {
InitializedIgnitionHandleScope scope;
BytecodeExpectationsPrinter printer(CcTest::isolate());
printer.set_wrap(false);
printer.set_test_function_name("f");
const char* snippets[] = {
"function f() {\n"
" for (let x = 0; x < 10; ++x) { let y = x; }\n"
"}\n"
"f();\n",
"function f() {\n"
" for (let x = 0; x < 10; ++x) { eval('1'); }\n"
"}\n"
"f();\n",
"function f() {\n"
" for (let x = 0; x < 10; ++x) { (function() { return x; })(); }\n"
"}\n"
"f();\n",
"function f() {\n"
" for (let { x, y } = { x: 0, y: 3 }; y > 0; --y) { let z = x + y; }\n"
"}\n"
"f();\n",
"function* f() {\n"
" for (let x = 0; x < 10; ++x) { let y = x; }\n"
"}\n"
"f();\n",
"function* f() {\n"
" for (let x = 0; x < 10; ++x) yield x;\n"
"}\n"
"f();\n",
"async function f() {\n"
" for (let x = 0; x < 10; ++x) { let y = x; }\n"
"}\n"
"f();\n",
"async function f() {\n"
" for (let x = 0; x < 10; ++x) await x;\n"
"}\n"
"f();\n"};
CHECK(CompareTexts(BuildActual(printer, snippets),
LoadGolden("StandardForLoop.golden")));
}
TEST(ForOfLoop) {
InitializedIgnitionHandleScope scope;
BytecodeExpectationsPrinter printer(CcTest::isolate());
printer.set_wrap(false);
printer.set_test_function_name("f");
const char* snippets[] = {
"function f(arr) {\n"
" for (let x of arr) { let y = x; }\n"
"}\n"
"f([1, 2, 3]);\n",
"function f(arr) {\n"
" for (let x of arr) { eval('1'); }\n"
"}\n"
"f([1, 2, 3]);\n",
"function f(arr) {\n"
" for (let x of arr) { (function() { return x; })(); }\n"
"}\n"
"f([1, 2, 3]);\n",
"function f(arr) {\n"
" for (let { x, y } of arr) { let z = x + y; }\n"
"}\n"
"f([{ x: 0, y: 3 }, { x: 1, y: 9 }, { x: -12, y: 17 }]);\n",
"function* f(arr) {\n"
" for (let x of arr) { let y = x; }\n"
"}\n"
"f([1, 2, 3]);\n",
"function* f(arr) {\n"
" for (let x of arr) yield x;\n"
"}\n"
"f([1, 2, 3]);\n",
"async function f(arr) {\n"
" for (let x of arr) { let y = x; }\n"
"}\n"
"f([1, 2, 3]);\n",
"async function f(arr) {\n"
" for (let x of arr) await x;\n"
"}\n"
"f([1, 2, 3]);\n"};
CHECK(CompareTexts(BuildActual(printer, snippets),
LoadGolden("ForOfLoop.golden")));
}
} // namespace interpreter } // namespace interpreter
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
...@@ -10161,3 +10161,188 @@ TEST(AsyncGeneratorErrors) { ...@@ -10161,3 +10161,188 @@ TEST(AsyncGeneratorErrors) {
RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags,
arraysize(always_flags)); arraysize(always_flags));
} }
TEST(LexicalLoopVariable) {
i::Isolate* isolate = CcTest::i_isolate();
i::HandleScope scope(isolate);
LocalContext env;
typedef std::function<void(const i::ParseInfo& info, i::DeclarationScope*)>
TestCB;
auto TestProgram = [isolate](const char* program, TestCB test) {
i::Factory* const factory = isolate->factory();
i::Handle<i::String> source =
factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked();
i::Handle<i::Script> script = factory->NewScript(source);
i::ParseInfo info(script);
info.set_allow_lazy_parsing(false);
CHECK(i::parsing::ParseProgram(&info, isolate));
CHECK(i::Rewriter::Rewrite(&info, isolate));
i::DeclarationScope::Analyze(&info, isolate, i::AnalyzeMode::kRegular);
CHECK(info.literal() != NULL);
i::DeclarationScope* script_scope = info.literal()->scope();
CHECK(script_scope->is_script_scope());
test(info, script_scope);
};
// Check `let` loop variables is a stack local when not captured by an eval
// or closure within the area of the loop body.
const char* local_bindings[] = {
"function loop() {"
" for (let loop_var = 0; loop_var < 10; ++loop_var) {"
" }"
" eval('0');"
"}",
"function loop() {"
" for (let loop_var = 0; loop_var < 10; ++loop_var) {"
" }"
" function foo() {}"
" foo();"
"}",
};
for (const char* source : local_bindings) {
TestProgram(source, [=](const i::ParseInfo& info, i::DeclarationScope* s) {
i::Scope* fn = s->inner_scope();
CHECK(fn->is_function_scope());
i::Scope* loop_block = fn->inner_scope();
if (loop_block->is_function_scope()) loop_block = loop_block->sibling();
CHECK(loop_block->is_block_scope());
const i::AstRawString* var_name =
info.ast_value_factory()->GetOneByteString("loop_var");
i::Variable* loop_var = loop_block->LookupLocal(var_name);
CHECK_NOT_NULL(loop_var);
CHECK(loop_var->IsStackLocal());
CHECK_EQ(loop_block->ContextLocalCount(), 0);
CHECK_EQ(loop_block->inner_scope()->ContextLocalCount(), 0);
});
}
// Check `let` loop variable is not a stack local, and is duplicated in the
// loop body to ensure capturing can work correctly.
// In this version of the test, the inner loop block's duplicate `loop_var`
// binding is not captured, and is a local.
const char* context_bindings1[] = {
"function loop() {"
" for (let loop_var = eval('0'); loop_var < 10; ++loop_var) {"
" }"
"}",
"function loop() {"
" for (let loop_var = (() => (loop_var, 0))(); loop_var < 10;"
" ++loop_var) {"
" }"
"}"};
for (const char* source : context_bindings1) {
TestProgram(source, [=](const i::ParseInfo& info, i::DeclarationScope* s) {
i::Scope* fn = s->inner_scope();
CHECK(fn->is_function_scope());
i::Scope* loop_block = fn->inner_scope();
CHECK(loop_block->is_block_scope());
const i::AstRawString* var_name =
info.ast_value_factory()->GetOneByteString("loop_var");
i::Variable* loop_var = loop_block->LookupLocal(var_name);
CHECK_NOT_NULL(loop_var);
CHECK(loop_var->IsContextSlot());
CHECK_EQ(loop_block->ContextLocalCount(), 1);
i::Variable* loop_var2 = loop_block->inner_scope()->LookupLocal(var_name);
CHECK_NE(loop_var, loop_var2);
CHECK(loop_var2->IsStackLocal());
CHECK_EQ(loop_block->inner_scope()->ContextLocalCount(), 0);
});
}
// Check `let` loop variable is not a stack local, and is duplicated in the
// loop body to ensure capturing can work correctly.
// In this version of the test, the inner loop block's duplicate `loop_var`
// binding is captured, and must be context allocated.
const char* context_bindings2[] = {
"function loop() {"
" for (let loop_var = 0; loop_var < 10; ++loop_var) {"
" eval('0');"
" }"
"}",
"function loop() {"
" for (let loop_var = 0; loop_var < eval('10'); ++loop_var) {"
" }"
"}",
"function loop() {"
" for (let loop_var = 0; loop_var < 10; eval('++loop_var')) {"
" }"
"}",
};
for (const char* source : context_bindings2) {
TestProgram(source, [=](const i::ParseInfo& info, i::DeclarationScope* s) {
i::Scope* fn = s->inner_scope();
CHECK(fn->is_function_scope());
i::Scope* loop_block = fn->inner_scope();
CHECK(loop_block->is_block_scope());
const i::AstRawString* var_name =
info.ast_value_factory()->GetOneByteString("loop_var");
i::Variable* loop_var = loop_block->LookupLocal(var_name);
CHECK_NOT_NULL(loop_var);
CHECK(loop_var->IsContextSlot());
CHECK_EQ(loop_block->ContextLocalCount(), 1);
i::Variable* loop_var2 = loop_block->inner_scope()->LookupLocal(var_name);
CHECK_NE(loop_var, loop_var2);
CHECK(loop_var2->IsContextSlot());
CHECK_EQ(loop_block->inner_scope()->ContextLocalCount(), 1);
});
}
// Similar to the above, but the first block scope's variables are not
// captured due to the closure occurring in a nested scope.
const char* context_bindings3[] = {
"function loop() {"
" for (let loop_var = 0; loop_var < 10; ++loop_var) {"
" (() => loop_var)();"
" }"
"}",
"function loop() {"
" for (let loop_var = 0; loop_var < (() => (loop_var, 10))();"
" ++loop_var) {"
" }"
"}",
"function loop() {"
" for (let loop_var = 0; loop_var < 10; (() => ++loop_var)()) {"
" }"
"}",
};
for (const char* source : context_bindings3) {
TestProgram(source, [=](const i::ParseInfo& info, i::DeclarationScope* s) {
i::Scope* fn = s->inner_scope();
CHECK(fn->is_function_scope());
i::Scope* loop_block = fn->inner_scope();
CHECK(loop_block->is_block_scope());
const i::AstRawString* var_name =
info.ast_value_factory()->GetOneByteString("loop_var");
i::Variable* loop_var = loop_block->LookupLocal(var_name);
CHECK_NOT_NULL(loop_var);
CHECK(loop_var->IsStackLocal());
CHECK_EQ(loop_block->ContextLocalCount(), 0);
i::Variable* loop_var2 = loop_block->inner_scope()->LookupLocal(var_name);
CHECK_NE(loop_var, loop_var2);
CHECK(loop_var2->IsContextSlot());
CHECK_EQ(loop_block->inner_scope()->ContextLocalCount(), 1);
});
}
}
...@@ -1144,7 +1144,7 @@ listener_delegate = function(exec_state) { ...@@ -1144,7 +1144,7 @@ listener_delegate = function(exec_state) {
debug.ScopeType.Script, debug.ScopeType.Script,
debug.ScopeType.Global], exec_state); debug.ScopeType.Global], exec_state);
CheckScopeChainPositions( CheckScopeChainPositions(
[{start: 52, end: 111}, {start: 22, end: 145}, {}, {}], exec_state); [{start: 42, end: 111}, {start: 22, end: 145}, {}, {}], exec_state);
} }
eval(code3); eval(code3);
EndTest(); EndTest();
...@@ -1165,7 +1165,7 @@ listener_delegate = function(exec_state) { ...@@ -1165,7 +1165,7 @@ listener_delegate = function(exec_state) {
debug.ScopeType.Script, debug.ScopeType.Script,
debug.ScopeType.Global], exec_state); debug.ScopeType.Global], exec_state);
CheckScopeChainPositions([{start: 66, end: 147}, CheckScopeChainPositions([{start: 66, end: 147},
{start: 52, end: 147}, {start: 42, end: 147},
{start: 22, end: 181}, {start: 22, end: 181},
{}, {}], exec_state); {}, {}], exec_state);
} }
......
...@@ -751,7 +751,7 @@ listener_delegate = function(exec_state) { ...@@ -751,7 +751,7 @@ listener_delegate = function(exec_state) {
debug.ScopeType.Module, debug.ScopeType.Module,
debug.ScopeType.Script, debug.ScopeType.Script,
debug.ScopeType.Global], exec_state); debug.ScopeType.Global], exec_state);
CheckScopeChainPositions([{start: 52, end: 111}, {start: 22, end: 145}], CheckScopeChainPositions([{start: 42, end: 111}, {start: 22, end: 145}],
exec_state); exec_state);
} }
eval(code3); eval(code3);
...@@ -774,7 +774,7 @@ listener_delegate = function(exec_state) { ...@@ -774,7 +774,7 @@ listener_delegate = function(exec_state) {
debug.ScopeType.Script, debug.ScopeType.Script,
debug.ScopeType.Global], exec_state); debug.ScopeType.Global], exec_state);
CheckScopeChainPositions([{start: 66, end: 147}, CheckScopeChainPositions([{start: 66, end: 147},
{start: 52, end: 147}, {start: 42, end: 147},
{start: 22, end: 181}], exec_state); {start: 22, end: 181}], exec_state);
} }
eval(code4); eval(code4);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment