| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/base/platform/platform.h" | 9 #include "src/base/platform/platform.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 1659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1670 void Serializer::ObjectSerializer::VisitPointers(Object** start, | 1670 void Serializer::ObjectSerializer::VisitPointers(Object** start, |
| 1671 Object** end) { | 1671 Object** end) { |
| 1672 Object** current = start; | 1672 Object** current = start; |
| 1673 while (current < end) { | 1673 while (current < end) { |
| 1674 while (current < end && (*current)->IsSmi()) current++; | 1674 while (current < end && (*current)->IsSmi()) current++; |
| 1675 if (current < end) OutputRawData(reinterpret_cast<Address>(current)); | 1675 if (current < end) OutputRawData(reinterpret_cast<Address>(current)); |
| 1676 | 1676 |
| 1677 while (current < end && !(*current)->IsSmi()) { | 1677 while (current < end && !(*current)->IsSmi()) { |
| 1678 HeapObject* current_contents = HeapObject::cast(*current); | 1678 HeapObject* current_contents = HeapObject::cast(*current); |
| 1679 int root_index = serializer_->root_index_map()->Lookup(current_contents); | 1679 int root_index = serializer_->root_index_map()->Lookup(current_contents); |
| 1680 // Repeats are not subject to the write barrier so there are only some | 1680 // Repeats are not subject to the write barrier so we can only use |
| 1681 // objects that can be used in a repeat encoding. These are the early | 1681 // immortal immovable root members. They are never in new space. |
| 1682 // ones in the root array that are never in new space. | |
| 1683 if (current != start && root_index != RootIndexMap::kInvalidRootIndex && | 1682 if (current != start && root_index != RootIndexMap::kInvalidRootIndex && |
| 1684 root_index < kRootArrayNumberOfConstantEncodings && | 1683 Heap::RootIsImmortalImmovable(root_index) && |
| 1685 current_contents == current[-1]) { | 1684 current_contents == current[-1]) { |
| 1686 DCHECK(!serializer_->isolate()->heap()->InNewSpace(current_contents)); | 1685 DCHECK(!serializer_->isolate()->heap()->InNewSpace(current_contents)); |
| 1687 int repeat_count = 1; | 1686 int repeat_count = 1; |
| 1688 while (¤t[repeat_count] < end - 1 && | 1687 while (¤t[repeat_count] < end - 1 && |
| 1689 current[repeat_count] == current_contents) { | 1688 current[repeat_count] == current_contents) { |
| 1690 repeat_count++; | 1689 repeat_count++; |
| 1691 } | 1690 } |
| 1692 current += repeat_count; | 1691 current += repeat_count; |
| 1693 bytes_processed_so_far_ += repeat_count * kPointerSize; | 1692 bytes_processed_so_far_ += repeat_count * kPointerSize; |
| 1694 if (repeat_count > kMaxRepeats) { | 1693 if (repeat_count > kMaxRepeats) { |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1901 } | 1900 } |
| 1902 UNREACHABLE(); | 1901 UNREACHABLE(); |
| 1903 return INVALID_SPACE; | 1902 return INVALID_SPACE; |
| 1904 } | 1903 } |
| 1905 | 1904 |
| 1906 | 1905 |
| 1907 BackReference Serializer::AllocateLargeObject(int size) { | 1906 BackReference Serializer::AllocateLargeObject(int size) { |
| 1908 // Large objects are allocated one-by-one when deserializing. We do not | 1907 // Large objects are allocated one-by-one when deserializing. We do not |
| 1909 // have to keep track of multiple chunks. | 1908 // have to keep track of multiple chunks. |
| 1910 pending_chunk_[LO_SPACE] += size; | 1909 pending_chunk_[LO_SPACE] += size; |
| 1911 return BackReference(LO_SPACE, 0, seen_large_objects_index_++); | 1910 return BackReference::LargeObjectReference(seen_large_objects_index_++); |
| 1912 } | 1911 } |
| 1913 | 1912 |
| 1914 | 1913 |
| 1915 BackReference Serializer::Allocate(AllocationSpace space, int size) { | 1914 BackReference Serializer::Allocate(AllocationSpace space, int size) { |
| 1916 CHECK(space >= 0 && space < kNumberOfPreallocatedSpaces); | 1915 CHECK(space >= 0 && space < kNumberOfPreallocatedSpaces); |
| 1917 DCHECK(size > 0 && size <= Page::kMaxRegularHeapObjectSize); | 1916 DCHECK(size > 0 && size <= Page::kMaxRegularHeapObjectSize); |
| 1918 uint32_t new_chunk_size = pending_chunk_[space] + size; | 1917 uint32_t new_chunk_size = pending_chunk_[space] + size; |
| 1919 if (new_chunk_size > static_cast<uint32_t>(Page::kMaxRegularHeapObjectSize)) { | 1918 if (new_chunk_size > static_cast<uint32_t>(Page::kMaxRegularHeapObjectSize)) { |
| 1920 // The new chunk size would not fit onto a single page. Complete the | 1919 // The new chunk size would not fit onto a single page. Complete the |
| 1921 // current chunk and start a new one. | 1920 // current chunk and start a new one. |
| 1922 completed_chunks_[space].Add(pending_chunk_[space]); | 1921 completed_chunks_[space].Add(pending_chunk_[space]); |
| 1923 pending_chunk_[space] = 0; | 1922 pending_chunk_[space] = 0; |
| 1924 new_chunk_size = size; | 1923 new_chunk_size = size; |
| 1925 } | 1924 } |
| 1926 uint32_t offset = pending_chunk_[space]; | 1925 uint32_t offset = pending_chunk_[space]; |
| 1927 pending_chunk_[space] = new_chunk_size; | 1926 pending_chunk_[space] = new_chunk_size; |
| 1928 return BackReference(space, completed_chunks_[space].length(), offset); | 1927 return BackReference::Reference(space, completed_chunks_[space].length(), |
| 1928 offset); |
| 1929 } | 1929 } |
| 1930 | 1930 |
| 1931 | 1931 |
| 1932 int Serializer::SpaceAreaSize(int space) { | 1932 int Serializer::SpaceAreaSize(int space) { |
| 1933 if (space == CODE_SPACE) { | 1933 if (space == CODE_SPACE) { |
| 1934 return isolate_->memory_allocator()->CodePageAreaSize(); | 1934 return isolate_->memory_allocator()->CodePageAreaSize(); |
| 1935 } else { | 1935 } else { |
| 1936 return Page::kPageSize - Page::kObjectStartOffset; | 1936 return Page::kPageSize - Page::kObjectStartOffset; |
| 1937 } | 1937 } |
| 1938 } | 1938 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2000 if (root_index != RootIndexMap::kInvalidRootIndex) { | 2000 if (root_index != RootIndexMap::kInvalidRootIndex) { |
| 2001 if (FLAG_trace_code_serializer) { | 2001 if (FLAG_trace_code_serializer) { |
| 2002 PrintF(" Encoding root: %d\n", root_index); | 2002 PrintF(" Encoding root: %d\n", root_index); |
| 2003 } | 2003 } |
| 2004 PutRoot(root_index, obj, how_to_code, where_to_point, skip); | 2004 PutRoot(root_index, obj, how_to_code, where_to_point, skip); |
| 2005 return; | 2005 return; |
| 2006 } | 2006 } |
| 2007 | 2007 |
| 2008 BackReference back_reference = back_reference_map_.Lookup(obj); | 2008 BackReference back_reference = back_reference_map_.Lookup(obj); |
| 2009 if (back_reference.is_valid()) { | 2009 if (back_reference.is_valid()) { |
| 2010 if (FLAG_trace_code_serializer) { | 2010 if (back_reference.is_source()) { |
| 2011 PrintF(" Encoding back reference to: "); | 2011 DCHECK_EQ(source_, obj); |
| 2012 obj->ShortPrint(); | 2012 SerializeSourceObject(how_to_code, where_to_point); |
| 2013 PrintF("\n"); | 2013 } else { |
| 2014 if (FLAG_trace_code_serializer) { |
| 2015 PrintF(" Encoding back reference to: "); |
| 2016 obj->ShortPrint(); |
| 2017 PrintF("\n"); |
| 2018 } |
| 2019 SerializeBackReference(back_reference, how_to_code, where_to_point, skip); |
| 2014 } | 2020 } |
| 2015 SerializeBackReference(back_reference, how_to_code, where_to_point, skip); | |
| 2016 return; | 2021 return; |
| 2017 } | 2022 } |
| 2018 | 2023 |
| 2019 if (skip != 0) { | 2024 if (skip != 0) { |
| 2020 sink_->Put(kSkip, "SkipFromSerializeObject"); | 2025 sink_->Put(kSkip, "SkipFromSerializeObject"); |
| 2021 sink_->PutInt(skip, "SkipDistanceFromSerializeObject"); | 2026 sink_->PutInt(skip, "SkipDistanceFromSerializeObject"); |
| 2022 } | 2027 } |
| 2023 | 2028 |
| 2024 if (obj->IsCode()) { | 2029 if (obj->IsCode()) { |
| 2025 Code* code_object = Code::cast(obj); | 2030 Code* code_object = Code::cast(obj); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2049 SerializeBuiltin(Builtins::kCompileLazy, how_to_code, where_to_point); | 2054 SerializeBuiltin(Builtins::kCompileLazy, how_to_code, where_to_point); |
| 2050 } else { | 2055 } else { |
| 2051 code_object->MakeYoung(); | 2056 code_object->MakeYoung(); |
| 2052 SerializeGeneric(code_object, how_to_code, where_to_point); | 2057 SerializeGeneric(code_object, how_to_code, where_to_point); |
| 2053 } | 2058 } |
| 2054 return; | 2059 return; |
| 2055 } | 2060 } |
| 2056 UNREACHABLE(); | 2061 UNREACHABLE(); |
| 2057 } | 2062 } |
| 2058 | 2063 |
| 2059 if (obj == source_) { | |
| 2060 SerializeSourceObject(how_to_code, where_to_point); | |
| 2061 return; | |
| 2062 } | |
| 2063 | |
| 2064 // Past this point we should not see any (context-specific) maps anymore. | 2064 // Past this point we should not see any (context-specific) maps anymore. |
| 2065 CHECK(!obj->IsMap()); | 2065 CHECK(!obj->IsMap()); |
| 2066 // There should be no references to the global object embedded. | 2066 // There should be no references to the global object embedded. |
| 2067 CHECK(!obj->IsJSGlobalProxy() && !obj->IsGlobalObject()); | 2067 CHECK(!obj->IsJSGlobalProxy() && !obj->IsGlobalObject()); |
| 2068 // There should be no hash table embedded. They would require rehashing. | 2068 // There should be no hash table embedded. They would require rehashing. |
| 2069 CHECK(!obj->IsHashTable()); | 2069 CHECK(!obj->IsHashTable()); |
| 2070 | 2070 |
| 2071 SerializeGeneric(obj, how_to_code, where_to_point); | 2071 SerializeGeneric(obj, how_to_code, where_to_point); |
| 2072 } | 2072 } |
| 2073 | 2073 |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2324 | 2324 |
| 2325 int SerializedCodeData::CheckSum(String* string) { | 2325 int SerializedCodeData::CheckSum(String* string) { |
| 2326 int checksum = Version::Hash(); | 2326 int checksum = Version::Hash(); |
| 2327 #ifdef DEBUG | 2327 #ifdef DEBUG |
| 2328 uint32_t seed = static_cast<uint32_t>(checksum); | 2328 uint32_t seed = static_cast<uint32_t>(checksum); |
| 2329 checksum = static_cast<int>(IteratingStringHasher::Hash(string, seed)); | 2329 checksum = static_cast<int>(IteratingStringHasher::Hash(string, seed)); |
| 2330 #endif // DEBUG | 2330 #endif // DEBUG |
| 2331 return checksum; | 2331 return checksum; |
| 2332 } | 2332 } |
| 2333 } } // namespace v8::internal | 2333 } } // namespace v8::internal |
| OLD | NEW |