| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 03e666c1e4942409fb621a680eb370e851c3354f..7bdc02f79c7da451c614949dac604c742906c1fc 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -7618,27 +7618,6 @@ bool HOptimizedGraphBuilder::TryCallApply(Call* expr) {
|
| }
|
|
|
|
|
| -void HOptimizedGraphBuilder::InstallGlobalReceiverInExpressionStack(
|
| - int receiver_index,
|
| - Handle<JSFunction> function) {
|
| - // TODO(dcarney): Fix deserializer to be able to hookup the global receiver
|
| - // and object during deserialization and embed the global receiver here
|
| - // directly.
|
| - // Install global receiver on stack.
|
| - HValue* function_constant = Add<HConstant>(function);
|
| - HValue* context = Add<HLoadNamedField>(
|
| - function_constant,
|
| - HObjectAccess::ForJSObjectOffset(JSFunction::kContextOffset));
|
| - HValue* global_object = Add<HLoadNamedField>(
|
| - context,
|
| - HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX));
|
| - HValue* global_receiver = Add<HLoadNamedField>(
|
| - global_object,
|
| - HObjectAccess::ForJSObjectOffset(GlobalObject::kGlobalReceiverOffset));
|
| - environment()->SetExpressionStackAt(receiver_index, global_receiver);
|
| -}
|
| -
|
| -
|
| void HOptimizedGraphBuilder::VisitCall(Call* expr) {
|
| ASSERT(!HasStackOverflow());
|
| ASSERT(current_block() != NULL);
|
| @@ -7759,11 +7738,13 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) {
|
| HValue* function = Pop();
|
| Add<HCheckValue>(function, expr->target());
|
|
|
| - // Install global receiver on stack.
|
| + // 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.
|
| const int receiver_index = argument_count - 1;
|
| ASSERT(environment()->ExpressionStackAt(receiver_index)->
|
| IsGlobalObject());
|
| - InstallGlobalReceiverInExpressionStack(receiver_index, expr->target());
|
| + environment()->SetExpressionStackAt(receiver_index, global_receiver);
|
|
|
| if (TryInlineBuiltinFunctionCall(expr, false)) { // Nothing to drop.
|
| if (FLAG_trace_inlining) {
|
| @@ -7780,12 +7761,9 @@ 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<HCallGlobal>(var->name(), argument_count));
|
| + call = PreProcessCall(New<HCallNamed>(var->name(), argument_count));
|
| } else {
|
| call = PreProcessCall(New<HCallKnownGlobal>(
|
| expr->target(), argument_count));
|
| @@ -7810,12 +7788,6 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) {
|
| CHECK_ALIVE(VisitExpressions(expr->arguments()));
|
| Add<HCheckValue>(function, expr->target());
|
|
|
| - // Install global receiver on stack.
|
| - const int receiver_index = argument_count - 1;
|
| - ASSERT(environment()->ExpressionStackAt(receiver_index)->
|
| - IsGlobalReceiver());
|
| - InstallGlobalReceiverInExpressionStack(receiver_index, expr->target());
|
| -
|
| if (TryInlineBuiltinFunctionCall(expr, true)) { // Drop the function.
|
| if (FLAG_trace_inlining) {
|
| PrintF("Inlining builtin ");
|
| @@ -7836,11 +7808,12 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) {
|
| } else {
|
| CHECK_ALIVE(VisitForValue(expr->expression()));
|
| HValue* function = Top();
|
| - HValue* receiver = graph()->GetConstantHole();
|
| + HGlobalObject* global_object = Add<HGlobalObject>();
|
| + HGlobalReceiver* receiver = Add<HGlobalReceiver>(global_object);
|
| Push(Add<HPushArgument>(receiver));
|
| CHECK_ALIVE(VisitArgumentList(expr->arguments()));
|
| - call = New<HCallFunction>(
|
| - function, argument_count, NORMAL_CONTEXTUAL_CALL);
|
| +
|
| + call = New<HCallFunction>(function, argument_count);
|
| Drop(argument_count + 1);
|
| }
|
| }
|
|
|