Index: src/serialize.cc |
=================================================================== |
--- src/serialize.cc (revision 3020) |
+++ src/serialize.cc (working copy) |
@@ -922,7 +922,9 @@ |
serializer_(serializer), |
reference_encoder_(serializer->reference_encoder_), |
offsets_(8), |
- addresses_(8) { |
+ addresses_(8), |
+ offsets_32_bit_(0), |
+ data_32_bit_(0) { |
} |
virtual void VisitPointers(Object** start, Object** end) { |
@@ -939,9 +941,13 @@ |
ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); |
Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); |
Address encoded_target = serializer_->GetSavedAddress(target); |
- offsets_.Add(rinfo->target_address_address() - obj_address_); |
- addresses_.Add(encoded_target); |
- } |
+ // All calls and jumps are to code objects that encode into 32 bits. |
+ offsets_32_bit_.Add(rinfo->target_address_address() - obj_address_); |
+ uint32_t small_target = |
+ static_cast<uint32_t>(reinterpret_cast<uintptr_t>(encoded_target)); |
+ ASSERT(reinterpret_cast<uintptr_t>(encoded_target) == small_target); |
+ data_32_bit_.Add(small_target); |
+ } |
virtual void VisitExternalReferences(Address* start, Address* end) { |
@@ -965,6 +971,10 @@ |
for (int i = 0; i < offsets_.length(); i++) { |
memcpy(start_address + offsets_[i], &addresses_[i], sizeof(Address)); |
} |
+ for (int i = 0; i < offsets_32_bit_.length(); i++) { |
+ memcpy(start_address + offsets_32_bit_[i], &data_32_bit_[i], |
+ sizeof(uint32_t)); |
+ } |
} |
private: |
@@ -973,6 +983,10 @@ |
ExternalReferenceEncoder* reference_encoder_; |
List<int> offsets_; |
List<Address> addresses_; |
+ // Some updates are 32-bit even on a 64-bit platform. |
+ // We keep a separate list of them on 64-bit platforms. |
+ List<int> offsets_32_bit_; |
+ List<uint32_t> data_32_bit_; |
}; |
@@ -1432,7 +1446,9 @@ |
void Deserializer::VisitCodeTarget(RelocInfo* rinfo) { |
ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); |
- Address encoded_address = reinterpret_cast<Address>(rinfo->target_object()); |
+ // On all platforms, the encoded code object address is only 32 bits. |
+ Address encoded_address = reinterpret_cast<Address>(Memory::uint32_at( |
+ reinterpret_cast<Address>(rinfo->target_object_address()))); |
Code* target_object = reinterpret_cast<Code*>(Resolve(encoded_address)); |
rinfo->set_target_address(target_object->instruction_start()); |
} |
@@ -1663,7 +1679,6 @@ |
// Encoded addresses of HeapObjects always have 'HeapObject' tags. |
ASSERT(o->IsHeapObject()); |
- |
switch (GetSpace(encoded)) { |
// For Map space and Old space, we cache the known Pages in map_pages, |
// old_pointer_pages and old_data_pages. Even though MapSpace keeps a list |