Merge V8 5.3.332.45. DO NOT MERGE
Test: Manual
FPIIM-449
Change-Id: Id3254828b068abdea3cb10442e0172a8c9a98e03
(cherry picked from commit 13e2dadd00298019ed862f2b2fc5068bba730bcf)
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc
index 650234a..b7cfd49 100644
--- a/src/interpreter/bytecode-generator.cc
+++ b/src/interpreter/bytecode-generator.cc
@@ -17,7 +17,6 @@
namespace internal {
namespace interpreter {
-
// Scoped class tracking context objects created by the visitor. Represents
// mutations of the context chain within the function body, allowing pushing and
// popping of the current {context_register} during visitation.
@@ -88,7 +87,6 @@
bool should_pop_context_;
};
-
// Scoped class for tracking control statements entered by the
// visitor. The pattern derives AstGraphBuilder::ControlScope.
class BytecodeGenerator::ControlScope BASE_EMBEDDED {
@@ -124,7 +122,6 @@
DISALLOW_COPY_AND_ASSIGN(ControlScope);
};
-
// Helper class for a try-finally control scope. It can record intercepted
// control-flow commands that cause entry into a finally-block, and re-apply
// them after again leaving that block. Special tokens are used to identify
@@ -203,7 +200,6 @@
Register result_register_;
};
-
// Scoped class for dealing with control flow reaching the function level.
class BytecodeGenerator::ControlScopeForTopLevel final
: public BytecodeGenerator::ControlScope {
@@ -228,7 +224,6 @@
}
};
-
// Scoped class for enabling break inside blocks and switch blocks.
class BytecodeGenerator::ControlScopeForBreakable final
: public BytecodeGenerator::ControlScope {
@@ -260,7 +255,6 @@
BreakableControlFlowBuilder* control_builder_;
};
-
// Scoped class for enabling 'break' and 'continue' in iteration
// constructs, e.g. do...while, while..., for...
class BytecodeGenerator::ControlScopeForIteration final
@@ -295,7 +289,6 @@
LoopBuilder* loop_builder_;
};
-
// Scoped class for enabling 'throw' in try-catch constructs.
class BytecodeGenerator::ControlScopeForTryCatch final
: public BytecodeGenerator::ControlScope {
@@ -324,7 +317,6 @@
}
};
-
// Scoped class for enabling control flow through try-finally constructs.
class BytecodeGenerator::ControlScopeForTryFinally final
: public BytecodeGenerator::ControlScope {
@@ -360,7 +352,6 @@
DeferredCommands* commands_;
};
-
void BytecodeGenerator::ControlScope::PerformCommand(Command command,
Statement* statement) {
ControlScope* current = this;
@@ -383,7 +374,6 @@
UNREACHABLE();
}
-
class BytecodeGenerator::RegisterAllocationScope {
public:
explicit RegisterAllocationScope(BytecodeGenerator* generator)
@@ -441,7 +431,6 @@
DISALLOW_COPY_AND_ASSIGN(RegisterAllocationScope);
};
-
// Scoped base class for determining where the result of an expression
// is stored.
class BytecodeGenerator::ExpressionResultScope {
@@ -489,7 +478,6 @@
DISALLOW_COPY_AND_ASSIGN(ExpressionResultScope);
};
-
// Scoped class used when the result of the current expression is not
// expected to produce a result.
class BytecodeGenerator::EffectResultScope final
@@ -504,7 +492,6 @@
virtual void SetResultInRegister(Register reg) {}
};
-
// Scoped class used when the result of the current expression to be
// evaluated should go into the interpreter's accumulator register.
class BytecodeGenerator::AccumulatorResultScope final
@@ -521,7 +508,6 @@
}
};
-
// Scoped class used when the result of the current expression to be
// evaluated should go into an interpreter register.
class BytecodeGenerator::RegisterResultScope final
@@ -585,7 +571,7 @@
RegisterAllocationScope register_scope(this);
- if (IsGeneratorFunction(info()->literal()->kind())) {
+ if (IsResumableFunction(info()->literal()->kind())) {
generator_state_ = register_allocator()->NewRegister();
VisitGeneratorPrologue();
}
@@ -613,7 +599,6 @@
return builder()->ToBytecodeArray();
}
-
void BytecodeGenerator::MakeBytecodeBody() {
// Build the arguments object if it is used.
VisitArgumentsObject(scope()->arguments());
@@ -656,13 +641,7 @@
.JumpIfTrue(&(targets[i]));
}
- RegisterAllocationScope register_scope(this);
- Register reason = register_allocator()->NewRegister();
- BailoutReason bailout_reason = BailoutReason::kInvalidJumpTableIndex;
- builder()
- ->LoadLiteral(Smi::FromInt(static_cast<int>(bailout_reason)))
- .StoreAccumulatorInRegister(reason)
- .CallRuntime(Runtime::kAbort, reason, 1);
+ BuildAbort(BailoutReason::kInvalidJumpTableIndex);
}
void BytecodeGenerator::VisitIterationHeader(IterationStatement* stmt,
@@ -717,10 +696,13 @@
BuildIndexedJump(generator_state_, 0, generator_resume_points_.size(),
generator_resume_points_);
- builder()->Bind(®ular_call);
+ builder()
+ ->Bind(®ular_call)
+ .LoadLiteral(Smi::FromInt(JSGeneratorObject::kGeneratorExecuting))
+ .StoreAccumulatorInRegister(generator_state_);
// This is a regular call. Fall through to the ordinary function prologue,
- // after which we will run into the generator object creation and the initial
- // yield (both inserted by the parser).
+ // after which we will run into the generator object creation and other extra
+ // code inserted by the parser.
}
void BytecodeGenerator::VisitBlock(Block* stmt) {
@@ -734,7 +716,6 @@
}
}
-
void BytecodeGenerator::VisitBlockDeclarationsAndStatements(Block* stmt) {
BlockBuilder block_builder(builder());
ControlScopeForBreakable execution_control(this, stmt, &block_builder);
@@ -745,7 +726,6 @@
if (stmt->labels() != nullptr) block_builder.EndBlock();
}
-
void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) {
Variable* variable = decl->proxy()->var();
VariableMode mode = decl->mode();
@@ -780,34 +760,20 @@
}
break;
case VariableLocation::LOOKUP: {
- DCHECK(IsDeclaredVariableMode(mode));
+ DCHECK_EQ(VAR, mode);
+ DCHECK(!hole_init);
- register_allocator()->PrepareForConsecutiveAllocations(3);
- Register name = register_allocator()->NextConsecutiveRegister();
- Register init_value = register_allocator()->NextConsecutiveRegister();
- Register attributes = register_allocator()->NextConsecutiveRegister();
+ Register name = register_allocator()->NewRegister();
- builder()->LoadLiteral(variable->name()).StoreAccumulatorInRegister(name);
- if (hole_init) {
- builder()->LoadTheHole().StoreAccumulatorInRegister(init_value);
- } else {
- // For variables, we must not use an initial value (such as 'undefined')
- // because we may have a (legal) redeclaration and we must not destroy
- // the current value.
- builder()
- ->LoadLiteral(Smi::FromInt(0))
- .StoreAccumulatorInRegister(init_value);
- }
builder()
- ->LoadLiteral(Smi::FromInt(variable->DeclarationPropertyAttributes()))
- .StoreAccumulatorInRegister(attributes)
- .CallRuntime(Runtime::kDeclareLookupSlot, name, 3);
+ ->LoadLiteral(variable->name())
+ .StoreAccumulatorInRegister(name)
+ .CallRuntime(Runtime::kDeclareEvalVar, name, 1);
break;
}
}
}
-
void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) {
Variable* variable = decl->proxy()->var();
switch (variable->location()) {
@@ -838,33 +804,26 @@
break;
}
case VariableLocation::LOOKUP: {
- register_allocator()->PrepareForConsecutiveAllocations(3);
+ register_allocator()->PrepareForConsecutiveAllocations(2);
Register name = register_allocator()->NextConsecutiveRegister();
Register literal = register_allocator()->NextConsecutiveRegister();
- Register attributes = register_allocator()->NextConsecutiveRegister();
builder()->LoadLiteral(variable->name()).StoreAccumulatorInRegister(name);
VisitForAccumulatorValue(decl->fun());
- builder()
- ->StoreAccumulatorInRegister(literal)
- .LoadLiteral(Smi::FromInt(variable->DeclarationPropertyAttributes()))
- .StoreAccumulatorInRegister(attributes)
- .CallRuntime(Runtime::kDeclareLookupSlot, name, 3);
+ builder()->StoreAccumulatorInRegister(literal).CallRuntime(
+ Runtime::kDeclareEvalFunction, name, 2);
}
}
}
-
void BytecodeGenerator::VisitImportDeclaration(ImportDeclaration* decl) {
UNIMPLEMENTED();
}
-
void BytecodeGenerator::VisitExportDeclaration(ExportDeclaration* decl) {
UNIMPLEMENTED();
}
-
void BytecodeGenerator::VisitDeclarations(
ZoneList<Declaration*>* declarations) {
RegisterAllocationScope register_scope(this);
@@ -893,7 +852,6 @@
globals()->clear();
}
-
void BytecodeGenerator::VisitStatements(ZoneList<Statement*>* statements) {
for (int i = 0; i < statements->length(); i++) {
// Allocate an outer register allocations scope for the statement.
@@ -904,17 +862,14 @@
}
}
-
void BytecodeGenerator::VisitExpressionStatement(ExpressionStatement* stmt) {
builder()->SetStatementPosition(stmt);
VisitForEffect(stmt->expression());
}
-
void BytecodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) {
}
-
void BytecodeGenerator::VisitIfStatement(IfStatement* stmt) {
builder()->SetStatementPosition(stmt);
BytecodeLabel else_label, end_label;
@@ -944,32 +899,27 @@
}
}
-
void BytecodeGenerator::VisitSloppyBlockFunctionStatement(
SloppyBlockFunctionStatement* stmt) {
Visit(stmt->statement());
}
-
void BytecodeGenerator::VisitContinueStatement(ContinueStatement* stmt) {
builder()->SetStatementPosition(stmt);
execution_control()->Continue(stmt->target());
}
-
void BytecodeGenerator::VisitBreakStatement(BreakStatement* stmt) {
builder()->SetStatementPosition(stmt);
execution_control()->Break(stmt->target());
}
-
void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) {
builder()->SetStatementPosition(stmt);
VisitForAccumulatorValue(stmt->expression());
execution_control()->ReturnAccumulator();
}
-
void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) {
builder()->SetStatementPosition(stmt);
VisitForAccumulatorValue(stmt->expression());
@@ -978,7 +928,6 @@
VisitInScope(stmt->statement(), stmt->scope());
}
-
void BytecodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) {
// We need this scope because we visit for register values. We have to
// maintain a execution result scope where registers can be allocated.
@@ -1029,7 +978,6 @@
switch_builder.SetBreakTarget(done_label);
}
-
void BytecodeGenerator::VisitCaseClause(CaseClause* clause) {
// Handled entirely in VisitSwitchStatement.
UNREACHABLE();
@@ -1078,7 +1026,6 @@
loop_builder.EndLoop();
}
-
void BytecodeGenerator::VisitForStatement(ForStatement* stmt) {
if (stmt->init() != nullptr) {
Visit(stmt->init());
@@ -1105,7 +1052,6 @@
loop_builder.EndLoop();
}
-
void BytecodeGenerator::VisitForInAssignment(Expression* expr,
FeedbackVectorSlot slot) {
DCHECK(expr->IsValidReferenceExpression());
@@ -1179,7 +1125,6 @@
}
}
-
void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) {
if (stmt->subject()->IsNullLiteral() ||
stmt->subject()->IsUndefinedLiteral()) {
@@ -1231,7 +1176,6 @@
builder()->Bind(&subject_undefined_label);
}
-
void BytecodeGenerator::VisitForOfStatement(ForOfStatement* stmt) {
LoopBuilder loop_builder(builder());
ControlScopeForIteration control_scope(this, stmt, &loop_builder);
@@ -1251,7 +1195,6 @@
loop_builder.EndLoop();
}
-
void BytecodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) {
TryCatchBuilder try_control_builder(builder());
Register no_reg;
@@ -1288,7 +1231,6 @@
try_control_builder.EndCatch();
}
-
void BytecodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
TryFinallyBuilder try_control_builder(builder(), IsInsideTryCatch());
Register no_reg;
@@ -1353,13 +1295,11 @@
commands.ApplyDeferredCommands();
}
-
void BytecodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) {
builder()->SetStatementPosition(stmt);
builder()->Debugger();
}
-
void BytecodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) {
// Find or build a shared function info.
Handle<SharedFunctionInfo> shared_info =
@@ -1372,7 +1312,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr) {
if (expr->scope()->ContextLocalCount() > 0) {
VisitNewLocalBlockContext(expr->scope());
@@ -1530,13 +1469,11 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitDoExpression(DoExpression* expr) {
VisitBlock(expr->block());
VisitVariableProxy(expr->result());
}
-
void BytecodeGenerator::VisitConditional(Conditional* expr) {
// TODO(rmcilroy): Spot easy cases where there code would not need to
// emit the then block or the else block, e.g. condition is
@@ -1557,21 +1494,20 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitLiteral(Literal* expr) {
if (!execution_result()->IsEffect()) {
Handle<Object> value = expr->value();
if (value->IsSmi()) {
builder()->LoadLiteral(Smi::cast(*value));
- } else if (value->IsUndefined()) {
+ } else if (value->IsUndefined(isolate())) {
builder()->LoadUndefined();
- } else if (value->IsTrue()) {
+ } else if (value->IsTrue(isolate())) {
builder()->LoadTrue();
- } else if (value->IsFalse()) {
+ } else if (value->IsFalse(isolate())) {
builder()->LoadFalse();
- } else if (value->IsNull()) {
+ } else if (value->IsNull(isolate())) {
builder()->LoadNull();
- } else if (value->IsTheHole()) {
+ } else if (value->IsTheHole(isolate())) {
builder()->LoadTheHole();
} else {
builder()->LoadLiteral(value);
@@ -1580,7 +1516,6 @@
}
}
-
void BytecodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) {
// Materialize a regular expression literal.
builder()->CreateRegExpLiteral(expr->pattern(), expr->literal_index(),
@@ -1588,7 +1523,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
// Copy the literal boilerplate.
int fast_clone_properties_count = 0;
@@ -1792,7 +1726,6 @@
execution_result()->SetResultInRegister(literal);
}
-
void BytecodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
// Deep-copy the literal boilerplate.
builder()->CreateArrayLiteral(expr->constant_elements(),
@@ -1832,7 +1765,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitVariableProxy(VariableProxy* proxy) {
builder()->SetExpressionPosition(proxy);
VisitVariableLoad(proxy->var(), proxy->VariableFeedbackSlot());
@@ -1868,8 +1800,7 @@
}
case VariableLocation::GLOBAL:
case VariableLocation::UNALLOCATED: {
- builder()->LoadGlobal(variable->name(), feedback_index(slot),
- typeof_mode);
+ builder()->LoadGlobal(feedback_index(slot), typeof_mode);
execution_result()->SetResultInAccumulator();
break;
}
@@ -1958,6 +1889,15 @@
builder()->CallRuntime(function_id, receiver, 4);
}
+void BytecodeGenerator::BuildAbort(BailoutReason bailout_reason) {
+ RegisterAllocationScope register_scope(this);
+ Register reason = register_allocator()->NewRegister();
+ builder()
+ ->LoadLiteral(Smi::FromInt(static_cast<int>(bailout_reason)))
+ .StoreAccumulatorInRegister(reason)
+ .CallRuntime(Runtime::kAbort, reason, 1);
+}
+
void BytecodeGenerator::BuildThrowReferenceError(Handle<String> name) {
RegisterAllocationScope register_scope(this);
Register name_reg = register_allocator()->NewRegister();
@@ -2125,7 +2065,6 @@
}
}
-
void BytecodeGenerator::VisitAssignment(Assignment* expr) {
DCHECK(expr->target()->IsValidReferenceExpressionOrThis());
Register object, key, home_object, value;
@@ -2297,12 +2236,12 @@
Register input = register_allocator()->NewRegister();
builder()
- ->CallRuntime(Runtime::kGeneratorGetInput, generator, 1)
+ ->CallRuntime(Runtime::kInlineGeneratorGetInputOrDebugPos, generator, 1)
.StoreAccumulatorInRegister(input);
Register resume_mode = register_allocator()->NewRegister();
builder()
- ->CallRuntime(Runtime::kGeneratorGetResumeMode, generator, 1)
+ ->CallRuntime(Runtime::kInlineGeneratorGetResumeMode, generator, 1)
.StoreAccumulatorInRegister(resume_mode);
// Now dispatch on resume mode.
@@ -2329,14 +2268,13 @@
->MoveRegister(input, value)
.LoadTrue()
.StoreAccumulatorInRegister(done)
- .CallRuntime(Runtime::kCreateIterResultObject, value, 2);
+ .CallRuntime(Runtime::kInlineCreateIterResultObject, value, 2);
execution_control()->ReturnAccumulator();
}
builder()->Bind(&resume_with_throw);
- builder()
- ->LoadAccumulatorWithRegister(input)
- .Throw();
+ builder()->SetExpressionPosition(expr);
+ builder()->LoadAccumulatorWithRegister(input).Throw();
builder()->Bind(&resume_with_next);
builder()->LoadAccumulatorWithRegister(input);
@@ -2355,7 +2293,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* expr) {
LhsKind property_kind = Property::GetAssignType(expr);
FeedbackVectorSlot slot = expr->PropertyFeedbackSlot();
@@ -2649,7 +2586,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
if (expr->is_jsruntime()) {
@@ -2670,14 +2606,12 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitVoid(UnaryOperation* expr) {
VisitForEffect(expr->expression());
builder()->LoadUndefined();
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitTypeOf(UnaryOperation* expr) {
if (expr->expression()->IsVariableProxy()) {
// Typeof does not throw a reference error on global variables, hence we
@@ -2692,14 +2626,12 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitNot(UnaryOperation* expr) {
VisitForAccumulatorValue(expr->expression());
builder()->LogicalNot();
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
switch (expr->op()) {
case Token::Value::NOT:
@@ -2725,7 +2657,6 @@
}
}
-
void BytecodeGenerator::VisitDelete(UnaryOperation* expr) {
if (expr->expression()->IsProperty()) {
// Delete of an object property is allowed both in sloppy
@@ -2787,7 +2718,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitCountOperation(CountOperation* expr) {
DCHECK(expr->expression()->IsValidReferenceExpressionOrThis());
@@ -2909,7 +2839,6 @@
}
}
-
void BytecodeGenerator::VisitBinaryOperation(BinaryOperation* binop) {
switch (binop->op()) {
case Token::COMMA:
@@ -2927,7 +2856,6 @@
}
}
-
void BytecodeGenerator::VisitCompareOperation(CompareOperation* expr) {
Register lhs = VisitForRegisterValue(expr->left());
VisitForAccumulatorValue(expr->right());
@@ -2936,7 +2864,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitArithmeticExpression(BinaryOperation* expr) {
Register lhs = VisitForRegisterValue(expr->left());
VisitForAccumulatorValue(expr->right());
@@ -2944,39 +2871,32 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitSpread(Spread* expr) { UNREACHABLE(); }
-
void BytecodeGenerator::VisitEmptyParentheses(EmptyParentheses* expr) {
UNREACHABLE();
}
-
void BytecodeGenerator::VisitThisFunction(ThisFunction* expr) {
execution_result()->SetResultInRegister(Register::function_closure());
}
-
void BytecodeGenerator::VisitSuperCallReference(SuperCallReference* expr) {
// Handled by VisitCall().
UNREACHABLE();
}
-
void BytecodeGenerator::VisitSuperPropertyReference(
SuperPropertyReference* expr) {
builder()->CallRuntime(Runtime::kThrowUnsupportedSuperError, Register(0), 0);
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitCommaExpression(BinaryOperation* binop) {
VisitForEffect(binop->left());
Visit(binop->right());
}
-
void BytecodeGenerator::VisitLogicalOrExpression(BinaryOperation* binop) {
Expression* left = binop->left();
Expression* right = binop->right();
@@ -2995,7 +2915,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitLogicalAndExpression(BinaryOperation* binop) {
Expression* left = binop->left();
Expression* right = binop->right();
@@ -3014,12 +2933,10 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitRewritableExpression(RewritableExpression* expr) {
Visit(expr->expression());
}
-
void BytecodeGenerator::VisitNewLocalFunctionContext() {
AccumulatorResultScope accumulator_execution_result(this);
Scope* scope = this->scope();
@@ -3043,7 +2960,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitBuildLocalActivationContext() {
Scope* scope = this->scope();
@@ -3072,7 +2988,6 @@
}
}
-
void BytecodeGenerator::VisitNewLocalBlockContext(Scope* scope) {
AccumulatorResultScope accumulator_execution_result(this);
DCHECK(scope->is_block_scope());
@@ -3126,7 +3041,6 @@
execution_result()->SetResultInAccumulator();
}
-
void BytecodeGenerator::VisitObjectLiteralAccessor(
Register home_object, ObjectLiteralProperty* property, Register value_out) {
// TODO(rmcilroy): Replace value_out with VisitForRegister();
@@ -3152,7 +3066,6 @@
}
}
-
void BytecodeGenerator::VisitArgumentsObject(Variable* variable) {
if (variable == nullptr) return;
@@ -3187,7 +3100,6 @@
VisitVariableAssignment(variable, Token::INIT, FeedbackVectorSlot::Invalid());
}
-
void BytecodeGenerator::VisitNewTargetVariable(Variable* variable) {
if (variable == nullptr) return;
@@ -3196,7 +3108,6 @@
VisitVariableAssignment(variable, Token::INIT, FeedbackVectorSlot::Invalid());
}
-
void BytecodeGenerator::VisitFunctionClosureForContext() {
AccumulatorResultScope accumulator_execution_result(this);
Scope* closure_scope = execution_context()->scope()->ClosureScope();
@@ -3223,7 +3134,6 @@
execution_result()->SetResultInAccumulator();
}
-
// Visits the expression |expr| and places the result in the accumulator.
void BytecodeGenerator::VisitForAccumulatorValue(Expression* expr) {
AccumulatorResultScope accumulator_scope(this);
@@ -3244,7 +3154,6 @@
Visit(expr);
}
-
// Visits the expression |expr| and returns the register containing
// the expression result.
Register BytecodeGenerator::VisitForRegisterValue(Expression* expr) {
@@ -3268,14 +3177,12 @@
Visit(stmt);
}
-
LanguageMode BytecodeGenerator::language_mode() const {
return execution_context()->scope()->language_mode();
}
-
int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const {
- return info()->shared_info()->feedback_vector()->GetIndex(slot);
+ return TypeFeedbackVector::GetIndex(slot);
}
} // namespace interpreter