| Index: src/mips/full-codegen-mips.cc
|
| diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc
|
| index 48c176acdba7961a4648bf19c3c64fc9acd0041c..8e38ef5c6d76eb5c31f5ac6fd053b66c3b3d620a 100644
|
| --- a/src/mips/full-codegen-mips.cc
|
| +++ b/src/mips/full-codegen-mips.cc
|
| @@ -200,7 +200,7 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
|
| // Copy any necessary parameters into the context.
|
| int num_parameters = info->scope()->num_parameters();
|
| for (int i = 0; i < num_parameters; i++) {
|
| - Slot* slot = scope()->parameter(i)->AsSlot();
|
| + Slot* slot = scope()->parameter(i)->rewrite();
|
| if (slot != NULL && slot->type() == Slot::CONTEXT) {
|
| int parameter_offset = StandardFrameConstants::kCallerSPOffset +
|
| (num_parameters - 1 - i) * kPointerSize;
|
| @@ -252,7 +252,7 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
|
| ArgumentsAccessStub stub(type);
|
| __ CallStub(&stub);
|
|
|
| - Move(arguments->AsSlot(), v0, a1, a2);
|
| + Move(arguments->rewrite(), v0, a1, a2);
|
| }
|
|
|
| if (FLAG_trace) {
|
| @@ -633,6 +633,7 @@ MemOperand FullCodeGenerator::EmitSlotSearch(Slot* slot, Register scratch) {
|
| return ContextOperand(scratch, slot->index());
|
| }
|
| case Slot::LOOKUP:
|
| + case Slot::GLOBAL:
|
| UNREACHABLE();
|
| }
|
| UNREACHABLE();
|
| @@ -696,7 +697,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
|
| FunctionLiteral* function) {
|
| Comment cmnt(masm_, "[ Declaration");
|
| ASSERT(variable != NULL); // Must have been resolved.
|
| - Slot* slot = variable->AsSlot();
|
| + Slot* slot = variable->rewrite();
|
| ASSERT(slot != NULL);
|
| switch (slot->type()) {
|
| case Slot::PARAMETER:
|
| @@ -769,6 +770,9 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
|
| __ CallRuntime(Runtime::kDeclareContextSlot, 4);
|
| break;
|
| }
|
| +
|
| + case Slot::GLOBAL:
|
| + UNREACHABLE();
|
| }
|
| }
|
|
|
| @@ -1189,7 +1193,7 @@ void FullCodeGenerator::EmitDynamicLoadFromSlotFastCase(
|
| EmitLoadGlobalSlotCheckExtensions(slot, typeof_state, slow);
|
| __ Branch(done);
|
| } else if (slot->var()->mode() == Variable::DYNAMIC_LOCAL) {
|
| - Slot* potential_slot = slot->var()->local_if_not_shadowed()->AsSlot();
|
| + Slot* potential_slot = slot->var()->local_if_not_shadowed()->rewrite();
|
| Expression* rewrite = slot->var()->local_if_not_shadowed()->rewrite();
|
| if (potential_slot != NULL) {
|
| // Generate fast case for locals that rewrite to slots.
|
| @@ -1215,7 +1219,7 @@ void FullCodeGenerator::EmitDynamicLoadFromSlotFastCase(
|
| // variables. Then load the argument from the arguments
|
| // object using keyed load.
|
| __ lw(a1,
|
| - ContextSlotOperandCheckExtensions(obj_proxy->var()->AsSlot(),
|
| + ContextSlotOperandCheckExtensions(obj_proxy->var()->rewrite(),
|
| slow));
|
| __ li(a0, Operand(key_literal->handle()));
|
| Handle<Code> ic =
|
| @@ -1236,7 +1240,7 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) {
|
|
|
| // Three cases: non-this global variables, lookup slots, and all other
|
| // types of slots.
|
| - Slot* slot = var->AsSlot();
|
| + Slot* slot = var->rewrite();
|
| ASSERT((var->is_global() && !var->is_this()) == (slot == NULL));
|
|
|
| if (slot == NULL) {
|
| @@ -1833,7 +1837,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) {
|
| void FullCodeGenerator::EmitVariableAssignment(Variable* var,
|
| Token::Value op) {
|
| ASSERT(var != NULL);
|
| - ASSERT(var->is_global() || var->AsSlot() != NULL);
|
| + ASSERT(var->is_global() || var->rewrite() != NULL);
|
|
|
| if (var->is_global()) {
|
| ASSERT(!var->is_this());
|
| @@ -1853,7 +1857,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
|
| // scope. However, unlike var initializers, const initializers are able
|
| // to drill a hole to that function context, even from inside a 'with'
|
| // context. We thus bypass the normal static scope lookup.
|
| - Slot* slot = var->AsSlot();
|
| + Slot* slot = var->rewrite();
|
| Label skip;
|
| switch (slot->type()) {
|
| case Slot::PARAMETER:
|
| @@ -1874,6 +1878,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
|
| __ Push(cp, a0); // Context and name.
|
| __ CallRuntime(Runtime::kInitializeConstContextSlot, 3);
|
| break;
|
| + case Slot::GLOBAL:
|
| + UNREACHABLE();
|
| }
|
| __ bind(&skip);
|
| } else if (var->mode() == Variable::LET && op != Token::INIT_LET) {
|
| @@ -1930,7 +1936,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
|
| } else if (var->mode() != Variable::CONST) {
|
| // Perform the assignment for non-const variables. Const assignments
|
| // are simply skipped.
|
| - Slot* slot = var->AsSlot();
|
| + Slot* slot = var->rewrite();
|
| switch (slot->type()) {
|
| case Slot::PARAMETER:
|
| case Slot::LOCAL:
|
| @@ -1957,6 +1963,9 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
|
| __ Push(cp, a1, a0); // Context, name, strict mode.
|
| __ CallRuntime(Runtime::kStoreContextSlot, 4);
|
| break;
|
| +
|
| + case Slot::GLOBAL:
|
| + UNREACHABLE();
|
| }
|
| }
|
| }
|
| @@ -2224,9 +2233,9 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
| // in generated code. If we succeed, there is no need to perform a
|
| // context lookup in the runtime system.
|
| Label done;
|
| - if (var->AsSlot() != NULL && var->mode() == Variable::DYNAMIC_GLOBAL) {
|
| + if (var->rewrite() != NULL && var->mode() == Variable::DYNAMIC_GLOBAL) {
|
| Label slow;
|
| - EmitLoadGlobalSlotCheckExtensions(var->AsSlot(),
|
| + EmitLoadGlobalSlotCheckExtensions(var->rewrite(),
|
| NOT_INSIDE_TYPEOF,
|
| &slow);
|
| // Push the function and resolve eval.
|
| @@ -2264,15 +2273,15 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
| __ lw(a0, GlobalObjectOperand());
|
| __ push(a0);
|
| EmitCallWithIC(expr, var->name(), RelocInfo::CODE_TARGET_CONTEXT);
|
| - } else if (var != NULL && var->AsSlot() != NULL &&
|
| - var->AsSlot()->type() == Slot::LOOKUP) {
|
| + } else if (var != NULL && var->rewrite() != NULL &&
|
| + var->rewrite()->type() == Slot::LOOKUP) {
|
| // Call to a lookup slot (dynamically introduced variable).
|
| Label slow, done;
|
|
|
| { PreservePositionScope scope(masm()->positions_recorder());
|
| // Generate code for loading from variables potentially shadowed
|
| // by eval-introduced variables.
|
| - EmitDynamicLoadFromSlotFastCase(var->AsSlot(),
|
| + EmitDynamicLoadFromSlotFastCase(var->rewrite(),
|
| NOT_INSIDE_TYPEOF,
|
| &slow,
|
| &done);
|
| @@ -3677,8 +3686,8 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
|
| __ Push(a2, a1, a0);
|
| __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION);
|
| context()->Plug(v0);
|
| - } else if (var->AsSlot() != NULL &&
|
| - var->AsSlot()->type() != Slot::LOOKUP) {
|
| + } else if (var->rewrite() != NULL &&
|
| + var->rewrite()->type() != Slot::LOOKUP) {
|
| // Result of deleting non-global, non-dynamic variables is false.
|
| // The subexpression does not have side effects.
|
| context()->Plug(false);
|
| @@ -3968,13 +3977,13 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
|
| PrepareForBailout(expr, TOS_REG);
|
| context()->Plug(v0);
|
| } else if (proxy != NULL &&
|
| - proxy->var()->AsSlot() != NULL &&
|
| - proxy->var()->AsSlot()->type() == Slot::LOOKUP) {
|
| + proxy->var()->rewrite() != NULL &&
|
| + proxy->var()->rewrite()->type() == Slot::LOOKUP) {
|
| Label done, slow;
|
|
|
| // Generate code for loading from variables potentially shadowed
|
| // by eval-introduced variables.
|
| - Slot* slot = proxy->var()->AsSlot();
|
| + Slot* slot = proxy->var()->rewrite();
|
| EmitDynamicLoadFromSlotFastCase(slot, INSIDE_TYPEOF, &slow, &done);
|
|
|
| __ bind(&slow);
|
|
|