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/snapshot/serialize.h" | 5 #include "src/snapshot/serialize.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 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 DisallowHeapAllocation no_gc; | 533 DisallowHeapAllocation no_gc; |
534 isolate_->heap()->IterateSmiRoots(this); | 534 isolate_->heap()->IterateSmiRoots(this); |
535 isolate_->heap()->IterateStrongRoots(this, VISIT_ONLY_STRONG); | 535 isolate_->heap()->IterateStrongRoots(this, VISIT_ONLY_STRONG); |
536 isolate_->heap()->RepairFreeListsAfterDeserialization(); | 536 isolate_->heap()->RepairFreeListsAfterDeserialization(); |
537 isolate_->heap()->IterateWeakRoots(this, VISIT_ALL); | 537 isolate_->heap()->IterateWeakRoots(this, VISIT_ALL); |
538 DeserializeDeferredObjects(); | 538 DeserializeDeferredObjects(); |
539 FlushICacheForNewIsolate(); | 539 FlushICacheForNewIsolate(); |
540 } | 540 } |
541 | 541 |
542 isolate_->heap()->set_native_contexts_list( | 542 isolate_->heap()->set_native_contexts_list( |
543 isolate_->heap()->code_stub_context()); | 543 isolate_->heap()->undefined_value()); |
544 | |
545 // The allocation site list is build during root iteration, but if no sites | 544 // The allocation site list is build during root iteration, but if no sites |
546 // were encountered then it needs to be initialized to undefined. | 545 // were encountered then it needs to be initialized to undefined. |
547 if (isolate_->heap()->allocation_sites_list() == Smi::FromInt(0)) { | 546 if (isolate_->heap()->allocation_sites_list() == Smi::FromInt(0)) { |
548 isolate_->heap()->set_allocation_sites_list( | 547 isolate_->heap()->set_allocation_sites_list( |
549 isolate_->heap()->undefined_value()); | 548 isolate_->heap()->undefined_value()); |
550 } | 549 } |
551 | 550 |
552 // Update data pointers to the external strings containing natives sources. | 551 // Update data pointers to the external strings containing natives sources. |
553 Natives::UpdateSourceCache(isolate_->heap()); | 552 Natives::UpdateSourceCache(isolate_->heap()); |
554 ExtraNatives::UpdateSourceCache(isolate_->heap()); | 553 ExtraNatives::UpdateSourceCache(isolate_->heap()); |
555 CodeStubNatives::UpdateSourceCache(isolate_->heap()); | |
556 | 554 |
557 // Issue code events for newly deserialized code objects. | 555 // Issue code events for newly deserialized code objects. |
558 LOG_CODE_EVENT(isolate_, LogCodeObjects()); | 556 LOG_CODE_EVENT(isolate_, LogCodeObjects()); |
559 LOG_CODE_EVENT(isolate_, LogCompiledFunctions()); | 557 LOG_CODE_EVENT(isolate_, LogCompiledFunctions()); |
560 } | 558 } |
561 | 559 |
562 | 560 |
563 MaybeHandle<Object> Deserializer::DeserializePartial( | 561 MaybeHandle<Object> Deserializer::DeserializePartial( |
564 Isolate* isolate, Handle<JSGlobalProxy> global_proxy) { | 562 Isolate* isolate, Handle<JSGlobalProxy> global_proxy) { |
565 Initialize(isolate); | 563 Initialize(isolate); |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1161 case kNativesStringResource: | 1159 case kNativesStringResource: |
1162 current = CopyInNativesSource(Natives::GetScriptSource(source_.Get()), | 1160 current = CopyInNativesSource(Natives::GetScriptSource(source_.Get()), |
1163 current); | 1161 current); |
1164 break; | 1162 break; |
1165 | 1163 |
1166 case kExtraNativesStringResource: | 1164 case kExtraNativesStringResource: |
1167 current = CopyInNativesSource( | 1165 current = CopyInNativesSource( |
1168 ExtraNatives::GetScriptSource(source_.Get()), current); | 1166 ExtraNatives::GetScriptSource(source_.Get()), current); |
1169 break; | 1167 break; |
1170 | 1168 |
1171 case kCodeStubNativesStringResource: | |
1172 current = CopyInNativesSource( | |
1173 CodeStubNatives::GetScriptSource(source_.Get()), current); | |
1174 break; | |
1175 | |
1176 // Deserialize raw data of variable length. | 1169 // Deserialize raw data of variable length. |
1177 case kVariableRawData: { | 1170 case kVariableRawData: { |
1178 int size_in_bytes = source_.GetInt(); | 1171 int size_in_bytes = source_.GetInt(); |
1179 byte* raw_data_out = reinterpret_cast<byte*>(current); | 1172 byte* raw_data_out = reinterpret_cast<byte*>(current); |
1180 source_.CopyRaw(raw_data_out, size_in_bytes); | 1173 source_.CopyRaw(raw_data_out, size_in_bytes); |
1181 break; | 1174 break; |
1182 } | 1175 } |
1183 | 1176 |
1184 case kVariableRepeat: { | 1177 case kVariableRepeat: { |
1185 int repeats = source_.GetInt(); | 1178 int repeats = source_.GetInt(); |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1672 // strong roots have been serialized we can create a partial snapshot | 1665 // strong roots have been serialized we can create a partial snapshot |
1673 // which will repopulate the cache with objects needed by that partial | 1666 // which will repopulate the cache with objects needed by that partial |
1674 // snapshot. | 1667 // snapshot. |
1675 isolate->partial_snapshot_cache()->Clear(); | 1668 isolate->partial_snapshot_cache()->Clear(); |
1676 InitializeCodeAddressMap(); | 1669 InitializeCodeAddressMap(); |
1677 } | 1670 } |
1678 | 1671 |
1679 | 1672 |
1680 void StartupSerializer::SerializeObject(HeapObject* obj, HowToCode how_to_code, | 1673 void StartupSerializer::SerializeObject(HeapObject* obj, HowToCode how_to_code, |
1681 WhereToPoint where_to_point, int skip) { | 1674 WhereToPoint where_to_point, int skip) { |
1682 // Make sure that all functions are derived from the code-stub context | 1675 DCHECK(!obj->IsJSFunction()); |
1683 DCHECK(!obj->IsJSFunction() || | |
1684 JSFunction::cast(obj)->GetCreationContext() == | |
1685 isolate()->heap()->code_stub_context()); | |
1686 | 1676 |
1687 int root_index = root_index_map_.Lookup(obj); | 1677 int root_index = root_index_map_.Lookup(obj); |
1688 // We can only encode roots as such if it has already been serialized. | 1678 // We can only encode roots as such if it has already been serialized. |
1689 // That applies to root indices below the wave front. | 1679 // That applies to root indices below the wave front. |
1690 if (root_index != RootIndexMap::kInvalidRootIndex && | 1680 if (root_index != RootIndexMap::kInvalidRootIndex && |
1691 root_index < root_index_wave_front_) { | 1681 root_index < root_index_wave_front_) { |
1692 PutRoot(root_index, obj, how_to_code, where_to_point, skip); | 1682 PutRoot(root_index, obj, how_to_code, where_to_point, skip); |
1693 return; | 1683 return; |
1694 } | 1684 } |
1695 | 1685 |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2200 Natives::GetSourceCache(serializer_->isolate()->heap()), | 2190 Natives::GetSourceCache(serializer_->isolate()->heap()), |
2201 kNativesStringResource)) { | 2191 kNativesStringResource)) { |
2202 return; | 2192 return; |
2203 } | 2193 } |
2204 if (SerializeExternalNativeSourceString( | 2194 if (SerializeExternalNativeSourceString( |
2205 ExtraNatives::GetBuiltinsCount(), resource_pointer, | 2195 ExtraNatives::GetBuiltinsCount(), resource_pointer, |
2206 ExtraNatives::GetSourceCache(serializer_->isolate()->heap()), | 2196 ExtraNatives::GetSourceCache(serializer_->isolate()->heap()), |
2207 kExtraNativesStringResource)) { | 2197 kExtraNativesStringResource)) { |
2208 return; | 2198 return; |
2209 } | 2199 } |
2210 if (SerializeExternalNativeSourceString( | |
2211 CodeStubNatives::GetBuiltinsCount(), resource_pointer, | |
2212 CodeStubNatives::GetSourceCache(serializer_->isolate()->heap()), | |
2213 kCodeStubNativesStringResource)) { | |
2214 return; | |
2215 } | |
2216 // One of the strings in the natives cache should match the resource. We | 2200 // One of the strings in the natives cache should match the resource. We |
2217 // don't expect any other kinds of external strings here. | 2201 // don't expect any other kinds of external strings here. |
2218 UNREACHABLE(); | 2202 UNREACHABLE(); |
2219 } | 2203 } |
2220 | 2204 |
2221 | 2205 |
2222 Address Serializer::ObjectSerializer::PrepareCode() { | 2206 Address Serializer::ObjectSerializer::PrepareCode() { |
2223 // To make snapshots reproducible, we make a copy of the code object | 2207 // To make snapshots reproducible, we make a copy of the code object |
2224 // and wipe all pointers in the copy, which we then serialize. | 2208 // and wipe all pointers in the copy, which we then serialize. |
2225 Code* original = Code::cast(object_); | 2209 Code* original = Code::cast(object_); |
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2814 SerializedCodeData* scd = new SerializedCodeData(cached_data); | 2798 SerializedCodeData* scd = new SerializedCodeData(cached_data); |
2815 SanityCheckResult r = scd->SanityCheck(isolate, source); | 2799 SanityCheckResult r = scd->SanityCheck(isolate, source); |
2816 if (r == CHECK_SUCCESS) return scd; | 2800 if (r == CHECK_SUCCESS) return scd; |
2817 cached_data->Reject(); | 2801 cached_data->Reject(); |
2818 source->GetIsolate()->counters()->code_cache_reject_reason()->AddSample(r); | 2802 source->GetIsolate()->counters()->code_cache_reject_reason()->AddSample(r); |
2819 delete scd; | 2803 delete scd; |
2820 return NULL; | 2804 return NULL; |
2821 } | 2805 } |
2822 } // namespace internal | 2806 } // namespace internal |
2823 } // namespace v8 | 2807 } // namespace v8 |
OLD | NEW |