| 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 1079 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1090 // No active or weak handles. | 1090 // No active or weak handles. |
| 1091 CHECK(HandleScopeImplementer::instance()->blocks()->is_empty()); | 1091 CHECK(HandleScopeImplementer::instance()->blocks()->is_empty()); |
| 1092 CHECK_EQ(0, GlobalHandles::NumberOfWeakHandles()); | 1092 CHECK_EQ(0, GlobalHandles::NumberOfWeakHandles()); |
| 1093 // We need a counter function during serialization to resolve the | 1093 // We need a counter function during serialization to resolve the |
| 1094 // references to counters in the code on the heap. | 1094 // references to counters in the code on the heap. |
| 1095 CHECK(StatsTable::HasCounterFunction()); | 1095 CHECK(StatsTable::HasCounterFunction()); |
| 1096 CHECK(enabled()); | 1096 CHECK(enabled()); |
| 1097 InitializeAllocators(); | 1097 InitializeAllocators(); |
| 1098 reference_encoder_ = new ExternalReferenceEncoder(); | 1098 reference_encoder_ = new ExternalReferenceEncoder(); |
| 1099 PutHeader(); | 1099 PutHeader(); |
| 1100 Heap::IterateRoots(this); | 1100 Heap::IterateRoots(this, VISIT_ONLY_STRONG); |
| 1101 PutLog(); | 1101 PutLog(); |
| 1102 PutContextStack(); | 1102 PutContextStack(); |
| 1103 Disable(); | 1103 Disable(); |
| 1104 } | 1104 } |
| 1105 | 1105 |
| 1106 | 1106 |
| 1107 void Serializer::Finalize(byte** str, int* len) { | 1107 void Serializer::Finalize(byte** str, int* len) { |
| 1108 writer_->GetBytes(str, len); | 1108 writer_->GetBytes(str, len); |
| 1109 } | 1109 } |
| 1110 | 1110 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1193 writer_->PutInt(Heap::code_space()->Size() + Heap::new_space()->Size()); | 1193 writer_->PutInt(Heap::code_space()->Size() + Heap::new_space()->Size()); |
| 1194 writer_->PutC('|'); | 1194 writer_->PutC('|'); |
| 1195 writer_->PutInt(Heap::map_space()->Size()); | 1195 writer_->PutInt(Heap::map_space()->Size()); |
| 1196 writer_->PutC('|'); | 1196 writer_->PutC('|'); |
| 1197 writer_->PutInt(Heap::cell_space()->Size()); | 1197 writer_->PutInt(Heap::cell_space()->Size()); |
| 1198 writer_->PutC(']'); | 1198 writer_->PutC(']'); |
| 1199 // Write global handles. | 1199 // Write global handles. |
| 1200 writer_->PutC('G'); | 1200 writer_->PutC('G'); |
| 1201 writer_->PutC('['); | 1201 writer_->PutC('['); |
| 1202 GlobalHandlesRetriever ghr(&global_handles_); | 1202 GlobalHandlesRetriever ghr(&global_handles_); |
| 1203 GlobalHandles::IterateRoots(&ghr); | 1203 GlobalHandles::IterateStrongRoots(&ghr); |
| 1204 for (int i = 0; i < global_handles_.length(); i++) { | 1204 for (int i = 0; i < global_handles_.length(); i++) { |
| 1205 writer_->PutC('N'); | 1205 writer_->PutC('N'); |
| 1206 } | 1206 } |
| 1207 writer_->PutC(']'); | 1207 writer_->PutC(']'); |
| 1208 } | 1208 } |
| 1209 | 1209 |
| 1210 | 1210 |
| 1211 void Serializer::PutLog() { | 1211 void Serializer::PutLog() { |
| 1212 #ifdef ENABLE_LOGGING_AND_PROFILING | 1212 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 1213 if (FLAG_log_code) { | 1213 if (FLAG_log_code) { |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1430 while (start < end) { | 1430 while (start < end) { |
| 1431 GlobalHandles::Destroy(start++); | 1431 GlobalHandles::Destroy(start++); |
| 1432 } | 1432 } |
| 1433 } | 1433 } |
| 1434 }; | 1434 }; |
| 1435 | 1435 |
| 1436 | 1436 |
| 1437 void Deserializer::Deserialize() { | 1437 void Deserializer::Deserialize() { |
| 1438 // No global handles. | 1438 // No global handles. |
| 1439 NoGlobalHandlesChecker checker; | 1439 NoGlobalHandlesChecker checker; |
| 1440 GlobalHandles::IterateRoots(&checker); | 1440 GlobalHandles::IterateStrongRoots(&checker); |
| 1441 // No active threads. | 1441 // No active threads. |
| 1442 ASSERT_EQ(NULL, ThreadState::FirstInUse()); | 1442 ASSERT_EQ(NULL, ThreadState::FirstInUse()); |
| 1443 // No active handles. | 1443 // No active handles. |
| 1444 ASSERT(HandleScopeImplementer::instance()->blocks()->is_empty()); | 1444 ASSERT(HandleScopeImplementer::instance()->blocks()->is_empty()); |
| 1445 reference_decoder_ = new ExternalReferenceDecoder(); | 1445 reference_decoder_ = new ExternalReferenceDecoder(); |
| 1446 // By setting linear allocation only, we forbid the use of free list | 1446 // By setting linear allocation only, we forbid the use of free list |
| 1447 // allocation which is not predicted by SimulatedAddress. | 1447 // allocation which is not predicted by SimulatedAddress. |
| 1448 GetHeader(); | 1448 GetHeader(); |
| 1449 Heap::IterateRoots(this); | 1449 Heap::IterateRoots(this, VISIT_ONLY_STRONG); |
| 1450 GetContextStack(); | 1450 GetContextStack(); |
| 1451 // Any global handles that have been set up by deserialization are leaked | 1451 // Any global handles that have been set up by deserialization are leaked |
| 1452 // since noone is keeping track of them. So we discard them now. | 1452 // since noone is keeping track of them. So we discard them now. |
| 1453 GlobalHandleDestroyer destroyer; | 1453 GlobalHandleDestroyer destroyer; |
| 1454 GlobalHandles::IterateRoots(&destroyer); | 1454 GlobalHandles::IterateStrongRoots(&destroyer); |
| 1455 } | 1455 } |
| 1456 | 1456 |
| 1457 | 1457 |
| 1458 void Deserializer::VisitPointers(Object** start, Object** end) { | 1458 void Deserializer::VisitPointers(Object** start, Object** end) { |
| 1459 bool root = root_; | 1459 bool root = root_; |
| 1460 root_ = false; | 1460 root_ = false; |
| 1461 for (Object** p = start; p < end; ++p) { | 1461 for (Object** p = start; p < end; ++p) { |
| 1462 if (root) { | 1462 if (root) { |
| 1463 roots_++; | 1463 roots_++; |
| 1464 // Read the next object or pointer from the stream | 1464 // Read the next object or pointer from the stream |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1847 // Don't GC while deserializing - just expand the heap. | 1847 // Don't GC while deserializing - just expand the heap. |
| 1848 AlwaysAllocateScope always_allocate; | 1848 AlwaysAllocateScope always_allocate; |
| 1849 // Don't use the free lists while deserializing. | 1849 // Don't use the free lists while deserializing. |
| 1850 LinearAllocationScope allocate_linearly; | 1850 LinearAllocationScope allocate_linearly; |
| 1851 // No active threads. | 1851 // No active threads. |
| 1852 ASSERT_EQ(NULL, ThreadState::FirstInUse()); | 1852 ASSERT_EQ(NULL, ThreadState::FirstInUse()); |
| 1853 // No active handles. | 1853 // No active handles. |
| 1854 ASSERT(HandleScopeImplementer::instance()->blocks()->is_empty()); | 1854 ASSERT(HandleScopeImplementer::instance()->blocks()->is_empty()); |
| 1855 ASSERT(external_reference_decoder_ == NULL); | 1855 ASSERT(external_reference_decoder_ == NULL); |
| 1856 external_reference_decoder_ = new ExternalReferenceDecoder(); | 1856 external_reference_decoder_ = new ExternalReferenceDecoder(); |
| 1857 Heap::IterateRoots(this); | 1857 Heap::IterateRoots(this, VISIT_ONLY_STRONG); |
| 1858 ASSERT(source_->AtEOF()); | 1858 ASSERT(source_->AtEOF()); |
| 1859 delete external_reference_decoder_; | 1859 delete external_reference_decoder_; |
| 1860 external_reference_decoder_ = NULL; | 1860 external_reference_decoder_ = NULL; |
| 1861 } | 1861 } |
| 1862 | 1862 |
| 1863 | 1863 |
| 1864 // This is called on the roots. It is the driver of the deserialization | 1864 // This is called on the roots. It is the driver of the deserialization |
| 1865 // process. It is also called on the body of each function. | 1865 // process. It is also called on the body of each function. |
| 1866 void Deserializer2::VisitPointers(Object** start, Object** end) { | 1866 void Deserializer2::VisitPointers(Object** start, Object** end) { |
| 1867 // The space must be new space. Any other space would cause ReadChunk to try | 1867 // The space must be new space. Any other space would cause ReadChunk to try |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2118 | 2118 |
| 2119 | 2119 |
| 2120 void Serializer2::Serialize() { | 2120 void Serializer2::Serialize() { |
| 2121 // No active threads. | 2121 // No active threads. |
| 2122 CHECK_EQ(NULL, ThreadState::FirstInUse()); | 2122 CHECK_EQ(NULL, ThreadState::FirstInUse()); |
| 2123 // No active or weak handles. | 2123 // No active or weak handles. |
| 2124 CHECK(HandleScopeImplementer::instance()->blocks()->is_empty()); | 2124 CHECK(HandleScopeImplementer::instance()->blocks()->is_empty()); |
| 2125 CHECK_EQ(0, GlobalHandles::NumberOfWeakHandles()); | 2125 CHECK_EQ(0, GlobalHandles::NumberOfWeakHandles()); |
| 2126 ASSERT(external_reference_encoder_ == NULL); | 2126 ASSERT(external_reference_encoder_ == NULL); |
| 2127 external_reference_encoder_ = new ExternalReferenceEncoder(); | 2127 external_reference_encoder_ = new ExternalReferenceEncoder(); |
| 2128 Heap::IterateRoots(this); | 2128 Heap::IterateRoots(this, VISIT_ONLY_STRONG); |
| 2129 delete external_reference_encoder_; | 2129 delete external_reference_encoder_; |
| 2130 external_reference_encoder_ = NULL; | 2130 external_reference_encoder_ = NULL; |
| 2131 } | 2131 } |
| 2132 | 2132 |
| 2133 | 2133 |
| 2134 void Serializer2::VisitPointers(Object** start, Object** end) { | 2134 void Serializer2::VisitPointers(Object** start, Object** end) { |
| 2135 for (Object** current = start; current < end; current++) { | 2135 for (Object** current = start; current < end; current++) { |
| 2136 if ((*current)->IsSmi()) { | 2136 if ((*current)->IsSmi()) { |
| 2137 sink_->Put(RAW_DATA_SERIALIZATION, "RawData"); | 2137 sink_->Put(RAW_DATA_SERIALIZATION, "RawData"); |
| 2138 sink_->PutInt(kPointerSize, "length"); | 2138 sink_->PutInt(kPointerSize, "length"); |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2384 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize); | 2384 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize); |
| 2385 } | 2385 } |
| 2386 } | 2386 } |
| 2387 int allocation_address = fullness_[space]; | 2387 int allocation_address = fullness_[space]; |
| 2388 fullness_[space] = allocation_address + size; | 2388 fullness_[space] = allocation_address + size; |
| 2389 return allocation_address; | 2389 return allocation_address; |
| 2390 } | 2390 } |
| 2391 | 2391 |
| 2392 | 2392 |
| 2393 } } // namespace v8::internal | 2393 } } // namespace v8::internal |
| OLD | NEW |