Index: src/x64/full-codegen-x64.cc |
diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc |
index 3b4c07c89c9f9a22a720463119c82834db915352..d05c69da55c60a9ef7c76c1254a87d9669cb3be6 100644 |
--- a/src/x64/full-codegen-x64.cc |
+++ b/src/x64/full-codegen-x64.cc |
@@ -2658,10 +2658,9 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
Comment cmnt(masm_, "[ Call"); |
Expression* callee = expr->expression(); |
- VariableProxy* proxy = callee->AsVariableProxy(); |
- Property* property = callee->AsProperty(); |
+ Call::CallType call_type = expr->GetCallType(isolate()); |
- if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) { |
+ if (call_type == Call::POSSIBLY_EVAL_CALL) { |
// In a call to eval, we first call %ResolvePossiblyDirectEval to |
// resolve the function we need to call and the receiver of the call. |
// Then we call the resolved function using the given arguments. |
@@ -2695,13 +2694,15 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
// Restore context register. |
__ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
context()->DropAndPlug(1, rax); |
- } else if (proxy != NULL && proxy->var()->IsUnallocated()) { |
+ } else if (call_type == Call::GLOBAL_CALL) { |
// Call to a global variable. Push global object as receiver for the |
// call IC lookup. |
__ push(GlobalObjectOperand()); |
+ VariableProxy* proxy = callee->AsVariableProxy(); |
EmitCallWithIC(expr, proxy->name(), CONTEXTUAL); |
- } else if (proxy != NULL && proxy->var()->IsLookupSlot()) { |
+ } else if (call_type == Call::LOOKUP_SLOT_CALL) { |
// Call to a lookup slot (dynamically introduced variable). |
+ VariableProxy* proxy = callee->AsVariableProxy(); |
Label slow, done; |
{ PreservePositionScope scope(masm()->positions_recorder()); |
@@ -2735,7 +2736,8 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
// The receiver is either the global receiver or an object found by |
// LoadContextSlot. |
EmitCallWithStub(expr); |
- } else if (property != NULL) { |
+ } else if (call_type == Call::PROPERTY_CALL) { |
+ Property* property = callee->AsProperty(); |
{ PreservePositionScope scope(masm()->positions_recorder()); |
VisitForStackValue(property->obj()); |
} |
@@ -2747,6 +2749,7 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
EmitKeyedCallWithIC(expr, property->key()); |
} |
} else { |
+ ASSERT(call_type == Call::OTHER_CALL); |
// Call to an arbitrary expression not handled specially above. |
{ PreservePositionScope scope(masm()->positions_recorder()); |
VisitForStackValue(callee); |