Index: src/full-codegen/mips/full-codegen-mips.cc |
diff --git a/src/full-codegen/mips/full-codegen-mips.cc b/src/full-codegen/mips/full-codegen-mips.cc |
index 20555de3687945f9c95e264ced1900e5333aaa93..52b66e53d675a577db2550527c8c127368e7b73d 100644 |
--- a/src/full-codegen/mips/full-codegen-mips.cc |
+++ b/src/full-codegen/mips/full-codegen-mips.cc |
@@ -3032,83 +3032,38 @@ void FullCodeGenerator::PushCalleeAndWithBaseObject(Call* expr) { |
} |
-void FullCodeGenerator::VisitCall(Call* expr) { |
-#ifdef DEBUG |
- // We want to verify that RecordJSReturnSite gets called on all paths |
- // through this function. Avoid early returns. |
- expr->return_is_recorded_ = false; |
-#endif |
- |
- Comment cmnt(masm_, "[ Call"); |
- Expression* callee = expr->expression(); |
- Call::CallType call_type = expr->GetCallType(isolate()); |
- |
- if (call_type == Call::POSSIBLY_EVAL_CALL) { |
- // In a call to eval, we first call RuntimeHidden_ResolvePossiblyDirectEval |
- // to resolve the function we need to call. Then we call the resolved |
- // function using the given arguments. |
- ZoneList<Expression*>* args = expr->arguments(); |
- int arg_count = args->length(); |
- PushCalleeAndWithBaseObject(expr); |
- |
- // Push the arguments. |
- for (int i = 0; i < arg_count; i++) { |
- VisitForStackValue(args->at(i)); |
- } |
+void FullCodeGenerator::EmitPossiblyEvalCall(Call* expr) { |
+ // In a call to eval, we first call RuntimeHidden_ResolvePossiblyDirectEval |
+ // to resolve the function we need to call. Then we call the resolved |
+ // function using the given arguments. |
+ ZoneList<Expression*>* args = expr->arguments(); |
+ int arg_count = args->length(); |
+ PushCalleeAndWithBaseObject(expr); |
- // Push a copy of the function (found below the arguments) and |
- // resolve eval. |
- __ lw(a1, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
- __ push(a1); |
- EmitResolvePossiblyDirectEval(arg_count); |
+ // Push the arguments. |
+ for (int i = 0; i < arg_count; i++) { |
+ VisitForStackValue(args->at(i)); |
+ } |
- // Touch up the stack with the resolved function. |
- __ sw(v0, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
+ // Push a copy of the function (found below the arguments) and |
+ // resolve eval. |
+ __ lw(a1, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
+ __ push(a1); |
+ EmitResolvePossiblyDirectEval(arg_count); |
- PrepareForBailoutForId(expr->EvalId(), NO_REGISTERS); |
- // Record source position for debugger. |
- SetCallPosition(expr, arg_count); |
- CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS); |
- __ lw(a1, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
- __ CallStub(&stub); |
- RecordJSReturnSite(expr); |
- // Restore context register. |
- __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
- context()->DropAndPlug(1, v0); |
- } else if (call_type == Call::GLOBAL_CALL) { |
- EmitCallWithLoadIC(expr); |
- } else if (call_type == Call::LOOKUP_SLOT_CALL) { |
- // Call to a lookup slot (dynamically introduced variable). |
- PushCalleeAndWithBaseObject(expr); |
- EmitCall(expr); |
- } else if (call_type == Call::NAMED_PROPERTY_CALL) { |
- Property* property = callee->AsProperty(); |
- VisitForStackValue(property->obj()); |
- EmitCallWithLoadIC(expr); |
- } else if (call_type == Call::KEYED_PROPERTY_CALL) { |
- Property* property = callee->AsProperty(); |
- VisitForStackValue(property->obj()); |
- EmitKeyedCallWithLoadIC(expr, property->key()); |
- } else if (call_type == Call::NAMED_SUPER_PROPERTY_CALL) { |
- EmitSuperCallWithLoadIC(expr); |
- } else if (call_type == Call::KEYED_SUPER_PROPERTY_CALL) { |
- EmitKeyedSuperCallWithLoadIC(expr); |
- } else if (call_type == Call::SUPER_CALL) { |
- EmitSuperConstructorCall(expr); |
- } else { |
- DCHECK(call_type == Call::OTHER_CALL); |
- // Call to an arbitrary expression not handled specially above. |
- VisitForStackValue(callee); |
- __ LoadRoot(a1, Heap::kUndefinedValueRootIndex); |
- __ push(a1); |
- // Emit function call. |
- EmitCall(expr); |
- } |
+ // Touch up the stack with the resolved function. |
+ __ sw(v0, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
-#ifdef DEBUG |
- // RecordJSReturnSite should have been called. |
- DCHECK(expr->return_is_recorded_); |
-#endif |
+ PrepareForBailoutForId(expr->EvalId(), NO_REGISTERS); |
+ // Record source position for debugger. |
+ SetCallPosition(expr, arg_count); |
+ CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS); |
+ __ lw(a1, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
+ __ CallStub(&stub); |
+ RecordJSReturnSite(expr); |
+ // Restore context register. |
+ __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
+ context()->DropAndPlug(1, v0); |
} |