Index: src/snapshot/code-serializer.h |
diff --git a/src/snapshot/code-serializer.h b/src/snapshot/code-serializer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b217fff52b84f109a977317331373f0cc8d35ed3 |
--- /dev/null |
+++ b/src/snapshot/code-serializer.h |
@@ -0,0 +1,127 @@ |
+// Copyright 2016 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_SNAPSHOT_CODE_SERIALIZER_H_ |
+#define V8_SNAPSHOT_CODE_SERIALIZER_H_ |
+ |
+#include "src/parsing/preparse-data.h" |
+#include "src/snapshot/serializer.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+class CodeSerializer : public Serializer { |
+ public: |
+ static ScriptData* Serialize(Isolate* isolate, |
+ Handle<SharedFunctionInfo> info, |
+ Handle<String> source); |
+ |
+ MUST_USE_RESULT static MaybeHandle<SharedFunctionInfo> Deserialize( |
+ Isolate* isolate, ScriptData* cached_data, Handle<String> source); |
+ |
+ static const int kSourceObjectIndex = 0; |
+ STATIC_ASSERT(kSourceObjectReference == kSourceObjectIndex); |
+ |
+ static const int kCodeStubsBaseIndex = 1; |
+ |
+ String* source() const { |
+ DCHECK(!AllowHeapAllocation::IsAllowed()); |
+ return source_; |
+ } |
+ |
+ const List<uint32_t>* stub_keys() const { return &stub_keys_; } |
+ |
+ private: |
+ CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source) |
+ : Serializer(isolate, sink), source_(source) { |
+ back_reference_map_.AddSourceString(source); |
+ } |
+ |
+ ~CodeSerializer() override { OutputStatistics("CodeSerializer"); } |
+ |
+ void SerializeObject(HeapObject* o, HowToCode how_to_code, |
+ WhereToPoint where_to_point, int skip) override; |
+ |
+ void SerializeBuiltin(int builtin_index, HowToCode how_to_code, |
+ WhereToPoint where_to_point); |
+ void SerializeIC(Code* ic, HowToCode how_to_code, |
+ WhereToPoint where_to_point); |
+ void SerializeCodeStub(uint32_t stub_key, HowToCode how_to_code, |
+ WhereToPoint where_to_point); |
+ void SerializeGeneric(HeapObject* heap_object, HowToCode how_to_code, |
+ WhereToPoint where_to_point); |
+ int AddCodeStubKey(uint32_t stub_key); |
+ |
+ DisallowHeapAllocation no_gc_; |
+ String* source_; |
+ List<uint32_t> stub_keys_; |
+ DISALLOW_COPY_AND_ASSIGN(CodeSerializer); |
+}; |
+ |
+// Wrapper around ScriptData to provide code-serializer-specific functionality. |
+class SerializedCodeData : public SerializedData { |
+ public: |
+ // Used when consuming. |
+ static SerializedCodeData* FromCachedData(Isolate* isolate, |
+ ScriptData* cached_data, |
+ String* source); |
+ |
+ // Used when producing. |
+ SerializedCodeData(const List<byte>& payload, const CodeSerializer& cs); |
+ |
+ // Return ScriptData object and relinquish ownership over it to the caller. |
+ ScriptData* GetScriptData(); |
+ |
+ Vector<const Reservation> Reservations() const; |
+ Vector<const byte> Payload() const; |
+ |
+ Vector<const uint32_t> CodeStubKeys() const; |
+ |
+ private: |
+ explicit SerializedCodeData(ScriptData* data); |
+ |
+ 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; |
+ |
+ // The data header consists of uint32_t-sized entries: |
+ // [0] magic number and external reference count |
+ // [1] version hash |
+ // [2] source hash |
+ // [3] cpu features |
+ // [4] flag hash |
+ // [5] number of code stub keys |
+ // [6] number of reservation size entries |
+ // [7] payload length |
+ // [8] payload checksum part 1 |
+ // [9] payload checksum part 2 |
+ // ... reservations |
+ // ... code stub keys |
+ // ... serialized payload |
+ static const int kVersionHashOffset = kMagicNumberOffset + kInt32Size; |
+ static const int kSourceHashOffset = kVersionHashOffset + kInt32Size; |
+ static const int kCpuFeaturesOffset = kSourceHashOffset + kInt32Size; |
+ static const int kFlagHashOffset = kCpuFeaturesOffset + kInt32Size; |
+ static const int kNumReservationsOffset = kFlagHashOffset + kInt32Size; |
+ static const int kNumCodeStubKeysOffset = kNumReservationsOffset + kInt32Size; |
+ static const int kPayloadLengthOffset = kNumCodeStubKeysOffset + kInt32Size; |
+ static const int kChecksum1Offset = kPayloadLengthOffset + kInt32Size; |
+ static const int kChecksum2Offset = kChecksum1Offset + kInt32Size; |
+ static const int kHeaderSize = kChecksum2Offset + kInt32Size; |
+}; |
+ |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_SNAPSHOT_CODE_SERIALIZER_H_ |