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 2167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2178 WhereToPoint where_to_point) { | 2178 WhereToPoint where_to_point) { |
2179 if (FLAG_trace_code_serializer) PrintF(" Encoding source object\n"); | 2179 if (FLAG_trace_code_serializer) PrintF(" Encoding source object\n"); |
2180 | 2180 |
2181 DCHECK(how_to_code == kPlain && where_to_point == kStartOfObject); | 2181 DCHECK(how_to_code == kPlain && where_to_point == kStartOfObject); |
2182 sink_->Put(kAttachedReference + how_to_code + where_to_point, "Source"); | 2182 sink_->Put(kAttachedReference + how_to_code + where_to_point, "Source"); |
2183 sink_->PutInt(kSourceObjectIndex, "kSourceObjectIndex"); | 2183 sink_->PutInt(kSourceObjectIndex, "kSourceObjectIndex"); |
2184 } | 2184 } |
2185 | 2185 |
2186 | 2186 |
2187 MaybeHandle<SharedFunctionInfo> CodeSerializer::Deserialize( | 2187 MaybeHandle<SharedFunctionInfo> CodeSerializer::Deserialize( |
2188 Isolate* isolate, ScriptData* cached_data, Handle<String> source) { | 2188 Isolate* isolate, ScriptData* data, Handle<String> source) { |
2189 base::ElapsedTimer timer; | 2189 base::ElapsedTimer timer; |
2190 if (FLAG_profile_deserialization) timer.Start(); | 2190 if (FLAG_profile_deserialization) timer.Start(); |
2191 | 2191 |
2192 Object* root; | 2192 Object* root; |
2193 | 2193 |
2194 { | 2194 { |
2195 HandleScope scope(isolate); | 2195 HandleScope scope(isolate); |
2196 | 2196 |
2197 SerializedCodeData* scd = | 2197 SerializedCodeData scd(data, *source); |
2198 SerializedCodeData::FromCachedData(cached_data, *source); | 2198 SnapshotByteSource payload(scd.Payload(), scd.PayloadLength()); |
2199 if (scd == NULL) { | |
2200 if (FLAG_profile_deserialization) PrintF("[Cached code failed check]\n"); | |
2201 DCHECK(cached_data->rejected()); | |
2202 return MaybeHandle<SharedFunctionInfo>(); | |
2203 } | |
2204 SnapshotByteSource payload(scd->Payload(), scd->PayloadLength()); | |
2205 Deserializer deserializer(&payload); | 2199 Deserializer deserializer(&payload); |
2206 | 2200 |
2207 // Eagerly expand string table to avoid allocations during deserialization. | 2201 // Eagerly expand string table to avoid allocations during deserialization. |
2208 StringTable::EnsureCapacityForDeserialization( | 2202 StringTable::EnsureCapacityForDeserialization(isolate, |
2209 isolate, scd->NumInternalizedStrings()); | 2203 scd.NumInternalizedStrings()); |
2210 | 2204 |
2211 // Set reservations. | 2205 // Set reservations. |
2212 STATIC_ASSERT(NEW_SPACE == 0); | 2206 STATIC_ASSERT(NEW_SPACE == 0); |
2213 int current_space = NEW_SPACE; | 2207 int current_space = NEW_SPACE; |
2214 Vector<const SerializedCodeData::Reservation> res = scd->Reservations(); | 2208 Vector<const SerializedCodeData::Reservation> res = scd.Reservations(); |
2215 for (const auto& r : res) { | 2209 for (const auto& r : res) { |
2216 deserializer.AddReservation(current_space, r.chunk_size()); | 2210 deserializer.AddReservation(current_space, r.chunk_size()); |
2217 if (r.is_last_chunk()) current_space++; | 2211 if (r.is_last_chunk()) current_space++; |
2218 } | 2212 } |
2219 DCHECK_EQ(kNumberOfSpaces, current_space); | 2213 DCHECK_EQ(kNumberOfSpaces, current_space); |
2220 | 2214 |
2221 // Prepare and register list of attached objects. | 2215 // Prepare and register list of attached objects. |
2222 Vector<const uint32_t> code_stub_keys = scd->CodeStubKeys(); | 2216 Vector<const uint32_t> code_stub_keys = scd.CodeStubKeys(); |
2223 Vector<Handle<Object> > attached_objects = Vector<Handle<Object> >::New( | 2217 Vector<Handle<Object> > attached_objects = Vector<Handle<Object> >::New( |
2224 code_stub_keys.length() + kCodeStubsBaseIndex); | 2218 code_stub_keys.length() + kCodeStubsBaseIndex); |
2225 attached_objects[kSourceObjectIndex] = source; | 2219 attached_objects[kSourceObjectIndex] = source; |
2226 for (int i = 0; i < code_stub_keys.length(); i++) { | 2220 for (int i = 0; i < code_stub_keys.length(); i++) { |
2227 attached_objects[i + kCodeStubsBaseIndex] = | 2221 attached_objects[i + kCodeStubsBaseIndex] = |
2228 CodeStub::GetCode(isolate, code_stub_keys[i]).ToHandleChecked(); | 2222 CodeStub::GetCode(isolate, code_stub_keys[i]).ToHandleChecked(); |
2229 } | 2223 } |
2230 deserializer.SetAttachedObjects(&attached_objects); | 2224 deserializer.SetAttachedObjects(&attached_objects); |
2231 | 2225 |
2232 // Deserialize. | 2226 // Deserialize. |
2233 deserializer.DeserializePartial(isolate, &root, Deserializer::NULL_ON_OOM); | 2227 deserializer.DeserializePartial(isolate, &root, Deserializer::NULL_ON_OOM); |
2234 if (root == NULL) { | 2228 if (root == NULL) { |
2235 // Deserializing may fail if the reservations cannot be fulfilled. | 2229 // Deserializing may fail if the reservations cannot be fulfilled. |
2236 if (FLAG_profile_deserialization) PrintF("[Deserializing failed]\n"); | 2230 if (FLAG_profile_deserialization) PrintF("[Deserializing failed]\n"); |
2237 return MaybeHandle<SharedFunctionInfo>(); | 2231 return MaybeHandle<SharedFunctionInfo>(); |
2238 } | 2232 } |
2239 deserializer.FlushICacheForNewCodeObjects(); | 2233 deserializer.FlushICacheForNewCodeObjects(); |
2240 } | 2234 } |
2241 | 2235 |
2242 if (FLAG_profile_deserialization) { | 2236 if (FLAG_profile_deserialization) { |
2243 double ms = timer.Elapsed().InMillisecondsF(); | 2237 double ms = timer.Elapsed().InMillisecondsF(); |
2244 int length = cached_data->length(); | 2238 int length = data->length(); |
2245 PrintF("[Deserializing from %d bytes took %0.3f ms]\n", length, ms); | 2239 PrintF("[Deserializing from %d bytes took %0.3f ms]\n", length, ms); |
2246 } | 2240 } |
2247 Handle<SharedFunctionInfo> result(SharedFunctionInfo::cast(root), isolate); | 2241 Handle<SharedFunctionInfo> result(SharedFunctionInfo::cast(root), isolate); |
2248 result->set_deserialized(true); | 2242 result->set_deserialized(true); |
2249 | 2243 |
2250 if (isolate->logger()->is_logging_code_events() || | 2244 if (isolate->logger()->is_logging_code_events() || |
2251 isolate->cpu_profiler()->is_profiling()) { | 2245 isolate->cpu_profiler()->is_profiling()) { |
2252 String* name = isolate->heap()->empty_string(); | 2246 String* name = isolate->heap()->empty_string(); |
2253 if (result->script()->IsScript()) { | 2247 if (result->script()->IsScript()) { |
2254 Script* script = Script::cast(result->script()); | 2248 Script* script = Script::cast(result->script()); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2314 } | 2308 } |
2315 | 2309 |
2316 | 2310 |
2317 bool SerializedCodeData::IsSane(String* source) { | 2311 bool SerializedCodeData::IsSane(String* source) { |
2318 return GetHeaderValue(kCheckSumOffset) == CheckSum(source) && | 2312 return GetHeaderValue(kCheckSumOffset) == CheckSum(source) && |
2319 PayloadLength() >= SharedFunctionInfo::kSize; | 2313 PayloadLength() >= SharedFunctionInfo::kSize; |
2320 } | 2314 } |
2321 | 2315 |
2322 | 2316 |
2323 int SerializedCodeData::CheckSum(String* string) { | 2317 int SerializedCodeData::CheckSum(String* string) { |
2324 return Version::Hash() ^ string->length(); | 2318 int checksum = Version::Hash(); |
| 2319 #ifdef DEBUG |
| 2320 uint32_t seed = static_cast<uint32_t>(checksum); |
| 2321 checksum = static_cast<int>(IteratingStringHasher::Hash(string, seed)); |
| 2322 #endif // DEBUG |
| 2323 return checksum; |
2325 } | 2324 } |
2326 } } // namespace v8::internal | 2325 } } // namespace v8::internal |
OLD | NEW |