Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index ec272f532420d54cd13c3286a7ca3bb472db8595..39eacf7d7cf4bac20e63b4c112229273a8659154 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()); |
} |
@@ -3847,7 +3843,7 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
HValue* context = BuildContextChainWalk(var); |
HStoreContextSlot* instr = |
- new(zone()) HStoreContextSlot(context, var->index(), Top()); |
+ new(zone()) HStoreContextSlot(context, var, 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,16 @@ void HGraphBuilder::VisitAssignment(Assignment* expr) { |
CHECK_ALIVE(VisitForValue(expr->value())); |
HValue* context = BuildContextChainWalk(var); |
- HStoreContextSlot* instr = |
- new(zone()) HStoreContextSlot(context, var->index(), Top()); |
+ HStoreContextSlot* instr; |
+ if (expr->op() == Token::ASSIGN) { |
+ instr = new(zone()) HStoreContextSlot(context, var, Top()); |
+ } else { |
+ ASSERT(expr->op() == Token::INIT_VAR || |
+ expr->op() == Token::INIT_LET || |
+ expr->op() == Token::INIT_CONST_HARMONY); |
+ instr = new(zone()) HStoreContextSlot( |
+ context, var->index(), HStoreContextSlot::kAssign, Top()); |
+ } |
AddInstruction(instr); |
if (instr->HasObservableSideEffects()) { |
AddSimulate(expr->AssignmentId()); |
@@ -5640,7 +5637,7 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
HValue* context = BuildContextChainWalk(var); |
HStoreContextSlot* instr = |
- new(zone()) HStoreContextSlot(context, var->index(), after); |
+ new(zone()) HStoreContextSlot(context, var, after); |
AddInstruction(instr); |
if (instr->HasObservableSideEffects()) { |
AddSimulate(expr->AssignmentId()); |
@@ -6232,8 +6229,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->index(), HStoreContextSlot::kAssign, value); |
AddInstruction(store); |
if (store->HasObservableSideEffects()) AddSimulate(proxy->id()); |
} else { |