Index: src/ia32/macro-assembler-ia32.cc |
diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc |
index 33044bac733474e53c1aafaf219d2eff9f5c39fd..25a0a95974e90633f87a6069b19542bd7cc6a061 100644 |
--- a/src/ia32/macro-assembler-ia32.cc |
+++ b/src/ia32/macro-assembler-ia32.cc |
@@ -2595,15 +2595,37 @@ |
void MacroAssembler::LoadHeapObject(Register result, |
Handle<HeapObject> object) { |
- mov(result, object); |
+ AllowDeferredHandleDereference embedding_raw_address; |
+ if (isolate()->heap()->InNewSpace(*object)) { |
+ Handle<Cell> cell = isolate()->factory()->NewCell(object); |
+ mov(result, Operand::ForCell(cell)); |
+ } else { |
+ mov(result, object); |
+ } |
} |
void MacroAssembler::CmpHeapObject(Register reg, Handle<HeapObject> object) { |
- cmp(reg, object); |
-} |
- |
-void MacroAssembler::PushHeapObject(Handle<HeapObject> object) { Push(object); } |
+ AllowDeferredHandleDereference using_raw_address; |
+ if (isolate()->heap()->InNewSpace(*object)) { |
+ Handle<Cell> cell = isolate()->factory()->NewCell(object); |
+ cmp(reg, Operand::ForCell(cell)); |
+ } else { |
+ cmp(reg, object); |
+ } |
+} |
+ |
+ |
+void MacroAssembler::PushHeapObject(Handle<HeapObject> object) { |
+ AllowDeferredHandleDereference using_raw_address; |
+ if (isolate()->heap()->InNewSpace(*object)) { |
+ Handle<Cell> cell = isolate()->factory()->NewCell(object); |
+ push(Operand::ForCell(cell)); |
+ } else { |
+ Push(object); |
+ } |
+} |
+ |
void MacroAssembler::CmpWeakValue(Register value, Handle<WeakCell> cell, |
Register scratch) { |