| Index: src/interpreter/bytecode-generator.cc
|
| diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc
|
| index 6f3fcb5cdf625f082c30f0f89b21a643be8601b1..ef94d2cdfb0f6fdc7248edeb6cb8088978d1ac87 100644
|
| --- a/src/interpreter/bytecode-generator.cc
|
| +++ b/src/interpreter/bytecode-generator.cc
|
| @@ -2356,6 +2356,8 @@ void BytecodeGenerator::VisitArguments(ZoneList<Expression*>* args,
|
| void BytecodeGenerator::VisitCall(Call* expr) {
|
| Expression* callee_expr = expr->expression();
|
| Call::CallType call_type = expr->GetCallType();
|
| + bool possibly_eval = call_type == Call::POSSIBLY_EVAL_THROUGH_WITH_CALL ||
|
| + call_type == Call::POSSIBLY_EVAL_CALL;
|
|
|
| if (call_type == Call::SUPER_CALL) {
|
| return VisitCallSuper(expr);
|
| @@ -2392,25 +2394,23 @@ void BytecodeGenerator::VisitCall(Call* expr) {
|
| break;
|
| }
|
| case Call::WITH_CALL:
|
| - case Call::POSSIBLY_EVAL_CALL: {
|
| - if (callee_expr->AsVariableProxy()->var()->IsLookupSlot()) {
|
| - RegisterAllocationScope inner_register_scope(this);
|
| - Register name = register_allocator()->NewRegister();
|
| -
|
| - // Call %LoadLookupSlotForCall to get the callee and receiver.
|
| - DCHECK(Register::AreContiguous(callee, receiver));
|
| - RegisterList result_pair(callee.index(), 2);
|
| - Variable* variable = callee_expr->AsVariableProxy()->var();
|
| - builder()
|
| - ->LoadLiteral(variable->name())
|
| - .StoreAccumulatorInRegister(name)
|
| - .CallRuntimeForPair(Runtime::kLoadLookupSlotForCall, name,
|
| - result_pair);
|
| - break;
|
| - }
|
| - // Fall through.
|
| - DCHECK_EQ(call_type, Call::POSSIBLY_EVAL_CALL);
|
| + case Call::POSSIBLY_EVAL_THROUGH_WITH_CALL: {
|
| + DCHECK(callee_expr->AsVariableProxy()->var()->IsLookupSlot());
|
| + RegisterAllocationScope inner_register_scope(this);
|
| + Register name = register_allocator()->NewRegister();
|
| +
|
| + // Call %LoadLookupSlotForCall to get the callee and receiver.
|
| + DCHECK(Register::AreContiguous(callee, receiver));
|
| + RegisterList result_pair(callee.index(), 2);
|
| + Variable* variable = callee_expr->AsVariableProxy()->var();
|
| + builder()
|
| + ->LoadLiteral(variable->name())
|
| + .StoreAccumulatorInRegister(name)
|
| + .CallRuntimeForPair(Runtime::kLoadLookupSlotForCall, name,
|
| + result_pair);
|
| + break;
|
| }
|
| + case Call::POSSIBLY_EVAL_CALL:
|
| case Call::OTHER_CALL: {
|
| builder()->LoadUndefined().StoreAccumulatorInRegister(receiver);
|
| VisitForRegisterValue(callee_expr, callee);
|
| @@ -2439,8 +2439,7 @@ void BytecodeGenerator::VisitCall(Call* expr) {
|
|
|
| // Resolve callee for a potential direct eval call. This block will mutate the
|
| // callee value.
|
| - if (call_type == Call::POSSIBLY_EVAL_CALL &&
|
| - expr->arguments()->length() > 0) {
|
| + if (possibly_eval && expr->arguments()->length() > 0) {
|
| RegisterAllocationScope inner_register_scope(this);
|
| // Set up arguments for ResolvePossiblyDirectEval by copying callee, source
|
| // strings and function closure, and loading language and
|
|
|