Index: src/x64/lithium-codegen-x64.cc |
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc |
index f08c56e1f79856a4e445eb60fb1a072e1b3785b4..b35790297570b20f830c5c523734358c4fff520b 100644 |
--- a/src/x64/lithium-codegen-x64.cc |
+++ b/src/x64/lithium-codegen-x64.cc |
@@ -3921,6 +3921,19 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
Register value = ToRegister(instr->value()); |
__ Integer32ToSmi(value, value); |
} |
+ } else if (FLAG_track_heap_object_fields && representation.IsHeapObject()) { |
+ if (instr->value()->IsConstantOperand()) { |
+ LConstantOperand* operand_value = LConstantOperand::cast(instr->value()); |
+ if (IsInteger32Constant(operand_value)) { |
+ DeoptimizeIf(no_condition, instr->environment()); |
+ } |
+ } else { |
+ if (!instr->hydrogen()->value()->type().IsHeapObject()) { |
+ Register value = ToRegister(instr->value()); |
+ Condition cc = masm()->CheckSmi(value); |
+ DeoptimizeIf(cc, instr->environment()); |
+ } |
+ } |
} else if (FLAG_track_double_fields && representation.IsDouble()) { |
ASSERT(transition.is_null()); |
ASSERT(instr->is_in_object()); |