Revision: 4431
Author: [email protected]
Date: Thu Apr 15 07:43:32 2010
Log: Fix constant offset check for inlined write barrier to work in cases
when offset is given from tagged object pointer.
Review URL: http://codereview.chromium.org/1646008
http://code.google.com/p/v8/source/detail?r=4431
Modified:
/branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc
/branches/bleeding_edge/src/x64/macro-assembler-x64.cc
=======================================
--- /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc Thu Apr 15
05:41:30 2010
+++ /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc Thu Apr 15
07:43:32 2010
@@ -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);
=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Thu Apr 15
05:41:30 2010
+++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Thu Apr 15
07:43:32 2010
@@ -226,7 +226,17 @@
cmpq(scratch, kScratchRegister);
j(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 page, or is in the first "page" of a large object page.
+ // 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(scratch, Operand(object, offset));
ASSERT(is_int32(Page::kPageAlignmentMask));
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
To unsubscribe, reply using "remove me" as the subject.