Index: src/arm/full-codegen-arm.cc |
=================================================================== |
--- src/arm/full-codegen-arm.cc (revision 7211) |
+++ src/arm/full-codegen-arm.cc (working copy) |
@@ -1604,27 +1604,26 @@ |
break; |
} |
+ // 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(r0); // Left operand goes on the stack. |
VisitForAccumulatorValue(expr->value()); |
@@ -3805,7 +3804,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. |
Label no_conversion; |