Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 4174) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -3763,6 +3763,21 @@ |
} |
} |
+ // The update expression resets the type of the loop variable. So we |
+ // set it to smi before compiling the test expression. |
+ if (node->is_fast_smi_loop()) { |
+ // Set number type of the loop variable to smi. |
+ Slot* slot = node->loop_variable()->slot(); |
+ ASSERT(slot->type() == Slot::LOCAL); |
+ frame_->SetTypeForLocalAt(slot->index(), NumberInfo::Smi()); |
+ if (FLAG_debug_code) { |
+ frame_->PushLocalAt(slot->index()); |
+ Result var = frame_->Pop(); |
+ var.ToRegister(); |
+ __ AbortIfNotSmi(var.reg(), "Loop variable not a smi."); |
+ } |
+ } |
+ |
// Based on the condition analysis, compile the backward jump as |
// necessary. |
switch (info) { |
@@ -6867,7 +6882,12 @@ |
old_value = allocator_->Allocate(); |
ASSERT(old_value.is_valid()); |
__ mov(old_value.reg(), new_value.reg()); |
+ |
+ // The return value for postfix operations is the |
+ // same as the input, and has the same number info. |
+ old_value.set_number_info(new_value.number_info()); |
} |
+ |
// Ensure the new value is writable. |
frame_->Spill(new_value.reg()); |
@@ -6931,6 +6951,13 @@ |
} |
deferred->BindExit(); |
+ // The result of ++ or -- is an Integer32 if the |
+ // input is a smi. Otherwise it is a number. |
+ if (new_value.is_smi()) { |
+ new_value.set_number_info(NumberInfo::Integer32()); |
+ } else { |
+ new_value.set_number_info(NumberInfo::Number()); |
+ } |
// Postfix: store the old value in the allocated slot under the |
// reference. |