Index: src/snapshot/code-serializer.h |
diff --git a/src/snapshot/code-serializer.h b/src/snapshot/code-serializer.h |
index 19489396b4641434541cfb715ecb6f6479acdc65..6a5937d72821f133cf72d77a3e98f693a20f2a6d 100644 |
--- a/src/snapshot/code-serializer.h |
+++ b/src/snapshot/code-serializer.h |
@@ -17,24 +17,29 @@ class CodeSerializer : public Serializer { |
Handle<SharedFunctionInfo> info, |
Handle<String> source); |
+ ScriptData* Serialize(Handle<HeapObject> obj); |
+ |
MUST_USE_RESULT static MaybeHandle<SharedFunctionInfo> Deserialize( |
Isolate* isolate, ScriptData* cached_data, Handle<String> source); |
- String* source() const { |
- DCHECK(!AllowHeapAllocation::IsAllowed()); |
- return source_; |
- } |
- |
const List<uint32_t>* stub_keys() const { return &stub_keys_; } |
- private: |
- CodeSerializer(Isolate* isolate, String* source) |
- : Serializer(isolate), source_(source) { |
- reference_map_.AddAttachedReference(source); |
- } |
+ uint32_t source_hash() const { return source_hash_; } |
+ protected: |
+ explicit CodeSerializer(Isolate* isolate, uint32_t source_hash) |
+ : Serializer(isolate), source_hash_(source_hash) {} |
~CodeSerializer() override { OutputStatistics("CodeSerializer"); } |
+ virtual void SerializeCodeObject(Code* code_object, HowToCode how_to_code, |
+ WhereToPoint where_to_point) { |
+ UNREACHABLE(); |
+ } |
+ |
+ void SerializeGeneric(HeapObject* heap_object, HowToCode how_to_code, |
+ WhereToPoint where_to_point); |
+ |
+ private: |
void SerializeObject(HeapObject* o, HowToCode how_to_code, |
WhereToPoint where_to_point, int skip) override; |
@@ -42,22 +47,55 @@ class CodeSerializer : public Serializer { |
WhereToPoint where_to_point); |
void SerializeCodeStub(Code* code_stub, HowToCode how_to_code, |
WhereToPoint where_to_point); |
- void SerializeGeneric(HeapObject* heap_object, HowToCode how_to_code, |
- WhereToPoint where_to_point); |
DisallowHeapAllocation no_gc_; |
- String* source_; |
+ uint32_t source_hash_; |
List<uint32_t> stub_keys_; |
DISALLOW_COPY_AND_ASSIGN(CodeSerializer); |
}; |
+class WasmCompiledModuleSerializer : public CodeSerializer { |
+ public: |
+ static std::unique_ptr<ScriptData> SerializeWasmModule( |
+ Isolate* isolate, Handle<FixedArray> compiled_module); |
+ static MaybeHandle<FixedArray> DeserializeWasmModule(Isolate* isolate, |
+ ScriptData* data); |
+ |
+ protected: |
+ void SerializeCodeObject(Code* code_object, HowToCode how_to_code, |
+ WhereToPoint where_to_point) override { |
+ Code::Kind kind = code_object->kind(); |
+ if (kind == Code::WASM_FUNCTION || kind == Code::WASM_TO_JS_FUNCTION || |
+ kind == Code::JS_TO_WASM_FUNCTION) { |
+ SerializeGeneric(code_object, how_to_code, where_to_point); |
+ } else { |
+ UNREACHABLE(); |
+ } |
+ } |
+ |
+ private: |
+ WasmCompiledModuleSerializer(Isolate* isolate, uint32_t source_hash) |
+ : CodeSerializer(isolate, source_hash) {} |
+ DISALLOW_COPY_AND_ASSIGN(WasmCompiledModuleSerializer); |
+}; |
+ |
// Wrapper around ScriptData to provide code-serializer-specific functionality. |
class SerializedCodeData : public SerializedData { |
public: |
+ enum SanityCheckResult { |
+ CHECK_SUCCESS = 0, |
+ MAGIC_NUMBER_MISMATCH = 1, |
+ VERSION_MISMATCH = 2, |
+ SOURCE_MISMATCH = 3, |
+ CPU_FEATURES_MISMATCH = 4, |
+ FLAGS_MISMATCH = 5, |
+ CHECKSUM_MISMATCH = 6 |
+ }; |
+ |
// Used when consuming. |
- static SerializedCodeData* FromCachedData(Isolate* isolate, |
- ScriptData* cached_data, |
- String* source); |
+ static const SerializedCodeData FromCachedData( |
+ Isolate* isolate, ScriptData* cached_data, uint32_t expected_source_hash, |
+ SanityCheckResult* rejection_result); |
// Used when producing. |
SerializedCodeData(const List<byte>* payload, const CodeSerializer* cs); |
@@ -70,23 +108,15 @@ class SerializedCodeData : public SerializedData { |
Vector<const uint32_t> CodeStubKeys() const; |
+ static uint32_t SourceHash(Handle<String> source); |
+ |
private: |
explicit SerializedCodeData(ScriptData* data); |
+ SerializedCodeData(const byte* data, int size) |
+ : SerializedData(const_cast<byte*>(data), size) {} |
- enum SanityCheckResult { |
- CHECK_SUCCESS = 0, |
- MAGIC_NUMBER_MISMATCH = 1, |
- VERSION_MISMATCH = 2, |
- SOURCE_MISMATCH = 3, |
- CPU_FEATURES_MISMATCH = 4, |
- FLAGS_MISMATCH = 5, |
- CHECKSUM_MISMATCH = 6 |
- }; |
- |
- SanityCheckResult SanityCheck(Isolate* isolate, String* source) const; |
- |
- uint32_t SourceHash(String* source) const; |
- |
+ SanityCheckResult SanityCheck(Isolate* isolate, |
+ uint32_t expected_source_hash) const; |
// The data header consists of uint32_t-sized entries: |
// [0] magic number and external reference count |
// [1] version hash |