Index: src/ia32/full-codegen-ia32.cc |
=================================================================== |
--- src/ia32/full-codegen-ia32.cc (revision 7211) |
+++ src/ia32/full-codegen-ia32.cc (working copy) |
@@ -1543,27 +1543,26 @@ |
} |
} |
+ // For compound assignments we need another deoptimization point after the |
+ // variable/property load. |
if (expr->is_compound()) { |
{ AccumulatorValueContext context(this); |
switch (assign_type) { |
case VARIABLE: |
EmitVariableLoad(expr->target()->AsVariableProxy()->var()); |
+ PrepareForBailout(expr->target(), TOS_REG); |
break; |
case NAMED_PROPERTY: |
EmitNamedPropertyLoad(property); |
+ PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG); |
break; |
case KEYED_PROPERTY: |
EmitKeyedPropertyLoad(property); |
+ PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG); |
break; |
} |
} |
- // For property compound assignments we need another deoptimization |
- // point after the property load. |
- if (property != NULL) { |
- PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG); |
- } |
- |
Token::Value op = expr->binary_op(); |
__ push(eax); // Left operand goes on the stack. |
VisitForAccumulatorValue(expr->value()); |
@@ -3748,7 +3747,11 @@ |
// We need a second deoptimization point after loading the value |
// in case evaluating the property load my have a side effect. |
- PrepareForBailout(expr->increment(), TOS_REG); |
+ if (assign_type == VARIABLE) { |
+ PrepareForBailout(expr->expression(), TOS_REG); |
+ } else { |
+ PrepareForBailout(expr->increment(), TOS_REG); |
+ } |
// Call ToNumber only if operand is not a smi. |
NearLabel no_conversion; |