From 5cc1bf6c28e64c889a863d4434d90753da26a10f Mon Sep 17 00:00:00 2001 From: "lrn@chromium.org" Date: Thu, 7 May 2009 11:50:09 +0000 Subject: [PATCH] X64: Serialization fixed to use intptr_t/Address where needed. Review URL: http://codereview.chromium.org/115080 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1898 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/serialize.cc | 59 ++++++++++++++++++++++++++++++++------------------------ src/serialize.h | 6 ++++++ 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/serialize.cc b/src/serialize.cc index e15c003..62287bc 100644 --- a/src/serialize.cc +++ b/src/serialize.cc @@ -78,8 +78,8 @@ const int kPageAndOffsetMask = (1 << kPageAndOffsetBits) - 1; static inline AllocationSpace GetSpace(Address addr) { - const int encoded = reinterpret_cast(addr); - int space_number = ((encoded >> kSpaceShift) & kSpaceMask); + const intptr_t encoded = reinterpret_cast(addr); + int space_number = (static_cast(encoded >> kSpaceShift) & kSpaceMask); if (space_number == kLOSpaceExecutable) space_number = LO_SPACE; else if (space_number == kLOSpacePointer) space_number = LO_SPACE; return static_cast(space_number); @@ -87,43 +87,45 @@ static inline AllocationSpace GetSpace(Address addr) { static inline bool IsLargeExecutableObject(Address addr) { - const int encoded = reinterpret_cast(addr); - const int space_number = ((encoded >> kSpaceShift) & kSpaceMask); - if (space_number == kLOSpaceExecutable) return true; - return false; + const intptr_t encoded = reinterpret_cast(addr); + const int space_number = + (static_cast(encoded >> kSpaceShift) & kSpaceMask); + return (space_number == kLOSpaceExecutable); } static inline bool IsLargeFixedArray(Address addr) { - const int encoded = reinterpret_cast(addr); - const int space_number = ((encoded >> kSpaceShift) & kSpaceMask); - if (space_number == kLOSpacePointer) return true; - return false; + const intptr_t encoded = reinterpret_cast(addr); + const int space_number = + (static_cast(encoded >> kSpaceShift) & kSpaceMask); + return (space_number == kLOSpacePointer); } static inline int PageIndex(Address addr) { - const int encoded = reinterpret_cast(addr); - return (encoded >> kPageShift) & kPageMask; + const intptr_t encoded = reinterpret_cast(addr); + return static_cast(encoded >> kPageShift) & kPageMask; } static inline int PageOffset(Address addr) { - const int encoded = reinterpret_cast(addr); - return ((encoded >> kOffsetShift) & kOffsetMask) << kObjectAlignmentBits; + const intptr_t encoded = reinterpret_cast(addr); + const int offset = static_cast(encoded >> kOffsetShift) & kOffsetMask; + return offset << kObjectAlignmentBits; } static inline int NewSpaceOffset(Address addr) { - const int encoded = reinterpret_cast(addr); - return ((encoded >> kPageAndOffsetShift) & kPageAndOffsetMask) << - kObjectAlignmentBits; + const intptr_t encoded = reinterpret_cast(addr); + const int page_offset = + static_cast(encoded >> kPageAndOffsetShift) & kPageAndOffsetMask; + return page_offset << kObjectAlignmentBits; } static inline int LargeObjectIndex(Address addr) { - const int encoded = reinterpret_cast(addr); - return (encoded >> kPageAndOffsetShift) & kPageAndOffsetMask; + const intptr_t encoded = reinterpret_cast(addr); + return static_cast(encoded >> kPageAndOffsetShift) & kPageAndOffsetMask; } @@ -728,7 +730,9 @@ int ExternalReferenceEncoder::IndexOf(Address key) const { if (key == NULL) return -1; HashMap::Entry* entry = const_cast(encodings_).Lookup(key, Hash(key), false); - return entry == NULL ? -1 : reinterpret_cast(entry->value); + return entry == NULL + ? -1 + : static_cast(reinterpret_cast(entry->value)); } @@ -794,6 +798,10 @@ class SnapshotWriter { InsertInt(i, len_); } + void PutAddress(Address p) { + PutBytes(reinterpret_cast(&p), sizeof(p)); + } + void PutBytes(const byte* a, int size) { InsertBytes(a, len_, size); } @@ -914,7 +922,8 @@ class ReferenceUpdater: public ObjectVisitor { // Helper functions for a map of encoded heap object addresses. static uint32_t HeapObjectHash(HeapObject* key) { - return reinterpret_cast(key) >> 2; + uint32_t low32bits = static_cast(reinterpret_cast(key)); + return low32bits >> 2; } @@ -1153,7 +1162,7 @@ void Serializer::PutContextStack() { void Serializer::PutEncodedAddress(Address addr) { writer_->PutC('P'); - writer_->PutInt(reinterpret_cast(addr)); + writer_->PutAddress(addr); } @@ -1336,7 +1345,7 @@ void Deserializer::VisitPointers(Object** start, Object** end) { *p = GetObject(); // embedded object } else { ASSERT(c == 'P'); // pointer to previously serialized object - *p = Resolve(reinterpret_cast
(reader_.GetInt())); + *p = Resolve(reader_.GetAddress()); } } else { // A pointer internal to a HeapObject that we've already @@ -1350,7 +1359,7 @@ void Deserializer::VisitPointers(Object** start, Object** end) { void Deserializer::VisitExternalReferences(Address* start, Address* end) { for (Address* p = start; p < end; ++p) { - uint32_t code = reinterpret_cast(*p); + uint32_t code = static_cast(reinterpret_cast(*p)); *p = reference_decoder_->Decode(code); } } @@ -1476,7 +1485,7 @@ void Deserializer::GetContextStack() { Address Deserializer::GetEncodedAddress() { reader_.ExpectC('P'); - return reinterpret_cast
(reader_.GetInt()); + return reader_.GetAddress(); } diff --git a/src/serialize.h b/src/serialize.h index 743c674..f6594ac 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -231,6 +231,12 @@ class SnapshotReader { return result; } + Address GetAddress() { + Address result; + GetBytes(reinterpret_cast
(&result), sizeof(result)); + return result; + } + void GetBytes(Address a, int size) { ASSERT(str_ + size <= end_); memcpy(a, str_, size); -- 2.7.4