Index: src/x87/full-codegen-x87.cc |
diff --git a/src/x87/full-codegen-x87.cc b/src/x87/full-codegen-x87.cc |
index f267fc49ddfd3da459a9e7679324af2453a13150..7b1a35dcd72d1dae92c8d8f5827dcebcd9957c52 100644 |
--- a/src/x87/full-codegen-x87.cc |
+++ b/src/x87/full-codegen-x87.cc |
@@ -1337,18 +1337,9 @@ void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, |
__ bind(&fast); |
} |
- // All extension objects were empty and it is safe to use a global |
- // load IC call. |
- __ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
- __ mov(LoadDescriptor::NameRegister(), proxy->var()->name()); |
- __ mov(LoadDescriptor::SlotRegister(), |
- Immediate(SmiFromSlot(proxy->VariableFeedbackSlot()))); |
- |
- ContextualMode mode = (typeof_state == INSIDE_TYPEOF) |
- ? NOT_CONTEXTUAL |
- : CONTEXTUAL; |
- |
- CallLoadIC(mode); |
+ // All extension objects were empty and it is safe to use a normal global |
+ // load machinery. |
+ EmitGlobalVariableLoad(proxy, typeof_state); |
} |
@@ -1414,7 +1405,23 @@ void FullCodeGenerator::EmitDynamicLookupFastCase(VariableProxy* proxy, |
} |
-void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) { |
+void FullCodeGenerator::EmitGlobalVariableLoad(VariableProxy* proxy, |
+ TypeofState typeof_state) { |
+ Variable* var = proxy->var(); |
+ DCHECK(var->IsUnallocatedOrGlobalSlot() || |
+ (var->IsLookupSlot() && var->mode() == DYNAMIC_GLOBAL)); |
+ __ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
+ __ mov(LoadDescriptor::NameRegister(), var->name()); |
+ __ mov(LoadDescriptor::SlotRegister(), |
+ Immediate(SmiFromSlot(proxy->VariableFeedbackSlot()))); |
+ // Inside typeof use a regular load, not a contextual load, to avoid |
+ // a reference error. |
+ CallLoadIC(typeof_state == NOT_INSIDE_TYPEOF ? CONTEXTUAL : NOT_CONTEXTUAL); |
+} |
+ |
+ |
+void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy, |
+ TypeofState typeof_state) { |
SetExpressionPosition(proxy); |
PrepareForBailoutForId(proxy->BeforeId(), NO_REGISTERS); |
Variable* var = proxy->var(); |
@@ -1425,11 +1432,7 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) { |
case VariableLocation::GLOBAL: |
case VariableLocation::UNALLOCATED: { |
Comment cmnt(masm_, "[ Global variable"); |
- __ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
- __ mov(LoadDescriptor::NameRegister(), var->name()); |
- __ mov(LoadDescriptor::SlotRegister(), |
- Immediate(SmiFromSlot(proxy->VariableFeedbackSlot()))); |
- CallGlobalLoadIC(var->name()); |
+ EmitGlobalVariableLoad(proxy, typeof_state); |
context()->Plug(eax); |
break; |
} |
@@ -1437,6 +1440,7 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) { |
case VariableLocation::PARAMETER: |
case VariableLocation::LOCAL: |
case VariableLocation::CONTEXT: { |
+ DCHECK_EQ(NOT_INSIDE_TYPEOF, typeof_state); |
Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable" |
: "[ Stack variable"); |
if (var->binding_needs_init()) { |
@@ -1509,11 +1513,15 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) { |
Label done, slow; |
// Generate code for loading from variables potentially shadowed |
// by eval-introduced variables. |
- EmitDynamicLookupFastCase(proxy, NOT_INSIDE_TYPEOF, &slow, &done); |
+ EmitDynamicLookupFastCase(proxy, typeof_state, &slow, &done); |
__ bind(&slow); |
__ push(esi); // Context. |
__ push(Immediate(var->name())); |
- __ CallRuntime(Runtime::kLoadLookupSlot, 2); |
+ Runtime::FunctionId function_id = |
+ typeof_state == NOT_INSIDE_TYPEOF |
+ ? Runtime::kLoadLookupSlot |
+ : Runtime::kLoadLookupSlotNoReferenceError; |
+ __ CallRuntime(function_id, 2); |
__ bind(&done); |
context()->Plug(eax); |
break; |
@@ -5082,45 +5090,6 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
} |
-void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { |
- VariableProxy* proxy = expr->AsVariableProxy(); |
- DCHECK(!context()->IsEffect()); |
- DCHECK(!context()->IsTest()); |
- |
- if (proxy != NULL && proxy->var()->IsUnallocatedOrGlobalSlot()) { |
- Comment cmnt(masm_, "[ Global variable"); |
- __ mov(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
- __ mov(LoadDescriptor::NameRegister(), Immediate(proxy->name())); |
- __ mov(LoadDescriptor::SlotRegister(), |
- Immediate(SmiFromSlot(proxy->VariableFeedbackSlot()))); |
- // Use a regular load, not a contextual load, to avoid a reference |
- // error. |
- CallLoadIC(NOT_CONTEXTUAL); |
- PrepareForBailout(expr, TOS_REG); |
- context()->Plug(eax); |
- } else if (proxy != NULL && proxy->var()->IsLookupSlot()) { |
- Comment cmnt(masm_, "[ Lookup slot"); |
- Label done, slow; |
- |
- // Generate code for loading from variables potentially shadowed |
- // by eval-introduced variables. |
- EmitDynamicLookupFastCase(proxy, INSIDE_TYPEOF, &slow, &done); |
- |
- __ bind(&slow); |
- __ push(esi); |
- __ push(Immediate(proxy->name())); |
- __ CallRuntime(Runtime::kLoadLookupSlotNoReferenceError, 2); |
- PrepareForBailout(expr, TOS_REG); |
- __ bind(&done); |
- |
- context()->Plug(eax); |
- } else { |
- // This expression cannot throw a reference error at the top level. |
- VisitInDuplicateContext(expr); |
- } |
-} |
- |
- |
void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr, |
Expression* sub_expr, |
Handle<String> check) { |