Reviewers: William Hesse,
Description:
Fix constant offset check for inlined write barrier to work in cases when
offset
is given from tagged object pointer.
Please review this at http://codereview.chromium.org/1646008/show
SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/
Affected files:
M src/ia32/macro-assembler-ia32.cc
M src/x64/macro-assembler-x64.cc
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,18 @@
InNewSpace(object, value, equal, &done);
- if ((offset > 0) && (offset < Page::kMaxHeapObjectSize)) {
+ // We are storing pointer to an object so either offset or
+ // offset + kHeapObjectTag should be pointer size aligned
+ // depending on whether register object contains untagged
+ // or tagged pointer to heap object.
+ ASSERT(IsAligned(offset, kPointerSize) ||
+ IsAligned(offset + kHeapObjectTag, kPointerSize));
+
+ // We are using fast write barrier for small offsets (rset bits
corresponding
+ // to them are at the beggining of the page). We are comparing against
+ // Page::kMaxHeapObjectSize - kHeapObjectTag to catch cases when pointer
in
+ // object register is tagged and offset was adjusted to accomodate that.
+ 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);
Index: src/x64/macro-assembler-x64.cc
===================================================================
--- src/x64/macro-assembler-x64.cc (revision 4428)
+++ src/x64/macro-assembler-x64.cc (working copy)
@@ -226,7 +226,18 @@
cmpq(scratch, kScratchRegister);
j(equal, &done);
- if ((offset > 0) && (offset < Page::kMaxHeapObjectSize)) {
+ // We are storing pointer to an object so either offset or
+ // offset + kHeapObjectTag should be pointer size aligned
+ // depending on whether register object contains untagged
+ // or tagged pointer to heap object.
+ ASSERT(IsAligned(offset, kPointerSize) ||
+ IsAligned(offset + kHeapObjectTag, kPointerSize));
+
+ // We are using fast write barrier for small offsets (rset bits
corresponding
+ // to them are at the beggining of the page). We are comparing against
+ // Page::kMaxHeapObjectSize - kHeapObjectTag to catch cases when pointer
in
+ // object register is tagged and offset was adjusted to accomodate that.
+ 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.