Index: src/ia32/macro-assembler-ia32.cc |
=================================================================== |
--- src/ia32/macro-assembler-ia32.cc (revision 4428) |
+++ src/ia32/macro-assembler-ia32.cc (working copy) |
@@ -143,7 +143,17 @@ |
InNewSpace(object, value, equal, &done); |
- if ((offset > 0) && (offset < Page::kMaxHeapObjectSize)) { |
+ // The offset is relative to a tagged or untagged HeapObject pointer, |
+ // so either offset or offset + kHeapObjectTag must be a |
+ // multiple of kPointerSize. |
+ ASSERT(IsAligned(offset, kPointerSize) || |
+ IsAligned(offset + kHeapObjectTag, kPointerSize)); |
+ |
+ // We use optimized write barrier code if the word being written to is not in |
+ // a large object chunk or is in the first page of a large object chunk. |
+ // We make sure that an offset is inside the right limits whether it is |
+ // tagged or untagged. |
+ if ((offset > 0) && (offset < Page::kMaxHeapObjectSize - kHeapObjectTag)) { |
// Compute the bit offset in the remembered set, leave it in 'value'. |
lea(value, Operand(object, offset)); |
and_(value, Page::kPageAlignmentMask); |