Index: src/full-codegen/full-codegen.cc |
diff --git a/src/full-codegen/full-codegen.cc b/src/full-codegen/full-codegen.cc |
index 1bd12d511087c9ffad97d1724ea6e154ae0a6174..6cf3aef7e63f74f713066ee9275e50b7c1c26324 100644 |
--- a/src/full-codegen/full-codegen.cc |
+++ b/src/full-codegen/full-codegen.cc |
@@ -162,8 +162,8 @@ void FullCodeGenerator::Initialize() { |
masm_->set_predictable_code_size(true); |
} |
- |
-void FullCodeGenerator::PrepareForBailout(Expression* node, State state) { |
+void FullCodeGenerator::PrepareForBailout(Expression* node, |
+ BailoutState state) { |
PrepareForBailoutForId(node->id(), state); |
} |
@@ -186,9 +186,9 @@ void FullCodeGenerator::RecordJSReturnSite(Call* call) { |
// if the function was inlined, i.e., this is the return address in the |
// inlined function's frame. |
// |
- // The state is ignored. We defensively set it to TOS_REG, which is the |
- // real state of the unoptimized code at the return site. |
- PrepareForBailoutForId(call->ReturnId(), TOS_REG); |
+ // The bailout state is ignored. We defensively set it to TOS_REGISTER, which |
+ // is the real state of the unoptimized code at the return site. |
+ PrepareForBailoutForId(call->ReturnId(), BailoutState::TOS_REGISTER); |
#ifdef DEBUG |
// In debug builds, mark the return so we can verify that this function |
// was called. |
@@ -197,13 +197,13 @@ void FullCodeGenerator::RecordJSReturnSite(Call* call) { |
#endif |
} |
- |
-void FullCodeGenerator::PrepareForBailoutForId(BailoutId id, State state) { |
+void FullCodeGenerator::PrepareForBailoutForId(BailoutId id, |
+ BailoutState state) { |
// There's no need to prepare this code for bailouts from already optimized |
// code or code that can't be optimized. |
if (!info_->HasDeoptimizationSupport()) return; |
unsigned pc_and_state = |
- StateField::encode(state) | PcField::encode(masm_->pc_offset()); |
+ BailoutStateField::encode(state) | PcField::encode(masm_->pc_offset()); |
DCHECK(Smi::IsValid(pc_and_state)); |
#ifdef DEBUG |
for (int i = 0; i < bailout_entries_.length(); ++i) { |
@@ -750,7 +750,7 @@ void FullCodeGenerator::VisitLogicalExpression(BinaryOperation* expr) { |
} else { |
VisitForControl(left, test->true_label(), &eval_right, &eval_right); |
} |
- PrepareForBailoutForId(right_id, NO_REGISTERS); |
+ PrepareForBailoutForId(right_id, BailoutState::NO_REGISTERS); |
__ bind(&eval_right); |
} else if (context()->IsAccumulatorValue()) { |
@@ -769,7 +769,7 @@ void FullCodeGenerator::VisitLogicalExpression(BinaryOperation* expr) { |
__ jmp(&done); |
__ bind(&discard); |
__ Drop(1); |
- PrepareForBailoutForId(right_id, NO_REGISTERS); |
+ PrepareForBailoutForId(right_id, BailoutState::NO_REGISTERS); |
} else if (context()->IsStackValue()) { |
VisitForAccumulatorValue(left); |
@@ -784,7 +784,7 @@ void FullCodeGenerator::VisitLogicalExpression(BinaryOperation* expr) { |
} |
__ bind(&discard); |
__ Drop(1); |
- PrepareForBailoutForId(right_id, NO_REGISTERS); |
+ PrepareForBailoutForId(right_id, BailoutState::NO_REGISTERS); |
} else { |
DCHECK(context()->IsEffect()); |
@@ -794,7 +794,7 @@ void FullCodeGenerator::VisitLogicalExpression(BinaryOperation* expr) { |
} else { |
VisitForControl(left, &done, &eval_right, &eval_right); |
} |
- PrepareForBailoutForId(right_id, NO_REGISTERS); |
+ PrepareForBailoutForId(right_id, BailoutState::NO_REGISTERS); |
__ bind(&eval_right); |
} |
@@ -852,7 +852,7 @@ void FullCodeGenerator::VisitProperty(Property* expr) { |
EmitKeyedSuperPropertyLoad(expr); |
} |
} |
- PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
+ PrepareForBailoutForId(expr->LoadId(), BailoutState::TOS_REGISTER); |
context()->Plug(result_register()); |
} |
@@ -864,7 +864,7 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { |
if (proxy != NULL && (proxy->var()->IsUnallocatedOrGlobalSlot() || |
proxy->var()->IsLookupSlot())) { |
EmitVariableLoad(proxy, INSIDE_TYPEOF); |
- PrepareForBailout(proxy, TOS_REG); |
+ PrepareForBailout(proxy, BailoutState::TOS_REGISTER); |
} else { |
// This expression cannot throw a reference error at the top level. |
VisitInDuplicateContext(expr); |
@@ -912,24 +912,24 @@ void FullCodeGenerator::VisitIfStatement(IfStatement* stmt) { |
if (stmt->HasElseStatement()) { |
VisitForControl(stmt->condition(), &then_part, &else_part, &then_part); |
- PrepareForBailoutForId(stmt->ThenId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ThenId(), BailoutState::NO_REGISTERS); |
__ bind(&then_part); |
Visit(stmt->then_statement()); |
__ jmp(&done); |
- PrepareForBailoutForId(stmt->ElseId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ElseId(), BailoutState::NO_REGISTERS); |
__ bind(&else_part); |
Visit(stmt->else_statement()); |
} else { |
VisitForControl(stmt->condition(), &then_part, &done, &then_part); |
- PrepareForBailoutForId(stmt->ThenId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ThenId(), BailoutState::NO_REGISTERS); |
__ bind(&then_part); |
Visit(stmt->then_statement()); |
- PrepareForBailoutForId(stmt->ElseId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ElseId(), BailoutState::NO_REGISTERS); |
} |
__ bind(&done); |
- PrepareForBailoutForId(stmt->IfId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->IfId(), BailoutState::NO_REGISTERS); |
} |
void FullCodeGenerator::EmitContinue(Statement* target) { |
@@ -1093,7 +1093,7 @@ void FullCodeGenerator::EmitPropertyKey(ObjectLiteralProperty* property, |
BailoutId bailout_id) { |
VisitForStackValue(property->key()); |
CallRuntimeWithOperands(Runtime::kToName); |
- PrepareForBailoutForId(bailout_id, NO_REGISTERS); |
+ PrepareForBailoutForId(bailout_id, BailoutState::NO_REGISTERS); |
PushOperand(result_register()); |
} |
@@ -1119,12 +1119,12 @@ void FullCodeGenerator::VisitWithStatement(WithStatement* stmt) { |
Callable callable = CodeFactory::ToObject(isolate()); |
__ Move(callable.descriptor().GetRegisterParameter(0), result_register()); |
__ Call(callable.code(), RelocInfo::CODE_TARGET); |
- PrepareForBailoutForId(stmt->ToObjectId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ToObjectId(), BailoutState::NO_REGISTERS); |
PushOperand(result_register()); |
PushFunctionArgumentForContextAllocation(); |
CallRuntimeWithOperands(Runtime::kPushWithContext); |
StoreToFrameField(StandardFrameConstants::kContextOffset, context_register()); |
- PrepareForBailoutForId(stmt->EntryId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->EntryId(), BailoutState::NO_REGISTERS); |
Scope* saved_scope = scope(); |
scope_ = stmt->scope(); |
@@ -1156,7 +1156,7 @@ void FullCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) { |
// Record the position of the do while condition and make sure it is |
// possible to break on the condition. |
__ bind(loop_statement.continue_label()); |
- PrepareForBailoutForId(stmt->ContinueId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ContinueId(), BailoutState::NO_REGISTERS); |
// Here is the actual 'while' keyword. |
SetExpressionAsStatementPosition(stmt->cond()); |
@@ -1166,12 +1166,12 @@ void FullCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) { |
&book_keeping); |
// Check stack before looping. |
- PrepareForBailoutForId(stmt->BackEdgeId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->BackEdgeId(), BailoutState::NO_REGISTERS); |
__ bind(&book_keeping); |
EmitBackEdgeBookkeeping(stmt, &body); |
__ jmp(&body); |
- PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ExitId(), BailoutState::NO_REGISTERS); |
__ bind(loop_statement.break_label()); |
decrement_loop_depth(); |
} |
@@ -1192,7 +1192,7 @@ void FullCodeGenerator::VisitWhileStatement(WhileStatement* stmt) { |
loop_statement.break_label(), |
&body); |
- PrepareForBailoutForId(stmt->BodyId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->BodyId(), BailoutState::NO_REGISTERS); |
__ bind(&body); |
Visit(stmt->body()); |
@@ -1202,7 +1202,7 @@ void FullCodeGenerator::VisitWhileStatement(WhileStatement* stmt) { |
EmitBackEdgeBookkeeping(stmt, &loop); |
__ jmp(&loop); |
- PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ExitId(), BailoutState::NO_REGISTERS); |
__ bind(loop_statement.break_label()); |
decrement_loop_depth(); |
} |
@@ -1225,11 +1225,11 @@ void FullCodeGenerator::VisitForStatement(ForStatement* stmt) { |
// Emit the test at the bottom of the loop (even if empty). |
__ jmp(&test); |
- PrepareForBailoutForId(stmt->BodyId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->BodyId(), BailoutState::NO_REGISTERS); |
__ bind(&body); |
Visit(stmt->body()); |
- PrepareForBailoutForId(stmt->ContinueId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ContinueId(), BailoutState::NO_REGISTERS); |
__ bind(loop_statement.continue_label()); |
if (stmt->next() != NULL) { |
SetStatementPosition(stmt->next()); |
@@ -1250,7 +1250,7 @@ void FullCodeGenerator::VisitForStatement(ForStatement* stmt) { |
__ jmp(&body); |
} |
- PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ExitId(), BailoutState::NO_REGISTERS); |
__ bind(loop_statement.break_label()); |
decrement_loop_depth(); |
} |
@@ -1286,12 +1286,12 @@ void FullCodeGenerator::VisitForOfStatement(ForOfStatement* stmt) { |
Visit(stmt->body()); |
// Check stack before looping. |
- PrepareForBailoutForId(stmt->BackEdgeId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->BackEdgeId(), BailoutState::NO_REGISTERS); |
EmitBackEdgeBookkeeping(stmt, loop_statement.continue_label()); |
__ jmp(loop_statement.continue_label()); |
// Exit and decrement the loop depth. |
- PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->ExitId(), BailoutState::NO_REGISTERS); |
__ bind(loop_statement.break_label()); |
decrement_loop_depth(); |
} |
@@ -1435,7 +1435,7 @@ void FullCodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) { |
__ DebugBreak(); |
// Ignore the return value. |
- PrepareForBailoutForId(stmt->DebugBreakId(), NO_REGISTERS); |
+ PrepareForBailoutForId(stmt->DebugBreakId(), BailoutState::NO_REGISTERS); |
} |
@@ -1450,7 +1450,7 @@ void FullCodeGenerator::VisitConditional(Conditional* expr) { |
VisitForControl(expr->condition(), &true_case, &false_case, &true_case); |
int original_stack_depth = operand_stack_depth_; |
- PrepareForBailoutForId(expr->ThenId(), NO_REGISTERS); |
+ PrepareForBailoutForId(expr->ThenId(), BailoutState::NO_REGISTERS); |
__ bind(&true_case); |
SetExpressionPosition(expr->then_expression()); |
if (context()->IsTest()) { |
@@ -1465,7 +1465,7 @@ void FullCodeGenerator::VisitConditional(Conditional* expr) { |
} |
operand_stack_depth_ = original_stack_depth; |
- PrepareForBailoutForId(expr->ElseId(), NO_REGISTERS); |
+ PrepareForBailoutForId(expr->ElseId(), BailoutState::NO_REGISTERS); |
__ bind(&false_case); |
SetExpressionPosition(expr->else_expression()); |
VisitInDuplicateContext(expr->else_expression()); |
@@ -1516,7 +1516,7 @@ void FullCodeGenerator::VisitClassLiteral(ClassLiteral* lit) { |
PushOperand(Smi::FromInt(lit->end_position())); |
CallRuntimeWithOperands(Runtime::kDefineClass); |
- PrepareForBailoutForId(lit->CreateLiteralId(), TOS_REG); |
+ PrepareForBailoutForId(lit->CreateLiteralId(), BailoutState::TOS_REGISTER); |
PushOperand(result_register()); |
// Load the "prototype" from the constructor. |
@@ -1525,7 +1525,7 @@ void FullCodeGenerator::VisitClassLiteral(ClassLiteral* lit) { |
Heap::kprototype_stringRootIndex); |
__ Move(LoadDescriptor::SlotRegister(), SmiFromSlot(lit->PrototypeSlot())); |
CallLoadIC(NOT_INSIDE_TYPEOF); |
- PrepareForBailoutForId(lit->PrototypeId(), TOS_REG); |
+ PrepareForBailoutForId(lit->PrototypeId(), BailoutState::TOS_REGISTER); |
PushOperand(result_register()); |
EmitClassDefineProperties(lit); |
@@ -1666,7 +1666,7 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
VisitForStackValue(args->at(i)); |
} |
- PrepareForBailoutForId(expr->CallId(), NO_REGISTERS); |
+ PrepareForBailoutForId(expr->CallId(), BailoutState::NO_REGISTERS); |
EmitCallJSRuntimeFunction(expr); |
context()->DropAndPlug(1, result_register()); |
@@ -1688,7 +1688,7 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
} |
// Call the C runtime function. |
- PrepareForBailoutForId(expr->CallId(), NO_REGISTERS); |
+ PrepareForBailoutForId(expr->CallId(), BailoutState::NO_REGISTERS); |
__ CallRuntime(expr->function(), arg_count); |
OperandStackDepthDecrement(arg_count); |
context()->Plug(result_register()); |
@@ -1877,7 +1877,7 @@ FullCodeGenerator::EnterBlockScopeIfNeeded::EnterBlockScopeIfNeeded( |
saved_scope_ = codegen_->scope(); |
if (scope == NULL) { |
- codegen_->PrepareForBailoutForId(entry_id, NO_REGISTERS); |
+ codegen_->PrepareForBailoutForId(entry_id, BailoutState::NO_REGISTERS); |
needs_block_context_ = false; |
} else { |
needs_block_context_ = scope->NeedsContext(); |
@@ -1894,12 +1894,13 @@ FullCodeGenerator::EnterBlockScopeIfNeeded::EnterBlockScopeIfNeeded( |
codegen_->context_register()); |
} |
CHECK_EQ(0, scope->num_stack_slots()); |
- codegen_->PrepareForBailoutForId(entry_id, NO_REGISTERS); |
+ codegen_->PrepareForBailoutForId(entry_id, BailoutState::NO_REGISTERS); |
} |
{ |
Comment cmnt(masm(), "[ Declarations"); |
codegen_->VisitDeclarations(scope->declarations()); |
- codegen_->PrepareForBailoutForId(declarations_id, NO_REGISTERS); |
+ codegen_->PrepareForBailoutForId(declarations_id, |
+ BailoutState::NO_REGISTERS); |
} |
} |
} |
@@ -1913,7 +1914,7 @@ FullCodeGenerator::EnterBlockScopeIfNeeded::~EnterBlockScopeIfNeeded() { |
codegen_->StoreToFrameField(StandardFrameConstants::kContextOffset, |
codegen_->context_register()); |
} |
- codegen_->PrepareForBailoutForId(exit_id_, NO_REGISTERS); |
+ codegen_->PrepareForBailoutForId(exit_id_, BailoutState::NO_REGISTERS); |
codegen_->scope_ = saved_scope_; |
} |