Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index ec272f532420d54cd13c3286a7ca3bb472db8595..2ab964c59484daf2f3b16eb79962ac6886eea661 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -3285,15 +3285,11 @@ void HGraphBuilder::VisitVariableProxy(VariableProxy* expr) { |
} |
case Variable::CONTEXT: { |
- if (variable->mode() == LET || variable->mode() == CONST_HARMONY) { |
- return Bailout("reference to harmony declared context slot"); |
- } |
if (variable->mode() == CONST) { |
return Bailout("reference to const context slot"); |
} |
HValue* context = BuildContextChainWalk(variable); |
- HLoadContextSlot* instr = |
- new(zone()) HLoadContextSlot(context, variable->index()); |
+ HLoadContextSlot* instr = new(zone()) HLoadContextSlot(context, variable); |
return ast_context()->ReturnInstruction(instr, expr->id()); |
} |
@@ -3846,8 +3842,8 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
} |
HValue* context = BuildContextChainWalk(var); |
- HStoreContextSlot* instr = |
- new(zone()) HStoreContextSlot(context, var->index(), Top()); |
+ HStoreContextSlot* instr = new(zone()) HStoreContextSlot( |
+ context, var, HStoreContextSlot::kAssign, Top()); |
AddInstruction(instr); |
if (instr->HasObservableSideEffects()) { |
AddSimulate(expr->AssignmentId()); |
@@ -3967,17 +3963,10 @@ void HGraphBuilder::VisitAssignment(Assignment* expr) { |
// variables (e.g. initialization inside a loop). |
HValue* old_value = environment()->Lookup(var); |
AddInstruction(new HUseConst(old_value)); |
- } else if (var->mode() == LET) { |
- if (!var->IsStackAllocated()) { |
- return Bailout("assignment to let context slot"); |
- } |
} else if (var->mode() == CONST_HARMONY) { |
if (expr->op() != Token::INIT_CONST_HARMONY) { |
return Bailout("non-initializer assignment to const"); |
} |
- if (!var->IsStackAllocated()) { |
- return Bailout("assignment to const context slot"); |
- } |
} |
if (proxy->IsArguments()) return Bailout("assignment to arguments"); |
@@ -4029,8 +4018,10 @@ void HGraphBuilder::VisitAssignment(Assignment* expr) { |
CHECK_ALIVE(VisitForValue(expr->value())); |
HValue* context = BuildContextChainWalk(var); |
+ HStoreContextSlot::Mode mode = (expr->op() == Token::ASSIGN) |
+ ? HStoreContextSlot::kAssign : HStoreContextSlot::kInitialize; |
HStoreContextSlot* instr = |
- new(zone()) HStoreContextSlot(context, var->index(), Top()); |
+ new(zone()) HStoreContextSlot(context, var, mode, Top()); |
AddInstruction(instr); |
if (instr->HasObservableSideEffects()) { |
AddSimulate(expr->AssignmentId()); |
@@ -5639,8 +5630,8 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
} |
HValue* context = BuildContextChainWalk(var); |
- HStoreContextSlot* instr = |
- new(zone()) HStoreContextSlot(context, var->index(), after); |
+ HStoreContextSlot* instr = new(zone()) HStoreContextSlot( |
+ context, var, HStoreContextSlot::kAssign, after); |
AddInstruction(instr); |
if (instr->HasObservableSideEffects()) { |
AddSimulate(expr->AssignmentId()); |
@@ -6232,8 +6223,8 @@ void HGraphBuilder::HandleDeclaration(VariableProxy* proxy, |
} |
if (var->IsContextSlot()) { |
HValue* context = environment()->LookupContext(); |
- HStoreContextSlot* store = |
- new HStoreContextSlot(context, var->index(), value); |
+ HStoreContextSlot* store = new HStoreContextSlot( |
+ context, var, HStoreContextSlot::kInitialize, value); |
AddInstruction(store); |
if (store->HasObservableSideEffects()) AddSimulate(proxy->id()); |
} else { |