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); |