| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/snapshot/deserializer.h" | 5 #include "src/snapshot/deserializer.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/assembler-inl.h" | 8 #include "src/assembler-inl.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/deoptimizer.h" | 10 #include "src/deoptimizer.h" |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 // We flush all code pages after deserializing the startup snapshot. In that | 349 // We flush all code pages after deserializing the startup snapshot. In that |
| 350 // case, we only need to remember code objects in the large object space. | 350 // case, we only need to remember code objects in the large object space. |
| 351 // When deserializing user code, remember each individual code object. | 351 // When deserializing user code, remember each individual code object. |
| 352 if (deserializing_user_code() || space == LO_SPACE) { | 352 if (deserializing_user_code() || space == LO_SPACE) { |
| 353 new_code_objects_.Add(Code::cast(obj)); | 353 new_code_objects_.Add(Code::cast(obj)); |
| 354 } | 354 } |
| 355 } else if (obj->IsAccessorInfo()) { | 355 } else if (obj->IsAccessorInfo()) { |
| 356 if (isolate_->external_reference_redirector()) { | 356 if (isolate_->external_reference_redirector()) { |
| 357 accessor_infos_.Add(AccessorInfo::cast(obj)); | 357 accessor_infos_.Add(AccessorInfo::cast(obj)); |
| 358 } | 358 } |
| 359 } else if (obj->IsExternalOneByteString()) { |
| 360 DCHECK(obj->map() == isolate_->heap()->native_source_string_map()); |
| 361 ExternalOneByteString* string = ExternalOneByteString::cast(obj); |
| 362 DCHECK(string->is_short()); |
| 363 string->set_resource( |
| 364 NativesExternalStringResource::DecodeForDeserialization( |
| 365 string->resource())); |
| 366 isolate_->heap()->RegisterExternalString(string); |
| 359 } | 367 } |
| 360 // Check alignment. | 368 // Check alignment. |
| 361 DCHECK_EQ(0, Heap::GetFillToAlign(obj->address(), obj->RequiredAlignment())); | 369 DCHECK_EQ(0, Heap::GetFillToAlign(obj->address(), obj->RequiredAlignment())); |
| 362 return obj; | 370 return obj; |
| 363 } | 371 } |
| 364 | 372 |
| 365 void Deserializer::CommitPostProcessedObjects(Isolate* isolate) { | 373 void Deserializer::CommitPostProcessedObjects(Isolate* isolate) { |
| 366 StringTable::EnsureCapacityForDeserialization( | 374 StringTable::EnsureCapacityForDeserialization( |
| 367 isolate, new_internalized_strings_.length()); | 375 isolate, new_internalized_strings_.length()); |
| 368 for (Handle<String> string : new_internalized_strings_) { | 376 for (Handle<String> string : new_internalized_strings_) { |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 // Assert that the current reserved chunk is still big enough. | 503 // Assert that the current reserved chunk is still big enough. |
| 496 const Heap::Reservation& reservation = reservations_[space_index]; | 504 const Heap::Reservation& reservation = reservations_[space_index]; |
| 497 int chunk_index = current_chunk_[space_index]; | 505 int chunk_index = current_chunk_[space_index]; |
| 498 CHECK_LE(high_water_[space_index], reservation[chunk_index].end); | 506 CHECK_LE(high_water_[space_index], reservation[chunk_index].end); |
| 499 #endif | 507 #endif |
| 500 if (space_index == CODE_SPACE) SkipList::Update(address, size); | 508 if (space_index == CODE_SPACE) SkipList::Update(address, size); |
| 501 return address; | 509 return address; |
| 502 } | 510 } |
| 503 } | 511 } |
| 504 | 512 |
| 505 Object** Deserializer::CopyInNativesSource(Vector<const char> source_vector, | |
| 506 Object** current) { | |
| 507 DCHECK(!isolate_->heap()->deserialization_complete()); | |
| 508 NativesExternalStringResource* resource = new NativesExternalStringResource( | |
| 509 source_vector.start(), source_vector.length()); | |
| 510 Object* resource_obj = reinterpret_cast<Object*>(resource); | |
| 511 UnalignedCopy(current++, &resource_obj); | |
| 512 return current; | |
| 513 } | |
| 514 | |
| 515 bool Deserializer::ReadData(Object** current, Object** limit, int source_space, | 513 bool Deserializer::ReadData(Object** current, Object** limit, int source_space, |
| 516 Address current_object_address) { | 514 Address current_object_address) { |
| 517 Isolate* const isolate = isolate_; | 515 Isolate* const isolate = isolate_; |
| 518 // Write barrier support costs around 1% in startup time. In fact there | 516 // Write barrier support costs around 1% in startup time. In fact there |
| 519 // are no new space objects in current boot snapshots, so it's not needed, | 517 // are no new space objects in current boot snapshots, so it's not needed, |
| 520 // but that may change. | 518 // but that may change. |
| 521 bool write_barrier_needed = | 519 bool write_barrier_needed = |
| 522 (current_object_address != NULL && source_space != NEW_SPACE && | 520 (current_object_address != NULL && source_space != NEW_SPACE && |
| 523 source_space != CODE_SPACE); | 521 source_space != CODE_SPACE); |
| 524 while (current < limit) { | 522 while (current < limit) { |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 current = limit; | 805 current = limit; |
| 808 return false; | 806 return false; |
| 809 } | 807 } |
| 810 | 808 |
| 811 case kSynchronize: | 809 case kSynchronize: |
| 812 // If we get here then that indicates that you have a mismatch between | 810 // If we get here then that indicates that you have a mismatch between |
| 813 // the number of GC roots when serializing and deserializing. | 811 // the number of GC roots when serializing and deserializing. |
| 814 CHECK(false); | 812 CHECK(false); |
| 815 break; | 813 break; |
| 816 | 814 |
| 817 case kNativesStringResource: | |
| 818 current = CopyInNativesSource(Natives::GetScriptSource(source_.Get()), | |
| 819 current); | |
| 820 break; | |
| 821 | |
| 822 case kExtraNativesStringResource: | |
| 823 current = CopyInNativesSource( | |
| 824 ExtraNatives::GetScriptSource(source_.Get()), current); | |
| 825 break; | |
| 826 | |
| 827 // Deserialize raw data of variable length. | 815 // Deserialize raw data of variable length. |
| 828 case kVariableRawData: { | 816 case kVariableRawData: { |
| 829 int size_in_bytes = source_.GetInt(); | 817 int size_in_bytes = source_.GetInt(); |
| 830 byte* raw_data_out = reinterpret_cast<byte*>(current); | 818 byte* raw_data_out = reinterpret_cast<byte*>(current); |
| 831 source_.CopyRaw(raw_data_out, size_in_bytes); | 819 source_.CopyRaw(raw_data_out, size_in_bytes); |
| 832 break; | 820 break; |
| 833 } | 821 } |
| 834 | 822 |
| 835 case kVariableRepeat: { | 823 case kVariableRepeat: { |
| 836 int repeats = source_.GetInt(); | 824 int repeats = source_.GetInt(); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 | 906 |
| 919 default: | 907 default: |
| 920 CHECK(false); | 908 CHECK(false); |
| 921 } | 909 } |
| 922 } | 910 } |
| 923 CHECK_EQ(limit, current); | 911 CHECK_EQ(limit, current); |
| 924 return true; | 912 return true; |
| 925 } | 913 } |
| 926 } // namespace internal | 914 } // namespace internal |
| 927 } // namespace v8 | 915 } // namespace v8 |
| OLD | NEW |