Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index 656bd8b78652f4f721617004bbcd9673afb9e176..f4ee9f49f5d98c6f36f8f0fa4ef3bd284acc962c 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -17,7 +17,6 @@ namespace v8 { |
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 @@ class BytecodeGenerator::ContextScope BASE_EMBEDDED { |
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 @@ class BytecodeGenerator::ControlScope BASE_EMBEDDED { |
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 @@ class BytecodeGenerator::ControlScope::DeferredCommands final { |
Register result_register_; |
}; |
- |
// Scoped class for dealing with control flow reaching the function level. |
class BytecodeGenerator::ControlScopeForTopLevel final |
: public BytecodeGenerator::ControlScope { |
@@ -229,7 +225,6 @@ class BytecodeGenerator::ControlScopeForTopLevel final |
} |
}; |
- |
// Scoped class for enabling break inside blocks and switch blocks. |
class BytecodeGenerator::ControlScopeForBreakable final |
: public BytecodeGenerator::ControlScope { |
@@ -261,7 +256,6 @@ class BytecodeGenerator::ControlScopeForBreakable final |
BreakableControlFlowBuilder* control_builder_; |
}; |
- |
// Scoped class for enabling 'break' and 'continue' in iteration |
// constructs, e.g. do...while, while..., for... |
class BytecodeGenerator::ControlScopeForIteration final |
@@ -296,7 +290,6 @@ class BytecodeGenerator::ControlScopeForIteration final |
LoopBuilder* loop_builder_; |
}; |
- |
// Scoped class for enabling 'throw' in try-catch constructs. |
class BytecodeGenerator::ControlScopeForTryCatch final |
: public BytecodeGenerator::ControlScope { |
@@ -325,7 +318,6 @@ class BytecodeGenerator::ControlScopeForTryCatch final |
} |
}; |
- |
// Scoped class for enabling control flow through try-finally constructs. |
class BytecodeGenerator::ControlScopeForTryFinally final |
: public BytecodeGenerator::ControlScope { |
@@ -361,7 +353,6 @@ class BytecodeGenerator::ControlScopeForTryFinally final |
DeferredCommands* commands_; |
}; |
- |
void BytecodeGenerator::ControlScope::PerformCommand(Command command, |
Statement* statement) { |
ControlScope* current = this; |
@@ -384,7 +375,6 @@ void BytecodeGenerator::ControlScope::PerformCommand(Command command, |
UNREACHABLE(); |
} |
- |
class BytecodeGenerator::RegisterAllocationScope { |
public: |
explicit RegisterAllocationScope(BytecodeGenerator* generator) |
@@ -442,7 +432,6 @@ class BytecodeGenerator::RegisterAllocationScope { |
DISALLOW_COPY_AND_ASSIGN(RegisterAllocationScope); |
}; |
- |
// Scoped base class for determining where the result of an expression |
// is stored. |
class BytecodeGenerator::ExpressionResultScope { |
@@ -490,7 +479,6 @@ class BytecodeGenerator::ExpressionResultScope { |
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 |
@@ -505,7 +493,6 @@ class BytecodeGenerator::EffectResultScope final |
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 |
@@ -522,7 +509,6 @@ class BytecodeGenerator::AccumulatorResultScope final |
} |
}; |
- |
// Scoped class used when the result of the current expression to be |
// evaluated should go into an interpreter register. |
class BytecodeGenerator::RegisterResultScope final |
@@ -614,7 +600,6 @@ Handle<BytecodeArray> BytecodeGenerator::MakeBytecode() { |
return builder()->ToBytecodeArray(); |
} |
- |
void BytecodeGenerator::MakeBytecodeBody() { |
// Build the arguments object if it is used. |
VisitArgumentsObject(scope()->arguments()); |
@@ -729,7 +714,6 @@ void BytecodeGenerator::VisitBlock(Block* stmt) { |
} |
} |
- |
void BytecodeGenerator::VisitBlockDeclarationsAndStatements(Block* stmt) { |
BlockBuilder block_builder(builder()); |
ControlScopeForBreakable execution_control(this, stmt, &block_builder); |
@@ -740,7 +724,6 @@ void BytecodeGenerator::VisitBlockDeclarationsAndStatements(Block* stmt) { |
if (stmt->labels() != nullptr) block_builder.EndBlock(); |
} |
- |
void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) { |
Variable* variable = decl->proxy()->var(); |
VariableMode mode = decl->mode(); |
@@ -802,7 +785,6 @@ void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) { |
} |
} |
- |
void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { |
Variable* variable = decl->proxy()->var(); |
switch (variable->location()) { |
@@ -849,17 +831,14 @@ void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { |
} |
} |
- |
void BytecodeGenerator::VisitImportDeclaration(ImportDeclaration* decl) { |
UNIMPLEMENTED(); |
} |
- |
void BytecodeGenerator::VisitExportDeclaration(ExportDeclaration* decl) { |
UNIMPLEMENTED(); |
} |
- |
void BytecodeGenerator::VisitDeclarations( |
ZoneList<Declaration*>* declarations) { |
RegisterAllocationScope register_scope(this); |
@@ -888,7 +867,6 @@ void BytecodeGenerator::VisitDeclarations( |
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. |
@@ -899,17 +877,14 @@ void BytecodeGenerator::VisitStatements(ZoneList<Statement*>* statements) { |
} |
} |
- |
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; |
@@ -939,32 +914,27 @@ void BytecodeGenerator::VisitIfStatement(IfStatement* stmt) { |
} |
} |
- |
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()); |
@@ -973,7 +943,6 @@ void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) { |
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. |
@@ -1024,7 +993,6 @@ void BytecodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { |
switch_builder.SetBreakTarget(done_label); |
} |
- |
void BytecodeGenerator::VisitCaseClause(CaseClause* clause) { |
// Handled entirely in VisitSwitchStatement. |
UNREACHABLE(); |
@@ -1073,7 +1041,6 @@ void BytecodeGenerator::VisitWhileStatement(WhileStatement* stmt) { |
loop_builder.EndLoop(); |
} |
- |
void BytecodeGenerator::VisitForStatement(ForStatement* stmt) { |
if (stmt->init() != nullptr) { |
Visit(stmt->init()); |
@@ -1100,7 +1067,6 @@ void BytecodeGenerator::VisitForStatement(ForStatement* stmt) { |
loop_builder.EndLoop(); |
} |
- |
void BytecodeGenerator::VisitForInAssignment(Expression* expr, |
FeedbackVectorSlot slot) { |
DCHECK(expr->IsValidReferenceExpression()); |
@@ -1174,7 +1140,6 @@ void BytecodeGenerator::VisitForInAssignment(Expression* expr, |
} |
} |
- |
void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
if (stmt->subject()->IsNullLiteral() || |
stmt->subject()->IsUndefinedLiteral()) { |
@@ -1226,7 +1191,6 @@ void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
builder()->Bind(&subject_undefined_label); |
} |
- |
void BytecodeGenerator::VisitForOfStatement(ForOfStatement* stmt) { |
LoopBuilder loop_builder(builder()); |
ControlScopeForIteration control_scope(this, stmt, &loop_builder); |
@@ -1246,7 +1210,6 @@ void BytecodeGenerator::VisitForOfStatement(ForOfStatement* stmt) { |
loop_builder.EndLoop(); |
} |
- |
void BytecodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { |
TryCatchBuilder try_control_builder(builder()); |
Register no_reg; |
@@ -1283,7 +1246,6 @@ void BytecodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { |
try_control_builder.EndCatch(); |
} |
- |
void BytecodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
TryFinallyBuilder try_control_builder(builder(), IsInsideTryCatch()); |
Register no_reg; |
@@ -1348,13 +1310,11 @@ void BytecodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
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 = |
@@ -1367,7 +1327,6 @@ void BytecodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr) { |
if (expr->scope()->ContextLocalCount() > 0) { |
VisitNewLocalBlockContext(expr->scope()); |
@@ -1525,13 +1484,11 @@ void BytecodeGenerator::VisitNativeFunctionLiteral( |
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 |
@@ -1552,7 +1509,6 @@ void BytecodeGenerator::VisitConditional(Conditional* expr) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitLiteral(Literal* expr) { |
if (!execution_result()->IsEffect()) { |
Handle<Object> value = expr->value(); |
@@ -1575,7 +1531,6 @@ void BytecodeGenerator::VisitLiteral(Literal* expr) { |
} |
} |
- |
void BytecodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { |
// Materialize a regular expression literal. |
builder()->CreateRegExpLiteral(expr->pattern(), expr->literal_index(), |
@@ -1583,7 +1538,6 @@ void BytecodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
// Copy the literal boilerplate. |
int fast_clone_properties_count = 0; |
@@ -1787,7 +1741,6 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
execution_result()->SetResultInRegister(literal); |
} |
- |
void BytecodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { |
// Deep-copy the literal boilerplate. |
builder()->CreateArrayLiteral(expr->constant_elements(), |
@@ -1827,7 +1780,6 @@ void BytecodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitVariableProxy(VariableProxy* proxy) { |
builder()->SetExpressionPosition(proxy); |
VisitVariableLoad(proxy->var(), proxy->VariableFeedbackSlot()); |
@@ -2129,7 +2081,6 @@ void BytecodeGenerator::VisitVariableAssignment(Variable* variable, |
} |
} |
- |
void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); |
Register object, key, home_object, value; |
@@ -2357,7 +2308,6 @@ void BytecodeGenerator::VisitThrow(Throw* expr) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* expr) { |
LhsKind property_kind = Property::GetAssignType(expr); |
FeedbackVectorSlot slot = expr->PropertyFeedbackSlot(); |
@@ -2651,7 +2601,6 @@ void BytecodeGenerator::VisitCallNew(CallNew* expr) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
ZoneList<Expression*>* args = expr->arguments(); |
if (expr->is_jsruntime()) { |
@@ -2672,14 +2621,12 @@ void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
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 |
@@ -2694,14 +2641,12 @@ void BytecodeGenerator::VisitTypeOf(UnaryOperation* expr) { |
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: |
@@ -2727,7 +2672,6 @@ void BytecodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { |
} |
} |
- |
void BytecodeGenerator::VisitDelete(UnaryOperation* expr) { |
if (expr->expression()->IsProperty()) { |
// Delete of an object property is allowed both in sloppy |
@@ -2789,7 +2733,6 @@ void BytecodeGenerator::VisitDelete(UnaryOperation* expr) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitCountOperation(CountOperation* expr) { |
DCHECK(expr->expression()->IsValidReferenceExpressionOrThis()); |
@@ -2911,7 +2854,6 @@ void BytecodeGenerator::VisitCountOperation(CountOperation* expr) { |
} |
} |
- |
void BytecodeGenerator::VisitBinaryOperation(BinaryOperation* binop) { |
switch (binop->op()) { |
case Token::COMMA: |
@@ -2929,7 +2871,6 @@ void BytecodeGenerator::VisitBinaryOperation(BinaryOperation* binop) { |
} |
} |
- |
void BytecodeGenerator::VisitCompareOperation(CompareOperation* expr) { |
Register lhs = VisitForRegisterValue(expr->left()); |
VisitForAccumulatorValue(expr->right()); |
@@ -2938,7 +2879,6 @@ void BytecodeGenerator::VisitCompareOperation(CompareOperation* expr) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitArithmeticExpression(BinaryOperation* expr) { |
Register lhs = VisitForRegisterValue(expr->left()); |
VisitForAccumulatorValue(expr->right()); |
@@ -2946,39 +2886,32 @@ void BytecodeGenerator::VisitArithmeticExpression(BinaryOperation* expr) { |
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(); |
@@ -2997,7 +2930,6 @@ void BytecodeGenerator::VisitLogicalOrExpression(BinaryOperation* binop) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitLogicalAndExpression(BinaryOperation* binop) { |
Expression* left = binop->left(); |
Expression* right = binop->right(); |
@@ -3016,12 +2948,10 @@ void BytecodeGenerator::VisitLogicalAndExpression(BinaryOperation* binop) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitRewritableExpression(RewritableExpression* expr) { |
Visit(expr->expression()); |
} |
- |
void BytecodeGenerator::VisitNewLocalFunctionContext() { |
AccumulatorResultScope accumulator_execution_result(this); |
Scope* scope = this->scope(); |
@@ -3045,7 +2975,6 @@ void BytecodeGenerator::VisitNewLocalFunctionContext() { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitBuildLocalActivationContext() { |
Scope* scope = this->scope(); |
@@ -3074,7 +3003,6 @@ void BytecodeGenerator::VisitBuildLocalActivationContext() { |
} |
} |
- |
void BytecodeGenerator::VisitNewLocalBlockContext(Scope* scope) { |
AccumulatorResultScope accumulator_execution_result(this); |
DCHECK(scope->is_block_scope()); |
@@ -3128,7 +3056,6 @@ void BytecodeGenerator::VisitNewLocalCatchContext(Variable* variable) { |
execution_result()->SetResultInAccumulator(); |
} |
- |
void BytecodeGenerator::VisitObjectLiteralAccessor( |
Register home_object, ObjectLiteralProperty* property, Register value_out) { |
// TODO(rmcilroy): Replace value_out with VisitForRegister(); |
@@ -3154,7 +3081,6 @@ void BytecodeGenerator::VisitSetHomeObject(Register value, Register home_object, |
} |
} |
- |
void BytecodeGenerator::VisitArgumentsObject(Variable* variable) { |
if (variable == nullptr) return; |
@@ -3189,7 +3115,6 @@ void BytecodeGenerator::VisitThisFunctionVariable(Variable* variable) { |
VisitVariableAssignment(variable, Token::INIT, FeedbackVectorSlot::Invalid()); |
} |
- |
void BytecodeGenerator::VisitNewTargetVariable(Variable* variable) { |
if (variable == nullptr) return; |
@@ -3198,7 +3123,6 @@ void BytecodeGenerator::VisitNewTargetVariable(Variable* variable) { |
VisitVariableAssignment(variable, Token::INIT, FeedbackVectorSlot::Invalid()); |
} |
- |
void BytecodeGenerator::VisitFunctionClosureForContext() { |
AccumulatorResultScope accumulator_execution_result(this); |
Scope* closure_scope = execution_context()->scope()->ClosureScope(); |
@@ -3225,7 +3149,6 @@ void BytecodeGenerator::VisitFunctionClosureForContext() { |
execution_result()->SetResultInAccumulator(); |
} |
- |
// Visits the expression |expr| and places the result in the accumulator. |
void BytecodeGenerator::VisitForAccumulatorValue(Expression* expr) { |
AccumulatorResultScope accumulator_scope(this); |
@@ -3246,7 +3169,6 @@ void BytecodeGenerator::VisitForEffect(Expression* expr) { |
Visit(expr); |
} |
- |
// Visits the expression |expr| and returns the register containing |
// the expression result. |
Register BytecodeGenerator::VisitForRegisterValue(Expression* expr) { |
@@ -3270,12 +3192,10 @@ void BytecodeGenerator::VisitInScope(Statement* stmt, Scope* scope) { |
Visit(stmt); |
} |
- |
LanguageMode BytecodeGenerator::language_mode() const { |
return execution_context()->scope()->language_mode(); |
} |
- |
int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
return TypeFeedbackVector::GetIndex(slot); |
} |