| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 page_index++; | 338 page_index++; |
| 339 } | 339 } |
| 340 current_ = RelativeAddress(space, | 340 current_ = RelativeAddress(space, |
| 341 page_index, | 341 page_index, |
| 342 top_page->Offset(top)); | 342 top_page->Offset(top)); |
| 343 break; | 343 break; |
| 344 } | 344 } |
| 345 case NEW_SPACE: | 345 case NEW_SPACE: |
| 346 current_ = RelativeAddress(space, | 346 current_ = RelativeAddress(space, |
| 347 0, | 347 0, |
| 348 Heap::NewSpaceTop() - Heap::NewSpaceStart()); | 348 static_cast<int>(Heap::NewSpaceTop() |
| 349 - Heap::NewSpaceStart())); |
| 349 break; | 350 break; |
| 350 case LO_SPACE: | 351 case LO_SPACE: |
| 351 int page_index = 0; | 352 int page_index = 0; |
| 352 for (LargeObjectIterator it(Heap::lo_space()); it.has_next(); it.next()) { | 353 for (LargeObjectIterator it(Heap::lo_space()); it.has_next(); it.next()) { |
| 353 page_index++; | 354 page_index++; |
| 354 } | 355 } |
| 355 current_ = RelativeAddress(space, page_index, 0); | 356 current_ = RelativeAddress(space, page_index, 0); |
| 356 break; | 357 break; |
| 357 } | 358 } |
| 358 } | 359 } |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 // Debug addresses | 570 // Debug addresses |
| 570 Add(Debug_Address(Debug::k_after_break_target_address).address(), | 571 Add(Debug_Address(Debug::k_after_break_target_address).address(), |
| 571 DEBUG_ADDRESS, | 572 DEBUG_ADDRESS, |
| 572 Debug::k_after_break_target_address << kDebugIdShift, | 573 Debug::k_after_break_target_address << kDebugIdShift, |
| 573 "Debug::after_break_target_address()"); | 574 "Debug::after_break_target_address()"); |
| 574 Add(Debug_Address(Debug::k_debug_break_return_address).address(), | 575 Add(Debug_Address(Debug::k_debug_break_return_address).address(), |
| 575 DEBUG_ADDRESS, | 576 DEBUG_ADDRESS, |
| 576 Debug::k_debug_break_return_address << kDebugIdShift, | 577 Debug::k_debug_break_return_address << kDebugIdShift, |
| 577 "Debug::debug_break_return_address()"); | 578 "Debug::debug_break_return_address()"); |
| 578 const char* debug_register_format = "Debug::register_address(%i)"; | 579 const char* debug_register_format = "Debug::register_address(%i)"; |
| 579 size_t dr_format_length = strlen(debug_register_format); | 580 int dr_format_length = StrLength(debug_register_format); |
| 580 for (int i = 0; i < kNumJSCallerSaved; ++i) { | 581 for (int i = 0; i < kNumJSCallerSaved; ++i) { |
| 581 Vector<char> name = Vector<char>::New(dr_format_length + 1); | 582 Vector<char> name = Vector<char>::New(dr_format_length + 1); |
| 582 OS::SNPrintF(name, debug_register_format, i); | 583 OS::SNPrintF(name, debug_register_format, i); |
| 583 Add(Debug_Address(Debug::k_register_address, i).address(), | 584 Add(Debug_Address(Debug::k_register_address, i).address(), |
| 584 DEBUG_ADDRESS, | 585 DEBUG_ADDRESS, |
| 585 Debug::k_register_address << kDebugIdShift | i, | 586 Debug::k_register_address << kDebugIdShift | i, |
| 586 name.start()); | 587 name.start()); |
| 587 } | 588 } |
| 588 #endif | 589 #endif |
| 589 | 590 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 617 const char* top_address_format = "Top::%s"; | 618 const char* top_address_format = "Top::%s"; |
| 618 | 619 |
| 619 const char* AddressNames[] = { | 620 const char* AddressNames[] = { |
| 620 #define C(name) #name, | 621 #define C(name) #name, |
| 621 TOP_ADDRESS_LIST(C) | 622 TOP_ADDRESS_LIST(C) |
| 622 TOP_ADDRESS_LIST_PROF(C) | 623 TOP_ADDRESS_LIST_PROF(C) |
| 623 NULL | 624 NULL |
| 624 #undef C | 625 #undef C |
| 625 }; | 626 }; |
| 626 | 627 |
| 627 size_t top_format_length = strlen(top_address_format) - 2; | 628 int top_format_length = StrLength(top_address_format) - 2; |
| 628 for (uint16_t i = 0; i < Top::k_top_address_count; ++i) { | 629 for (uint16_t i = 0; i < Top::k_top_address_count; ++i) { |
| 629 const char* address_name = AddressNames[i]; | 630 const char* address_name = AddressNames[i]; |
| 630 Vector<char> name = | 631 Vector<char> name = |
| 631 Vector<char>::New(top_format_length + strlen(address_name) + 1); | 632 Vector<char>::New(top_format_length + StrLength(address_name) + 1); |
| 632 const char* chars = name.start(); | 633 const char* chars = name.start(); |
| 633 OS::SNPrintF(name, top_address_format, address_name); | 634 OS::SNPrintF(name, top_address_format, address_name); |
| 634 Add(Top::get_address_from_id((Top::AddressId)i), TOP_ADDRESS, i, chars); | 635 Add(Top::get_address_from_id((Top::AddressId)i), TOP_ADDRESS, i, chars); |
| 635 } | 636 } |
| 636 | 637 |
| 637 // Extensions | 638 // Extensions |
| 638 Add(FUNCTION_ADDR(GCExtension::GC), EXTENSION, 1, | 639 Add(FUNCTION_ADDR(GCExtension::GC), EXTENSION, 1, |
| 639 "GCExtension::GC"); | 640 "GCExtension::GC"); |
| 640 | 641 |
| 641 // Accessors | 642 // Accessors |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 if (pos < len_) { | 918 if (pos < len_) { |
| 918 byte* old = str_; | 919 byte* old = str_; |
| 919 str_ = NewArray<byte>(max_); | 920 str_ = NewArray<byte>(max_); |
| 920 memcpy(str_, old, pos); | 921 memcpy(str_, old, pos); |
| 921 memcpy(str_ + pos + bytes, old + pos, len_ - pos); | 922 memcpy(str_ + pos + bytes, old + pos, len_ - pos); |
| 922 DeleteArray(old); | 923 DeleteArray(old); |
| 923 } | 924 } |
| 924 } | 925 } |
| 925 | 926 |
| 926 int SnapshotWriter::InsertString(const char* s, int pos) { | 927 int SnapshotWriter::InsertString(const char* s, int pos) { |
| 927 int size = strlen(s); | 928 int size = StrLength(s); |
| 928 pos = InsertC('[', pos); | 929 pos = InsertC('[', pos); |
| 929 pos = InsertInt(size, pos); | 930 pos = InsertInt(size, pos); |
| 930 pos = InsertC(']', pos); | 931 pos = InsertC(']', pos); |
| 931 return InsertBytes(reinterpret_cast<const byte*>(s), pos, size); | 932 return InsertBytes(reinterpret_cast<const byte*>(s), pos, size); |
| 932 } | 933 } |
| 933 | 934 |
| 934 | 935 |
| 935 class ReferenceUpdater: public ObjectVisitor { | 936 class ReferenceUpdater: public ObjectVisitor { |
| 936 public: | 937 public: |
| 937 ReferenceUpdater(HeapObject* obj, Serializer* serializer) | 938 ReferenceUpdater(HeapObject* obj, Serializer* serializer) |
| 938 : obj_address_(obj->address()), | 939 : obj_address_(obj->address()), |
| 939 serializer_(serializer), | 940 serializer_(serializer), |
| 940 reference_encoder_(serializer->reference_encoder_), | 941 reference_encoder_(serializer->reference_encoder_), |
| 941 offsets_(8), | 942 offsets_(8), |
| 942 addresses_(8), | 943 addresses_(8), |
| 943 offsets_32_bit_(0), | 944 offsets_32_bit_(0), |
| 944 data_32_bit_(0) { | 945 data_32_bit_(0) { |
| 945 } | 946 } |
| 946 | 947 |
| 947 virtual void VisitPointers(Object** start, Object** end) { | 948 virtual void VisitPointers(Object** start, Object** end) { |
| 948 for (Object** p = start; p < end; ++p) { | 949 for (Object** p = start; p < end; ++p) { |
| 949 if ((*p)->IsHeapObject()) { | 950 if ((*p)->IsHeapObject()) { |
| 950 offsets_.Add(reinterpret_cast<Address>(p) - obj_address_); | 951 offsets_.Add( |
| 952 static_cast<int>(reinterpret_cast<Address>(p) - obj_address_)); |
| 951 Address a = serializer_->GetSavedAddress(HeapObject::cast(*p)); | 953 Address a = serializer_->GetSavedAddress(HeapObject::cast(*p)); |
| 952 addresses_.Add(a); | 954 addresses_.Add(a); |
| 953 } | 955 } |
| 954 } | 956 } |
| 955 } | 957 } |
| 956 | 958 |
| 957 virtual void VisitCodeTarget(RelocInfo* rinfo) { | 959 virtual void VisitCodeTarget(RelocInfo* rinfo) { |
| 958 ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); | 960 ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); |
| 959 Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); | 961 Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); |
| 960 Address encoded_target = serializer_->GetSavedAddress(target); | 962 Address encoded_target = serializer_->GetSavedAddress(target); |
| 961 // All calls and jumps are to code objects that encode into 32 bits. | 963 // All calls and jumps are to code objects that encode into 32 bits. |
| 962 offsets_32_bit_.Add(rinfo->target_address_address() - obj_address_); | 964 offsets_32_bit_.Add( |
| 965 static_cast<int>(rinfo->target_address_address() - obj_address_)); |
| 963 uint32_t small_target = | 966 uint32_t small_target = |
| 964 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(encoded_target)); | 967 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(encoded_target)); |
| 965 ASSERT(reinterpret_cast<uintptr_t>(encoded_target) == small_target); | 968 ASSERT(reinterpret_cast<uintptr_t>(encoded_target) == small_target); |
| 966 data_32_bit_.Add(small_target); | 969 data_32_bit_.Add(small_target); |
| 967 } | 970 } |
| 968 | 971 |
| 969 | 972 |
| 970 virtual void VisitExternalReferences(Address* start, Address* end) { | 973 virtual void VisitExternalReferences(Address* start, Address* end) { |
| 971 for (Address* p = start; p < end; ++p) { | 974 for (Address* p = start; p < end; ++p) { |
| 972 uint32_t code = reference_encoder_->Encode(*p); | 975 uint32_t code = reference_encoder_->Encode(*p); |
| 973 CHECK(*p == NULL ? code == 0 : code != 0); | 976 CHECK(*p == NULL ? code == 0 : code != 0); |
| 974 offsets_.Add(reinterpret_cast<Address>(p) - obj_address_); | 977 offsets_.Add( |
| 978 static_cast<int>(reinterpret_cast<Address>(p) - obj_address_)); |
| 975 addresses_.Add(reinterpret_cast<Address>(code)); | 979 addresses_.Add(reinterpret_cast<Address>(code)); |
| 976 } | 980 } |
| 977 } | 981 } |
| 978 | 982 |
| 979 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { | 983 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { |
| 980 Address target = rinfo->target_address(); | 984 Address target = rinfo->target_address(); |
| 981 uint32_t encoding = reference_encoder_->Encode(target); | 985 uint32_t encoding = reference_encoder_->Encode(target); |
| 982 CHECK(target == NULL ? encoding == 0 : encoding != 0); | 986 CHECK(target == NULL ? encoding == 0 : encoding != 0); |
| 983 offsets_.Add(rinfo->target_address_address() - obj_address_); | 987 offsets_.Add( |
| 988 static_cast<int>(rinfo->target_address_address() - obj_address_)); |
| 984 addresses_.Add(reinterpret_cast<Address>(encoding)); | 989 addresses_.Add(reinterpret_cast<Address>(encoding)); |
| 985 } | 990 } |
| 986 | 991 |
| 987 void Update(Address start_address) { | 992 void Update(Address start_address) { |
| 988 for (int i = 0; i < offsets_.length(); i++) { | 993 for (int i = 0; i < offsets_.length(); i++) { |
| 989 memcpy(start_address + offsets_[i], &addresses_[i], sizeof(Address)); | 994 memcpy(start_address + offsets_[i], &addresses_[i], sizeof(Address)); |
| 990 } | 995 } |
| 991 for (int i = 0; i < offsets_32_bit_.length(); i++) { | 996 for (int i = 0; i < offsets_32_bit_.length(); i++) { |
| 992 memcpy(start_address + offsets_32_bit_[i], &data_32_bit_[i], | 997 memcpy(start_address + offsets_32_bit_[i], &data_32_bit_[i], |
| 993 sizeof(uint32_t)); | 998 sizeof(uint32_t)); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 | 1048 |
| 1044 | 1049 |
| 1045 bool Serializer::serialization_enabled_ = false; | 1050 bool Serializer::serialization_enabled_ = false; |
| 1046 | 1051 |
| 1047 | 1052 |
| 1048 #ifdef DEBUG | 1053 #ifdef DEBUG |
| 1049 static const int kMaxTagLength = 32; | 1054 static const int kMaxTagLength = 32; |
| 1050 | 1055 |
| 1051 void Serializer::Synchronize(const char* tag) { | 1056 void Serializer::Synchronize(const char* tag) { |
| 1052 if (FLAG_debug_serialization) { | 1057 if (FLAG_debug_serialization) { |
| 1053 int length = strlen(tag); | 1058 int length = StrLength(tag); |
| 1054 ASSERT(length <= kMaxTagLength); | 1059 ASSERT(length <= kMaxTagLength); |
| 1055 writer_->PutC('S'); | 1060 writer_->PutC('S'); |
| 1056 writer_->PutInt(length); | 1061 writer_->PutInt(length); |
| 1057 writer_->PutBytes(reinterpret_cast<const byte*>(tag), length); | 1062 writer_->PutBytes(reinterpret_cast<const byte*>(tag), length); |
| 1058 } | 1063 } |
| 1059 } | 1064 } |
| 1060 #endif | 1065 #endif |
| 1061 | 1066 |
| 1062 | 1067 |
| 1063 void Serializer::InitializeAllocators() { | 1068 void Serializer::InitializeAllocators() { |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1408 | 1413 |
| 1409 | 1414 |
| 1410 #ifdef DEBUG | 1415 #ifdef DEBUG |
| 1411 void Deserializer::Synchronize(const char* tag) { | 1416 void Deserializer::Synchronize(const char* tag) { |
| 1412 if (expect_debug_information_) { | 1417 if (expect_debug_information_) { |
| 1413 char buf[kMaxTagLength]; | 1418 char buf[kMaxTagLength]; |
| 1414 reader_.ExpectC('S'); | 1419 reader_.ExpectC('S'); |
| 1415 int length = reader_.GetInt(); | 1420 int length = reader_.GetInt(); |
| 1416 ASSERT(length <= kMaxTagLength); | 1421 ASSERT(length <= kMaxTagLength); |
| 1417 reader_.GetBytes(reinterpret_cast<Address>(buf), length); | 1422 reader_.GetBytes(reinterpret_cast<Address>(buf), length); |
| 1418 ASSERT_EQ(strlen(tag), length); | 1423 ASSERT_EQ(StrLength(tag), length); |
| 1419 ASSERT(strncmp(tag, buf, length) == 0); | 1424 ASSERT(strncmp(tag, buf, length) == 0); |
| 1420 } | 1425 } |
| 1421 } | 1426 } |
| 1422 #endif | 1427 #endif |
| 1423 | 1428 |
| 1424 | 1429 |
| 1425 class NoGlobalHandlesChecker : public ObjectVisitor { | 1430 class NoGlobalHandlesChecker : public ObjectVisitor { |
| 1426 public: | 1431 public: |
| 1427 virtual void VisitPointers(Object** start, Object** end) { | 1432 virtual void VisitPointers(Object** start, Object** end) { |
| 1428 ASSERT(false); | 1433 ASSERT(false); |
| (...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1924 case RAW_DATA_SERIALIZATION: { | 1929 case RAW_DATA_SERIALIZATION: { |
| 1925 int size = source_->GetInt(); | 1930 int size = source_->GetInt(); |
| 1926 byte* raw_data_out = reinterpret_cast<byte*>(current); | 1931 byte* raw_data_out = reinterpret_cast<byte*>(current); |
| 1927 source_->CopyRaw(raw_data_out, size); | 1932 source_->CopyRaw(raw_data_out, size); |
| 1928 current = reinterpret_cast<Object**>(raw_data_out + size); | 1933 current = reinterpret_cast<Object**>(raw_data_out + size); |
| 1929 break; | 1934 break; |
| 1930 } | 1935 } |
| 1931 case OBJECT_SERIALIZATION + NEW_SPACE: { | 1936 case OBJECT_SERIALIZATION + NEW_SPACE: { |
| 1932 ReadObject(NEW_SPACE, Heap::new_space(), current); | 1937 ReadObject(NEW_SPACE, Heap::new_space(), current); |
| 1933 if (space != NEW_SPACE) { | 1938 if (space != NEW_SPACE) { |
| 1934 Heap::RecordWrite(address, | 1939 Heap::RecordWrite(address, static_cast<int>( |
| 1935 reinterpret_cast<Address>(current) - address); | 1940 reinterpret_cast<Address>(current) - address)); |
| 1936 } | 1941 } |
| 1937 current++; | 1942 current++; |
| 1938 break; | 1943 break; |
| 1939 } | 1944 } |
| 1940 case OBJECT_SERIALIZATION + OLD_DATA_SPACE: | 1945 case OBJECT_SERIALIZATION + OLD_DATA_SPACE: |
| 1941 ReadObject(OLD_DATA_SPACE, Heap::old_data_space(), current++); | 1946 ReadObject(OLD_DATA_SPACE, Heap::old_data_space(), current++); |
| 1942 break; | 1947 break; |
| 1943 case OBJECT_SERIALIZATION + OLD_POINTER_SPACE: | 1948 case OBJECT_SERIALIZATION + OLD_POINTER_SPACE: |
| 1944 ReadObject(OLD_POINTER_SPACE, Heap::old_pointer_space(), current++); | 1949 ReadObject(OLD_POINTER_SPACE, Heap::old_pointer_space(), current++); |
| 1945 break; | 1950 break; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1982 Assembler::set_target_at(location_of_branch_data, | 1987 Assembler::set_target_at(location_of_branch_data, |
| 1983 code_object->instruction_start()); | 1988 code_object->instruction_start()); |
| 1984 location_of_branch_data += Assembler::kCallTargetSize; | 1989 location_of_branch_data += Assembler::kCallTargetSize; |
| 1985 current = reinterpret_cast<Object**>(location_of_branch_data); | 1990 current = reinterpret_cast<Object**>(location_of_branch_data); |
| 1986 break; | 1991 break; |
| 1987 } | 1992 } |
| 1988 ONE_CASE_PER_SPACE(BACKREF_SERIALIZATION) { | 1993 ONE_CASE_PER_SPACE(BACKREF_SERIALIZATION) { |
| 1989 // Write a backreference to an object we unpacked earlier. | 1994 // Write a backreference to an object we unpacked earlier. |
| 1990 int backref_space = (data & kSpaceMask); | 1995 int backref_space = (data & kSpaceMask); |
| 1991 if (backref_space == NEW_SPACE && space != NEW_SPACE) { | 1996 if (backref_space == NEW_SPACE && space != NEW_SPACE) { |
| 1992 Heap::RecordWrite(address, | 1997 Heap::RecordWrite(address, static_cast<int>( |
| 1993 reinterpret_cast<Address>(current) - address); | 1998 reinterpret_cast<Address>(current) - address)); |
| 1994 } | 1999 } |
| 1995 *current++ = GetAddressFromEnd(backref_space); | 2000 *current++ = GetAddressFromEnd(backref_space); |
| 1996 break; | 2001 break; |
| 1997 } | 2002 } |
| 1998 ONE_CASE_PER_SPACE(REFERENCE_SERIALIZATION) { | 2003 ONE_CASE_PER_SPACE(REFERENCE_SERIALIZATION) { |
| 1999 // Write a reference to an object we unpacked earlier. | 2004 // Write a reference to an object we unpacked earlier. |
| 2000 int reference_space = (data & kSpaceMask); | 2005 int reference_space = (data & kSpaceMask); |
| 2001 if (reference_space == NEW_SPACE && space != NEW_SPACE) { | 2006 if (reference_space == NEW_SPACE && space != NEW_SPACE) { |
| 2002 Heap::RecordWrite(address, | 2007 Heap::RecordWrite(address, static_cast<int>( |
| 2003 reinterpret_cast<Address>(current) - address); | 2008 reinterpret_cast<Address>(current) - address)); |
| 2004 } | 2009 } |
| 2005 *current++ = GetAddressFromStart(reference_space); | 2010 *current++ = GetAddressFromStart(reference_space); |
| 2006 break; | 2011 break; |
| 2007 } | 2012 } |
| 2008 #define COMMON_REFS_CASE(index, reference_space, address) \ | 2013 #define COMMON_REFS_CASE(index, reference_space, address) \ |
| 2009 case REFERENCE_SERIALIZATION + index: { \ | 2014 case REFERENCE_SERIALIZATION + index: { \ |
| 2010 ASSERT(SpaceIsPaged(reference_space)); \ | 2015 ASSERT(SpaceIsPaged(reference_space)); \ |
| 2011 Address object_address = \ | 2016 Address object_address = \ |
| 2012 pages_[reference_space][0] + (address << kObjectAlignmentBits); \ | 2017 pages_[reference_space][0] + (address << kObjectAlignmentBits); \ |
| 2013 *current++ = HeapObject::FromAddress(object_address); \ | 2018 *current++ = HeapObject::FromAddress(object_address); \ |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2075 UNREACHABLE(); | 2080 UNREACHABLE(); |
| 2076 } | 2081 } |
| 2077 } | 2082 } |
| 2078 ASSERT(current == limit); | 2083 ASSERT(current == limit); |
| 2079 } | 2084 } |
| 2080 | 2085 |
| 2081 | 2086 |
| 2082 void SnapshotByteSink::PutInt(uintptr_t integer, const char* description) { | 2087 void SnapshotByteSink::PutInt(uintptr_t integer, const char* description) { |
| 2083 const int max_shift = ((kPointerSize * kBitsPerByte) / 7) * 7; | 2088 const int max_shift = ((kPointerSize * kBitsPerByte) / 7) * 7; |
| 2084 for (int shift = max_shift; shift > 0; shift -= 7) { | 2089 for (int shift = max_shift; shift > 0; shift -= 7) { |
| 2085 if (integer >= 1u << shift) { | 2090 if (integer >= static_cast<uintptr_t>(1u) << shift) { |
| 2086 Put(((integer >> shift) & 0x7f) | 0x80, "IntPart"); | 2091 Put(((integer >> shift) & 0x7f) | 0x80, "IntPart"); |
| 2087 } | 2092 } |
| 2088 } | 2093 } |
| 2089 PutSection(integer & 0x7f, "IntLastPart"); | 2094 PutSection(integer & 0x7f, "IntLastPart"); |
| 2090 } | 2095 } |
| 2091 | 2096 |
| 2092 #ifdef DEBUG | 2097 #ifdef DEBUG |
| 2093 | 2098 |
| 2094 void Deserializer2::Synchronize(const char* tag) { | 2099 void Deserializer2::Synchronize(const char* tag) { |
| 2095 int data = source_->Get(); | 2100 int data = source_->Get(); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2276 void Serializer2::ObjectSerializer::VisitExternalReferences(Address* start, | 2281 void Serializer2::ObjectSerializer::VisitExternalReferences(Address* start, |
| 2277 Address* end) { | 2282 Address* end) { |
| 2278 Address references_start = reinterpret_cast<Address>(start); | 2283 Address references_start = reinterpret_cast<Address>(start); |
| 2279 OutputRawData(references_start); | 2284 OutputRawData(references_start); |
| 2280 | 2285 |
| 2281 for (Address* current = start; current < end; current++) { | 2286 for (Address* current = start; current < end; current++) { |
| 2282 sink_->Put(EXTERNAL_REFERENCE_SERIALIZATION, "ExternalReference"); | 2287 sink_->Put(EXTERNAL_REFERENCE_SERIALIZATION, "ExternalReference"); |
| 2283 int reference_id = serializer_->EncodeExternalReference(*current); | 2288 int reference_id = serializer_->EncodeExternalReference(*current); |
| 2284 sink_->PutInt(reference_id, "reference id"); | 2289 sink_->PutInt(reference_id, "reference id"); |
| 2285 } | 2290 } |
| 2286 bytes_processed_so_far_ += (end - start) * kPointerSize; | 2291 bytes_processed_so_far_ += static_cast<int>((end - start) * kPointerSize); |
| 2287 } | 2292 } |
| 2288 | 2293 |
| 2289 | 2294 |
| 2290 void Serializer2::ObjectSerializer::VisitRuntimeEntry(RelocInfo* rinfo) { | 2295 void Serializer2::ObjectSerializer::VisitRuntimeEntry(RelocInfo* rinfo) { |
| 2291 Address target_start = rinfo->target_address_address(); | 2296 Address target_start = rinfo->target_address_address(); |
| 2292 OutputRawData(target_start); | 2297 OutputRawData(target_start); |
| 2293 Address target = rinfo->target_address(); | 2298 Address target = rinfo->target_address(); |
| 2294 uint32_t encoding = serializer_->EncodeExternalReference(target); | 2299 uint32_t encoding = serializer_->EncodeExternalReference(target); |
| 2295 CHECK(target == NULL ? encoding == 0 : encoding != 0); | 2300 CHECK(target == NULL ? encoding == 0 : encoding != 0); |
| 2296 sink_->Put(EXTERNAL_BRANCH_TARGET_SERIALIZATION, "ExternalReference"); | 2301 sink_->Put(EXTERNAL_BRANCH_TARGET_SERIALIZATION, "ExternalReference"); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2331 } | 2336 } |
| 2332 } | 2337 } |
| 2333 // One of the strings in the natives cache should match the resource. We | 2338 // One of the strings in the natives cache should match the resource. We |
| 2334 // can't serialize any other kinds of external strings. | 2339 // can't serialize any other kinds of external strings. |
| 2335 UNREACHABLE(); | 2340 UNREACHABLE(); |
| 2336 } | 2341 } |
| 2337 | 2342 |
| 2338 | 2343 |
| 2339 void Serializer2::ObjectSerializer::OutputRawData(Address up_to) { | 2344 void Serializer2::ObjectSerializer::OutputRawData(Address up_to) { |
| 2340 Address object_start = object_->address(); | 2345 Address object_start = object_->address(); |
| 2341 int up_to_offset = up_to - object_start; | 2346 int up_to_offset = static_cast<int>(up_to - object_start); |
| 2342 int skipped = up_to_offset - bytes_processed_so_far_; | 2347 int skipped = up_to_offset - bytes_processed_so_far_; |
| 2343 // This assert will fail if the reloc info gives us the target_address_address | 2348 // This assert will fail if the reloc info gives us the target_address_address |
| 2344 // locations in a non-ascending order. Luckily that doesn't happen. | 2349 // locations in a non-ascending order. Luckily that doesn't happen. |
| 2345 ASSERT(skipped >= 0); | 2350 ASSERT(skipped >= 0); |
| 2346 if (skipped != 0) { | 2351 if (skipped != 0) { |
| 2347 Address base = object_start + bytes_processed_so_far_; | 2352 Address base = object_start + bytes_processed_so_far_; |
| 2348 #define RAW_CASE(index, length) \ | 2353 #define RAW_CASE(index, length) \ |
| 2349 if (skipped == length) { \ | 2354 if (skipped == length) { \ |
| 2350 sink_->PutSection(RAW_DATA_SERIALIZATION + index, "RawDataFixed"); \ | 2355 sink_->PutSection(RAW_DATA_SERIALIZATION + index, "RawDataFixed"); \ |
| 2351 } else /* NOLINT */ | 2356 } else /* NOLINT */ |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2424 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize); | 2429 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize); |
| 2425 } | 2430 } |
| 2426 } | 2431 } |
| 2427 int allocation_address = fullness_[space]; | 2432 int allocation_address = fullness_[space]; |
| 2428 fullness_[space] = allocation_address + size; | 2433 fullness_[space] = allocation_address + size; |
| 2429 return allocation_address; | 2434 return allocation_address; |
| 2430 } | 2435 } |
| 2431 | 2436 |
| 2432 | 2437 |
| 2433 } } // namespace v8::internal | 2438 } } // namespace v8::internal |
| OLD | NEW |