Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index 9b46e7ff21629e36d358fa56f2de546a3f3eefb1..071c7a2c1cfda70436e9e4e665ff6617b19a9163 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -1606,16 +1606,16 @@ void BytecodeGenerator::VisitCall(Call* expr) { |
// Prepare the callee and the receiver to the function call. This depends on |
// the semantics of the underlying call type. |
- Register callee = execution_result()->NewRegister(); |
// The receiver and arguments need to be allocated consecutively for |
- // Call(). Future optimizations could avoid this there are no |
+ // Call(). We allocate the callee and receiver consecutively for calls to |
+ // kLoadLookupSlot. Future optimizations could avoid this there are no |
// arguments or the receiver and arguments are already consecutive. |
ZoneList<Expression*>* args = expr->arguments(); |
- execution_result()->PrepareForConsecutiveAllocations(args->length() + 1); |
+ execution_result()->PrepareForConsecutiveAllocations(args->length() + 2); |
+ Register callee = execution_result()->NextConsecutiveRegister(); |
Register receiver = execution_result()->NextConsecutiveRegister(); |
- bool possibly_eval = false; |
switch (call_type) { |
case Call::NAMED_PROPERTY_CALL: |
case Call::KEYED_PROPERTY_CALL: { |
@@ -1636,30 +1636,26 @@ void BytecodeGenerator::VisitCall(Call* expr) { |
builder()->StoreAccumulatorInRegister(callee); |
break; |
} |
+ case Call::LOOKUP_SLOT_CALL: |
case Call::POSSIBLY_EVAL_CALL: { |
- possibly_eval = true; |
if (callee_expr->AsVariableProxy()->var()->IsLookupSlot()) { |
TemporaryRegisterScope temporary_register_scope(builder()); |
temporary_register_scope.PrepareForConsecutiveAllocations(2); |
Register context = temporary_register_scope.NextConsecutiveRegister(); |
Register name = temporary_register_scope.NextConsecutiveRegister(); |
+ // Call LoadLookupSlot to get the callee and receiver. |
+ DCHECK(Register::AreContiguous(callee, receiver)); |
Variable* variable = callee_expr->AsVariableProxy()->var(); |
builder() |
->MoveRegister(Register::function_context(), context) |
.LoadLiteral(variable->name()) |
- .StoreAccumulatorInRegister(name); |
- |
- // Call LoadLookupSlot to get the callee and receiver. Reuse the context |
- // and name arguments as the return registers (since these are |
- // consecutive), and them move into callee and receiver registers. |
- builder() |
- ->CallRuntimeForPair(Runtime::kLoadLookupSlot, context, 2, context) |
- .MoveRegister(context, callee) |
- .MoveRegister(name, receiver); |
+ .StoreAccumulatorInRegister(name) |
+ .CallRuntimeForPair(Runtime::kLoadLookupSlot, context, 2, callee); |
break; |
} |
// Fall through. |
+ DCHECK_EQ(call_type, Call::POSSIBLY_EVAL_CALL); |
} |
case Call::OTHER_CALL: { |
builder()->LoadUndefined().StoreAccumulatorInRegister(receiver); |
@@ -1669,7 +1665,6 @@ void BytecodeGenerator::VisitCall(Call* expr) { |
} |
case Call::NAMED_SUPER_PROPERTY_CALL: |
case Call::KEYED_SUPER_PROPERTY_CALL: |
- case Call::LOOKUP_SLOT_CALL: |
case Call::SUPER_CALL: |
UNIMPLEMENTED(); |
} |
@@ -1681,7 +1676,7 @@ void BytecodeGenerator::VisitCall(Call* expr) { |
// Resolve callee for a potential direct eval call. This block will mutate the |
// callee value. |
- if (possibly_eval && args->length() > 0) { |
+ if (call_type == Call::POSSIBLY_EVAL_CALL && args->length() > 0) { |
TemporaryRegisterScope temporary_register_scope(builder()); |
temporary_register_scope.PrepareForConsecutiveAllocations(5); |
Register callee_for_eval = |