| 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 {
|
|
|