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); |