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