| 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/code-serializer.h" | 5 #include "src/snapshot/code-serializer.h" | 
| 6 | 6 | 
| 7 #include <memory> | 7 #include <memory> | 
| 8 | 8 | 
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" | 
| 10 #include "src/log.h" | 10 #include "src/log.h" | 
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 222     if (result->script()->IsScript()) { | 222     if (result->script()->IsScript()) { | 
| 223       Script* script = Script::cast(result->script()); | 223       Script* script = Script::cast(result->script()); | 
| 224       if (script->name()->IsString()) name = String::cast(script->name()); | 224       if (script->name()->IsString()) name = String::cast(script->name()); | 
| 225     } | 225     } | 
| 226     PROFILE(isolate, CodeCreateEvent(CodeEventListener::SCRIPT_TAG, | 226     PROFILE(isolate, CodeCreateEvent(CodeEventListener::SCRIPT_TAG, | 
| 227                                      result->abstract_code(), *result, name)); | 227                                      result->abstract_code(), *result, name)); | 
| 228   } | 228   } | 
| 229   return scope.CloseAndEscape(result); | 229   return scope.CloseAndEscape(result); | 
| 230 } | 230 } | 
| 231 | 231 | 
|  | 232 WasmCompiledModuleSerializer::WasmCompiledModuleSerializer( | 
|  | 233     Isolate* isolate, uint32_t source_hash, Handle<Context> native_context, | 
|  | 234     Handle<SeqOneByteString> module_bytes) | 
|  | 235     : CodeSerializer(isolate, source_hash) { | 
|  | 236   reference_map()->AddAttachedReference(*isolate->native_context()); | 
|  | 237   reference_map()->AddAttachedReference(*module_bytes); | 
|  | 238 } | 
|  | 239 | 
| 232 std::unique_ptr<ScriptData> WasmCompiledModuleSerializer::SerializeWasmModule( | 240 std::unique_ptr<ScriptData> WasmCompiledModuleSerializer::SerializeWasmModule( | 
| 233     Isolate* isolate, Handle<FixedArray> input) { | 241     Isolate* isolate, Handle<FixedArray> input) { | 
| 234   Handle<WasmCompiledModule> compiled_module = | 242   Handle<WasmCompiledModule> compiled_module = | 
| 235       Handle<WasmCompiledModule>::cast(input); | 243       Handle<WasmCompiledModule>::cast(input); | 
| 236   WasmCompiledModuleSerializer wasm_cs(isolate, 0); | 244   WasmCompiledModuleSerializer wasm_cs(isolate, 0, isolate->native_context(), | 
| 237   wasm_cs.reference_map()->AddAttachedReference(*isolate->native_context()); | 245                                        handle(compiled_module->module_bytes())); | 
| 238   wasm_cs.reference_map()->AddAttachedReference( |  | 
| 239       compiled_module->module_bytes()); |  | 
| 240   ScriptData* data = wasm_cs.Serialize(compiled_module); | 246   ScriptData* data = wasm_cs.Serialize(compiled_module); | 
| 241   return std::unique_ptr<ScriptData>(data); | 247   return std::unique_ptr<ScriptData>(data); | 
| 242 } | 248 } | 
| 243 | 249 | 
| 244 MaybeHandle<FixedArray> WasmCompiledModuleSerializer::DeserializeWasmModule( | 250 MaybeHandle<FixedArray> WasmCompiledModuleSerializer::DeserializeWasmModule( | 
| 245     Isolate* isolate, ScriptData* data, Vector<const byte> wire_bytes) { | 251     Isolate* isolate, ScriptData* data, Vector<const byte> wire_bytes) { | 
| 246   SerializedCodeData::SanityCheckResult sanity_check_result = | 252   SerializedCodeData::SanityCheckResult sanity_check_result = | 
| 247       SerializedCodeData::CHECK_SUCCESS; | 253       SerializedCodeData::CHECK_SUCCESS; | 
| 248   MaybeHandle<FixedArray> nothing; | 254   MaybeHandle<FixedArray> nothing; | 
| 249   const SerializedCodeData scd = SerializedCodeData::FromCachedData( | 255   const SerializedCodeData scd = SerializedCodeData::FromCachedData( | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 270     deserializer.AddAttachedObject( | 276     deserializer.AddAttachedObject( | 
| 271         CodeStub::GetCode(isolate, stub_keys[i]).ToHandleChecked()); | 277         CodeStub::GetCode(isolate, stub_keys[i]).ToHandleChecked()); | 
| 272   } | 278   } | 
| 273 | 279 | 
| 274   MaybeHandle<HeapObject> obj = deserializer.DeserializeObject(isolate); | 280   MaybeHandle<HeapObject> obj = deserializer.DeserializeObject(isolate); | 
| 275   if (obj.is_null() || !obj.ToHandleChecked()->IsFixedArray()) return nothing; | 281   if (obj.is_null() || !obj.ToHandleChecked()->IsFixedArray()) return nothing; | 
| 276   // Cast without type checks, as the module wrapper is not there yet. | 282   // Cast without type checks, as the module wrapper is not there yet. | 
| 277   Handle<WasmCompiledModule> compiled_module( | 283   Handle<WasmCompiledModule> compiled_module( | 
| 278       static_cast<WasmCompiledModule*>(*obj.ToHandleChecked()), isolate); | 284       static_cast<WasmCompiledModule*>(*obj.ToHandleChecked()), isolate); | 
| 279 | 285 | 
| 280   WasmCompiledModule::RecreateModuleWrapper(isolate, compiled_module); | 286   WasmCompiledModule::ReinitializeAfterDeserialization(isolate, | 
|  | 287                                                        compiled_module); | 
| 281   DCHECK(WasmCompiledModule::IsWasmCompiledModule(*compiled_module)); | 288   DCHECK(WasmCompiledModule::IsWasmCompiledModule(*compiled_module)); | 
| 282   return compiled_module; | 289   return compiled_module; | 
| 283 } | 290 } | 
| 284 | 291 | 
|  | 292 void WasmCompiledModuleSerializer::SerializeCodeObject( | 
|  | 293     Code* code_object, HowToCode how_to_code, WhereToPoint where_to_point) { | 
|  | 294   Code::Kind kind = code_object->kind(); | 
|  | 295   switch (kind) { | 
|  | 296     case Code::WASM_FUNCTION: | 
|  | 297     case Code::JS_TO_WASM_FUNCTION: | 
|  | 298       // Just serialize the code_object. | 
|  | 299       break; | 
|  | 300     case Code::WASM_TO_JS_FUNCTION: | 
|  | 301       // Serialize the illegal builtin instead. On instantiation of a | 
|  | 302       // deserialized module, these will be replaced again. | 
|  | 303       code_object = *isolate()->builtins()->Illegal(); | 
|  | 304       break; | 
|  | 305     default: | 
|  | 306       UNREACHABLE(); | 
|  | 307   } | 
|  | 308   SerializeGeneric(code_object, how_to_code, where_to_point); | 
|  | 309 } | 
|  | 310 | 
|  | 311 bool WasmCompiledModuleSerializer::ElideObject(Object* obj) { | 
|  | 312   return obj->IsWeakCell() || obj->IsForeign() || obj->IsBreakPointInfo(); | 
|  | 313 } | 
|  | 314 | 
| 285 class Checksum { | 315 class Checksum { | 
| 286  public: | 316  public: | 
| 287   explicit Checksum(Vector<const byte> payload) { | 317   explicit Checksum(Vector<const byte> payload) { | 
| 288 #ifdef MEMORY_SANITIZER | 318 #ifdef MEMORY_SANITIZER | 
| 289     // Computing the checksum includes padding bytes for objects like strings. | 319     // Computing the checksum includes padding bytes for objects like strings. | 
| 290     // Mark every object as initialized in the code serializer. | 320     // Mark every object as initialized in the code serializer. | 
| 291     MSAN_MEMORY_IS_INITIALIZED(payload.start(), payload.length()); | 321     MSAN_MEMORY_IS_INITIALIZED(payload.start(), payload.length()); | 
| 292 #endif  // MEMORY_SANITIZER | 322 #endif  // MEMORY_SANITIZER | 
| 293     // Fletcher's checksum. Modified to reduce 64-bit sums to 32-bit. | 323     // Fletcher's checksum. Modified to reduce 64-bit sums to 32-bit. | 
| 294     uintptr_t a = 1; | 324     uintptr_t a = 1; | 
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 442   *rejection_result = scd.SanityCheck(isolate, expected_source_hash); | 472   *rejection_result = scd.SanityCheck(isolate, expected_source_hash); | 
| 443   if (*rejection_result != CHECK_SUCCESS) { | 473   if (*rejection_result != CHECK_SUCCESS) { | 
| 444     cached_data->Reject(); | 474     cached_data->Reject(); | 
| 445     return SerializedCodeData(nullptr, 0); | 475     return SerializedCodeData(nullptr, 0); | 
| 446   } | 476   } | 
| 447   return scd; | 477   return scd; | 
| 448 } | 478 } | 
| 449 | 479 | 
| 450 }  // namespace internal | 480 }  // namespace internal | 
| 451 }  // namespace v8 | 481 }  // namespace v8 | 
| OLD | NEW | 
|---|