Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 176dd9fa77a04f8c401cef6fd8da191bd736cefa..ac63cbd8328310396aafdad9be5c45203ef384f3 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -7730,13 +7730,13 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
| HValue* function = Pop(); |
| Add<HCheckValue>(function, expr->target()); |
| - // Replace the global object with the global receiver. |
| - HGlobalReceiver* global_receiver = Add<HGlobalReceiver>(global_object); |
| - // Index of the receiver from the top of the expression stack. |
| + // Install global receiver on stack. |
| + Handle<JSObject> global_receiver( |
| + expr->target()->context()->global_object()->global_receiver()); |
|
Toon Verwaest
2013/12/18 13:09:33
context()->global_proxy()
Weren't you planning on
|
| const int receiver_index = argument_count - 1; |
| - ASSERT(environment()->ExpressionStackAt(receiver_index)-> |
| - IsGlobalObject()); |
| - environment()->SetExpressionStackAt(receiver_index, global_receiver); |
| + HConstant* global_receiver_constant = Add<HConstant>(global_receiver); |
| + environment()->SetExpressionStackAt( |
| + receiver_index, global_receiver_constant); |
| if (TryInlineBuiltinFunctionCall(expr, false)) { // Nothing to drop. |
| if (FLAG_trace_inlining) { |
| @@ -7753,9 +7753,12 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
| } |
| if (CallStubCompiler::HasCustomCallGenerator(expr->target())) { |
| + // We're about to install a contextual IC, which expects the global |
| + // object as receiver rather than the global proxy. |
| + environment()->SetExpressionStackAt(receiver_index, global_object); |
| // When the target has a custom call IC generator, use the IC, |
| // because it is likely to generate better code. |
| - call = PreProcessCall(New<HCallNamed>(var->name(), argument_count)); |
| + call = PreProcessCall(New<HCallGlobal>(var->name(), argument_count)); |
| } else { |
| call = PreProcessCall(New<HCallKnownGlobal>( |
| expr->target(), argument_count)); |
| @@ -7774,11 +7777,16 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
| // evaluation of the arguments. |
| CHECK_ALIVE(VisitForValue(expr->expression())); |
| HValue* function = Top(); |
| - HGlobalObject* global = Add<HGlobalObject>(); |
| - HGlobalReceiver* receiver = Add<HGlobalReceiver>(global); |
| - Push(receiver); |
| + Push(graph()->GetConstantUndefined()); |
| CHECK_ALIVE(VisitExpressions(expr->arguments())); |
| Add<HCheckValue>(function, expr->target()); |
| + // Install global receiver on stack. |
| + Handle<JSObject> global_receiver( |
| + expr->target()->context()->global_object()->global_receiver()); |
| + const int receiver_index = argument_count - 1; |
| + HConstant* global_receiver_constant = Add<HConstant>(global_receiver); |
| + environment()->SetExpressionStackAt( |
| + receiver_index, global_receiver_constant); |
| if (TryInlineBuiltinFunctionCall(expr, true)) { // Drop the function. |
| if (FLAG_trace_inlining) { |
| @@ -7800,12 +7808,11 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
| } else { |
| CHECK_ALIVE(VisitForValue(expr->expression())); |
| HValue* function = Top(); |
| - HGlobalObject* global_object = Add<HGlobalObject>(); |
| - HGlobalReceiver* receiver = Add<HGlobalReceiver>(global_object); |
| + HValue* receiver = graph()->GetConstantHole(); |
| Push(Add<HPushArgument>(receiver)); |
| CHECK_ALIVE(VisitArgumentList(expr->arguments())); |
| - |
| - call = New<HCallFunction>(function, argument_count); |
| + call = New<HCallFunction>( |
| + function, argument_count, NORMAL_CONTEXTUAL_CALL); |
| Drop(argument_count + 1); |
| } |
| } |