| Index: src/ppc/full-codegen-ppc.cc
|
| diff --git a/src/ppc/full-codegen-ppc.cc b/src/ppc/full-codegen-ppc.cc
|
| index c80f104dc97b397096c3f630266cf76adfe2dc68..ec94a242b4a1473d8661918c071eda09c877dbcc 100644
|
| --- a/src/ppc/full-codegen-ppc.cc
|
| +++ b/src/ppc/full-codegen-ppc.cc
|
| @@ -1387,14 +1387,9 @@ void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
|
| __ bind(&fast);
|
| }
|
|
|
| - __ LoadP(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
| - __ mov(LoadDescriptor::NameRegister(), Operand(proxy->var()->name()));
|
| - __ mov(LoadDescriptor::SlotRegister(),
|
| - Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
| -
|
| - ContextualMode mode =
|
| - (typeof_state == INSIDE_TYPEOF) ? NOT_CONTEXTUAL : CONTEXTUAL;
|
| - CallLoadIC(mode);
|
| + // All extension objects were empty and it is safe to use a normal global
|
| + // load machinery.
|
| + EmitGlobalVariableLoad(proxy, typeof_state);
|
| }
|
|
|
|
|
| @@ -1462,7 +1457,23 @@ void FullCodeGenerator::EmitDynamicLookupFastCase(VariableProxy* proxy,
|
| }
|
|
|
|
|
| -void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) {
|
| +void FullCodeGenerator::EmitGlobalVariableLoad(VariableProxy* proxy,
|
| + TypeofState typeof_state) {
|
| + Variable* var = proxy->var();
|
| + DCHECK(var->IsUnallocatedOrGlobalSlot() ||
|
| + (var->IsLookupSlot() && var->mode() == DYNAMIC_GLOBAL));
|
| + __ LoadP(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
| + __ mov(LoadDescriptor::NameRegister(), Operand(var->name()));
|
| + __ mov(LoadDescriptor::SlotRegister(),
|
| + Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
| + // Inside typeof use a regular load, not a contextual load, to avoid
|
| + // a reference error.
|
| + CallLoadIC(typeof_state == NOT_INSIDE_TYPEOF ? CONTEXTUAL : NOT_CONTEXTUAL);
|
| +}
|
| +
|
| +
|
| +void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy,
|
| + TypeofState typeof_state) {
|
| // Record position before possible IC call.
|
| SetExpressionPosition(proxy);
|
| PrepareForBailoutForId(proxy->BeforeId(), NO_REGISTERS);
|
| @@ -1474,11 +1485,7 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) {
|
| case VariableLocation::GLOBAL:
|
| case VariableLocation::UNALLOCATED: {
|
| Comment cmnt(masm_, "[ Global variable");
|
| - __ LoadP(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
| - __ mov(LoadDescriptor::NameRegister(), Operand(var->name()));
|
| - __ mov(LoadDescriptor::SlotRegister(),
|
| - Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
| - CallGlobalLoadIC(var->name());
|
| + EmitGlobalVariableLoad(proxy, typeof_state);
|
| context()->Plug(r3);
|
| break;
|
| }
|
| @@ -1486,6 +1493,7 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) {
|
| case VariableLocation::PARAMETER:
|
| case VariableLocation::LOCAL:
|
| case VariableLocation::CONTEXT: {
|
| + DCHECK_EQ(NOT_INSIDE_TYPEOF, typeof_state);
|
| Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable"
|
| : "[ Stack variable");
|
| if (var->binding_needs_init()) {
|
| @@ -1559,11 +1567,15 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) {
|
| Label done, slow;
|
| // Generate code for loading from variables potentially shadowed
|
| // by eval-introduced variables.
|
| - EmitDynamicLookupFastCase(proxy, NOT_INSIDE_TYPEOF, &slow, &done);
|
| + EmitDynamicLookupFastCase(proxy, typeof_state, &slow, &done);
|
| __ bind(&slow);
|
| __ mov(r4, Operand(var->name()));
|
| __ Push(cp, r4); // Context and name.
|
| - __ CallRuntime(Runtime::kLoadLookupSlot, 2);
|
| + Runtime::FunctionId function_id =
|
| + typeof_state == NOT_INSIDE_TYPEOF
|
| + ? Runtime::kLoadLookupSlot
|
| + : Runtime::kLoadLookupSlotNoReferenceError;
|
| + __ CallRuntime(function_id, 2);
|
| __ bind(&done);
|
| context()->Plug(r3);
|
| }
|
| @@ -5178,44 +5190,6 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| }
|
|
|
|
|
| -void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
|
| - DCHECK(!context()->IsEffect());
|
| - DCHECK(!context()->IsTest());
|
| - VariableProxy* proxy = expr->AsVariableProxy();
|
| - if (proxy != NULL && proxy->var()->IsUnallocatedOrGlobalSlot()) {
|
| - Comment cmnt(masm_, "[ Global variable");
|
| - __ LoadP(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
|
| - __ mov(LoadDescriptor::NameRegister(), Operand(proxy->name()));
|
| - __ mov(LoadDescriptor::SlotRegister(),
|
| - Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
|
| - // Use a regular load, not a contextual load, to avoid a reference
|
| - // error.
|
| - CallLoadIC(NOT_CONTEXTUAL);
|
| - PrepareForBailout(expr, TOS_REG);
|
| - context()->Plug(r3);
|
| - } else if (proxy != NULL && proxy->var()->IsLookupSlot()) {
|
| - Comment cmnt(masm_, "[ Lookup slot");
|
| - Label done, slow;
|
| -
|
| - // Generate code for loading from variables potentially shadowed
|
| - // by eval-introduced variables.
|
| - EmitDynamicLookupFastCase(proxy, INSIDE_TYPEOF, &slow, &done);
|
| -
|
| - __ bind(&slow);
|
| - __ mov(r3, Operand(proxy->name()));
|
| - __ Push(cp, r3);
|
| - __ CallRuntime(Runtime::kLoadLookupSlotNoReferenceError, 2);
|
| - PrepareForBailout(expr, TOS_REG);
|
| - __ bind(&done);
|
| -
|
| - context()->Plug(r3);
|
| - } else {
|
| - // This expression cannot throw a reference error at the top level.
|
| - VisitInDuplicateContext(expr);
|
| - }
|
| -}
|
| -
|
| -
|
| void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr,
|
| Expression* sub_expr,
|
| Handle<String> check) {
|
|
|