Chromium Code Reviews| Index: src/hydrogen.cc |
| =================================================================== |
| --- src/hydrogen.cc (revision 6795) |
| +++ src/hydrogen.cc (working copy) |
| @@ -3375,10 +3375,6 @@ |
| BinaryOperation* operation = expr->binary_operation(); |
| if (var != NULL) { |
| - if (!var->is_global() && !var->IsStackAllocated()) { |
| - BAILOUT("non-stack/non-global in compound assignment"); |
| - } |
| - |
| VISIT_FOR_VALUE(operation); |
| if (var->is_global()) { |
| @@ -3386,8 +3382,16 @@ |
| Top(), |
| expr->position(), |
| expr->AssignmentId()); |
| + } else if (var->IsStackAllocated()) { |
| + Bind(var, Top()); |
| + } else if (var->IsContextSlot()) { |
| + HValue* context = BuildContextChainWalk(var); |
| + int index = var->AsSlot()->index(); |
| + HStoreContextSlot* instr = new HStoreContextSlot(context, index, Top()); |
| + AddInstruction(instr); |
| + if (instr->HasSideEffects()) AddSimulate(expr->AssignmentId()); |
| } else { |
| - Bind(var, Top()); |
| + BAILOUT("compound assignment to lookup slot"); |
| } |
| ast_context()->ReturnValue(Pop()); |
| @@ -4704,10 +4708,6 @@ |
| bool inc = expr->op() == Token::INC; |
| if (var != NULL) { |
| - if (!var->is_global() && !var->IsStackAllocated()) { |
| - BAILOUT("non-stack/non-global variable in count operation"); |
| - } |
| - |
| VISIT_FOR_VALUE(target); |
| // Match the full code generator stack by simulating an extra stack |
| @@ -4723,9 +4723,16 @@ |
| after, |
| expr->position(), |
| expr->AssignmentId()); |
| + } else if (var->IsStackAllocated()) { |
| + Bind(var, after); |
| + } else if (var->IsContextSlot()) { |
| + HValue* context = BuildContextChainWalk(var); |
| + int index = var->AsSlot()->index(); |
| + HStoreContextSlot* instr = new HStoreContextSlot(context, index, after); |
| + AddInstruction(instr); |
| + if (instr->HasSideEffects()) AddSimulate(expr->AssignmentId()); |
| } else { |
| - ASSERT(var->IsStackAllocated()); |
| - Bind(var, after); |
| + BAILOUT("non-stack/non-global variable in count operation"); |
|
Kevin Millikin (Chromium)
2011/02/15 16:34:58
"non-stack/non-global" ==> "lookup"
|
| } |
| Drop(has_extra ? 2 : 1); |
| ast_context()->ReturnValue(expr->is_postfix() ? before : after); |