There are a bunch of places where to do pointer arithmetic, v8 mashes things
into uint32_t's.  intptr_t's are the more correct way of doing this so that
it's always the right size.  These are the fixes for space.h, space-inl.h,
and one fix to heap.cc to make sure that things work.

Test built on ia32-linux.  Is there an equivalent to 'make check' on SCons?

Index: src/spaces-inl.h
===================================================================
--- src/spaces-inl.h    (revision 1129)
+++ src/spaces-inl.h    (working copy)
@@ -102,7 +102,7 @@
 //    page_address + words * 4

 Address Page::ComputeRSetBitPosition(Address address, int offset,
-                                     uint32_t* bitmask) {
+                                     intptr_t* bitmask) {
   ASSERT(Page::is_rset_in_use());

   Page* page = Page::FromAddress(address);
@@ -137,7 +137,7 @@


 void Page::SetRSet(Address address, int offset) {
-  uint32_t bitmask = 0;
+  intptr_t bitmask = 0;
   Address rset_address = ComputeRSetBitPosition(address, offset, &bitmask);
   Memory::uint32_at(rset_address) |= bitmask;

@@ -147,7 +147,7 @@

 // Clears the corresponding remembered set bit for a given address.
 void Page::UnsetRSet(Address address, int offset) {
-  uint32_t bitmask = 0;
+  intptr_t bitmask = 0;
   Address rset_address = ComputeRSetBitPosition(address, offset, &bitmask);
   Memory::uint32_at(rset_address) &= ~bitmask;

@@ -156,7 +156,7 @@


 bool Page::IsRSetSet(Address address, int offset) {
-  uint32_t bitmask = 0;
+  intptr_t bitmask = 0;
   Address rset_address = ComputeRSetBitPosition(address, offset, &bitmask);
   return (Memory::uint32_at(rset_address) & bitmask) != 0;
 }
Index: src/heap.cc
===================================================================
--- src/heap.cc    (revision 1129)
+++ src/heap.cc    (working copy)
@@ -616,10 +616,10 @@


 void Heap::ClearRSetRange(Address start, int size_in_bytes) {
-  uint32_t start_bit;
+  intptr_t start_bit;
   Address start_word_address =
       Page::ComputeRSetBitPosition(start, 0, &start_bit);
-  uint32_t end_bit;
+  intptr_t end_bit;
   Address end_word_address =
       Page::ComputeRSetBitPosition(start + size_in_bytes - kIntSize,
                                    0,
Index: src/spaces.h
===================================================================
--- src/spaces.h    (revision 1129)
+++ src/spaces.h    (working copy)
@@ -187,7 +187,7 @@
   // object address/offset pair, and the bit encoded as a single-bit
   // mask in the output parameter 'bitmask'.
   INLINE(static Address ComputeRSetBitPosition(Address address, int offset,
-                                               uint32_t* bitmask));
+                                               intptr_t* bitmask));

   // Sets the corresponding remembered set bit for a given address.
   INLINE(static void SetRSet(Address address, int offset));
@@ -912,14 +912,14 @@
   // True if the address is in the address range of this semispace (not
   // necessarily below the allocation pointer).
   bool Contains(Address a) {
-    return (reinterpret_cast<uint32_t>(a) & address_mask_)
-           == reinterpret_cast<uint32_t>(start_);
+    return (reinterpret_cast<intptr_t>(a) & address_mask_)
+           == reinterpret_cast<intptr_t>(start_);
   }

   // True if the object is a heap object in the address range of this
   // semispace (not necessarily below the allocation pointer).
   bool Contains(Object* o) {
-    return (reinterpret_cast<uint32_t>(o) & object_mask_) ==
object_expected_;
+    return (reinterpret_cast<intptr_t>(o) & object_mask_) ==
object_expected_;
   }

   // The offset of an address from the beginning of the space.
@@ -948,9 +948,9 @@
   Address age_mark_;

   // Masks and comparison values to test for containment in this semispace.
-  uint32_t address_mask_;
-  uint32_t object_mask_;
-  uint32_t object_expected_;
+  intptr_t address_mask_;
+  intptr_t object_mask_;
+  intptr_t object_expected_;

  public:
   TRACK_MEMORY("SemiSpace")
@@ -1036,11 +1036,11 @@
   // True if the address or object lies in the address range of either
   // semispace (not necessarily below the allocation pointer).
   bool Contains(Address a) {
-    return (reinterpret_cast<uint32_t>(a) & address_mask_)
-        == reinterpret_cast<uint32_t>(start_);
+    return (reinterpret_cast<intptr_t>(a) & address_mask_)
+        == reinterpret_cast<intptr_t>(start_);
   }
   bool Contains(Object* o) {
-    return (reinterpret_cast<uint32_t>(o) & object_mask_) ==
object_expected_;
+    return (reinterpret_cast<intptr_t>(o) & object_mask_) ==
object_expected_;
   }

   // Return the allocated bytes in the active semispace.
@@ -1066,7 +1066,7 @@
   // The start address of the space and a bit mask. Anding an address in
the
   // new space with the mask will result in the start address.
   Address start() { return start_; }
-  uint32_t mask() { return address_mask_; }
+  intptr_t mask() { return address_mask_; }

   // The allocation top and limit addresses.
   Address* allocation_top_address() { return &allocation_info_.top; }
@@ -1150,9 +1150,9 @@

   // Start address and bit mask for containment testing.
   Address start_;
-  uint32_t address_mask_;
-  uint32_t object_mask_;
-  uint32_t object_expected_;
+  intptr_t address_mask_;
+  intptr_t object_mask_;
+  intptr_t object_expected_;

   // Allocation pointer and limit for normal allocation and allocation
during
   // mark-compact collection.


Jeff Bailey >|< Google, Inc. >|< +1 514 670-8754

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to