Index: runtime/vm/snapshot.h |
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h |
index f838ef3370f29b804f6d014d9c85f3ef6f835a6e..d84d3fe8386e93a10a626cb301a0ebe128ecaaa6 100644 |
--- a/runtime/vm/snapshot.h |
+++ b/runtime/vm/snapshot.h |
@@ -39,7 +39,9 @@ class RawCapability; |
class RawClass; |
class RawClosureData; |
class RawContext; |
+class RawContextScope; |
class RawDouble; |
+class RawExceptionHandlers; |
class RawField; |
class RawFloat32x4; |
class RawFloat64x2; |
@@ -54,6 +56,7 @@ class RawLibrary; |
class RawLibraryPrefix; |
class RawLinkedHashMap; |
class RawLiteralToken; |
+class RawLocalVarDescriptors; |
class RawMegamorphicCache; |
class RawMint; |
class RawMixinAppType; |
@@ -63,11 +66,13 @@ class RawObject; |
class RawObjectPool; |
class RawOneByteString; |
class RawPatchClass; |
+class RawPcDescriptors; |
class RawReceivePort; |
class RawRedirectionData; |
class RawScript; |
class RawSendPort; |
class RawSmi; |
+class RawStackmap; |
class RawStacktrace; |
class RawSubtypeTestCache; |
class RawTokenStream; |
@@ -295,6 +300,24 @@ class BackRefNode : public ValueObject { |
}; |
+class InstructionsReader : public ZoneAllocated { |
+ public: |
+ explicit InstructionsReader(const uint8_t* buffer) |
+ : buffer_(buffer) { |
+ ASSERT(buffer != NULL); |
+ ASSERT(Utils::IsAligned(reinterpret_cast<uword>(buffer), |
+ OS::PreferredCodeAlignment())); |
+ } |
+ |
+ RawInstructions* GetInstructionsAt(int32_t offset, uword expected_tags); |
+ |
+ private: |
+ const uint8_t* buffer_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InstructionsReader); |
+}; |
+ |
+ |
// Reads a snapshot into objects. |
class SnapshotReader : public BaseReader { |
public: |
@@ -313,6 +336,7 @@ class SnapshotReader : public BaseReader { |
TokenStream* StreamHandle() { return &stream_; } |
ExternalTypedData* DataHandle() { return &data_; } |
TypedData* TypedDataHandle() { return &typed_data_; } |
+ Code* CodeHandle() { return &code_; } |
Snapshot::Kind kind() const { return kind_; } |
bool snapshot_code() const { return snapshot_code_; } |
@@ -365,9 +389,15 @@ class SnapshotReader : public BaseReader { |
RawFunction* NewFunction(); |
RawCode* NewCode(intptr_t pointer_offsets_length); |
RawObjectPool* NewObjectPool(intptr_t length); |
+ RawPcDescriptors* NewPcDescriptors(intptr_t length); |
+ RawLocalVarDescriptors* NewLocalVarDescriptors(intptr_t num_entries); |
+ RawExceptionHandlers* NewExceptionHandlers(intptr_t num_entries); |
+ RawStackmap* NewStackmap(intptr_t length); |
+ RawContextScope* NewContextScope(intptr_t num_variables); |
RawICData* NewICData(); |
RawMegamorphicCache* NewMegamorphicCache(); |
RawSubtypeTestCache* NewSubtypeTestCache(); |
+ RawLinkedHashMap* NewLinkedHashMap(); |
RawField* NewField(); |
RawLibrary* NewLibrary(); |
RawLibraryPrefix* NewLibraryPrefix(); |
@@ -384,11 +414,16 @@ class SnapshotReader : public BaseReader { |
RawObject* NewInteger(int64_t value); |
RawStacktrace* NewStacktrace(); |
- RawInstructions* GetInstructionsById(int32_t id); |
+ RawInstructions* GetInstructionsAt(int32_t offset, uword expected_tags) { |
+ return instructions_reader_->GetInstructionsAt(offset, expected_tags); |
+ } |
+ |
+ const uint8_t* instructions_buffer_; |
protected: |
SnapshotReader(const uint8_t* buffer, |
intptr_t size, |
+ const uint8_t* instructions_buffer, |
Snapshot::Kind kind, |
ZoneGrowableArray<BackRefNode>* backward_references, |
Thread* thread); |
@@ -483,9 +518,11 @@ class SnapshotReader : public BaseReader { |
TokenStream& stream_; // Temporary token stream handle. |
ExternalTypedData& data_; // Temporary stream data handle. |
TypedData& typed_data_; // Temporary typed data handle. |
+ Code& code_; // Temporary code handle. |
UnhandledException& error_; // Error handle. |
intptr_t max_vm_isolate_object_id_; |
ZoneGrowableArray<BackRefNode>* backward_references_; |
+ InstructionsReader* instructions_reader_; |
friend class ApiError; |
friend class Array; |
@@ -502,6 +539,7 @@ class SnapshotReader : public BaseReader { |
friend class GrowableObjectArray; |
friend class ICData; |
friend class ImmutableArray; |
+ friend class Instructions; |
friend class JSRegExp; |
friend class LanguageError; |
friend class Library; |
@@ -533,7 +571,10 @@ class SnapshotReader : public BaseReader { |
class VmIsolateSnapshotReader : public SnapshotReader { |
public: |
- VmIsolateSnapshotReader(const uint8_t* buffer, intptr_t size, Thread* thread); |
+ VmIsolateSnapshotReader(const uint8_t* buffer, |
+ intptr_t size, |
+ const uint8_t* instructions_buffer, |
+ Thread* thread); |
~VmIsolateSnapshotReader(); |
RawApiError* ReadVmIsolateSnapshot(); |
@@ -547,6 +588,7 @@ class IsolateSnapshotReader : public SnapshotReader { |
public: |
IsolateSnapshotReader(const uint8_t* buffer, |
intptr_t size, |
+ const uint8_t* instructions_buffer, |
Thread* thread); |
~IsolateSnapshotReader(); |
@@ -730,6 +772,28 @@ class ForwardList { |
}; |
+class InstructionsWriter : public ZoneAllocated { |
+ public: |
+ InstructionsWriter(uint8_t** buffer, |
+ ReAlloc alloc, |
+ intptr_t initial_size) |
+ : stream_(buffer, alloc, initial_size) { |
+ ASSERT(buffer != NULL); |
+ ASSERT(alloc != NULL); |
+ } |
+ |
+ // Size of the snapshot. |
+ intptr_t BytesWritten() const { return stream_.bytes_written(); } |
+ |
+ int32_t GetOffsetFor(RawInstructions* instructions); |
+ |
+ private: |
+ WriteStream stream_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InstructionsWriter); |
+}; |
+ |
+ |
class SnapshotWriter : public BaseWriter { |
protected: |
SnapshotWriter(Snapshot::Kind kind, |
@@ -737,8 +801,10 @@ class SnapshotWriter : public BaseWriter { |
ReAlloc alloc, |
intptr_t initial_size, |
ForwardList* forward_list, |
+ InstructionsWriter* instructions_writer, |
bool can_send_any_object, |
- bool snapshot_code); |
+ bool snapshot_code, |
+ bool vm_isolate_is_symbolic); |
public: |
// Snapshot kind. |
@@ -761,6 +827,7 @@ class SnapshotWriter : public BaseWriter { |
} |
bool can_send_any_object() const { return can_send_any_object_; } |
bool snapshot_code() const { return snapshot_code_; } |
+ bool vm_isolate_is_symbolic() const { return vm_isolate_is_symbolic_; } |
void ThrowException(Exceptions::ExceptionType type, const char* msg); |
// Write a version string for the snapshot. |
@@ -768,7 +835,9 @@ class SnapshotWriter : public BaseWriter { |
static intptr_t FirstObjectId(); |
- int32_t GetInstructionsId(RawInstructions* instructions) { return 0; } |
+ int32_t GetInstructionsId(RawInstructions* instructions) { |
+ return instructions_writer_->GetOffsetFor(instructions); |
+ } |
protected: |
void UnmarkAll() { |
@@ -779,7 +848,7 @@ class SnapshotWriter : public BaseWriter { |
} |
bool CheckAndWritePredefinedObject(RawObject* raw); |
- void HandleVMIsolateObject(RawObject* raw); |
+ bool HandleVMIsolateObject(RawObject* raw); |
void WriteClassId(RawClass* cls); |
void WriteStaticImplicitClosure(intptr_t object_id, |
@@ -826,11 +895,13 @@ class SnapshotWriter : public BaseWriter { |
ObjectStore* object_store_; // Object store for common classes. |
ClassTable* class_table_; // Class table for the class index to class lookup. |
ForwardList* forward_list_; |
+ InstructionsWriter* instructions_writer_; |
Exceptions::ExceptionType exception_type_; // Exception type. |
const char* exception_msg_; // Message associated with exception. |
bool unmarked_objects_; // True if marked objects have been unmarked. |
bool can_send_any_object_; // True if any Dart instance can be sent. |
bool snapshot_code_; |
+ bool vm_isolate_is_symbolic_; |
friend class FullSnapshotWriter; |
friend class RawArray; |
@@ -866,8 +937,10 @@ class FullSnapshotWriter { |
static const intptr_t kInitialSize = 64 * KB; |
FullSnapshotWriter(uint8_t** vm_isolate_snapshot_buffer, |
uint8_t** isolate_snapshot_buffer, |
+ uint8_t** instructions_snapshot_buffer, |
ReAlloc alloc, |
- bool snapshot_code); |
+ bool snapshot_code, |
+ bool vm_isolate_is_symbolic); |
~FullSnapshotWriter(); |
uint8_t** vm_isolate_snapshot_buffer() { |
@@ -887,6 +960,9 @@ class FullSnapshotWriter { |
intptr_t IsolateSnapshotSize() const { |
return isolate_snapshot_size_; |
} |
+ intptr_t InstructionsSnapshotSize() const { |
+ return instructions_snapshot_size_; |
+ } |
private: |
// Writes a snapshot of the VM Isolate. |
@@ -898,13 +974,17 @@ class FullSnapshotWriter { |
Isolate* isolate_; |
uint8_t** vm_isolate_snapshot_buffer_; |
uint8_t** isolate_snapshot_buffer_; |
+ uint8_t** instructions_snapshot_buffer_; |
ReAlloc alloc_; |
intptr_t vm_isolate_snapshot_size_; |
intptr_t isolate_snapshot_size_; |
+ intptr_t instructions_snapshot_size_; |
ForwardList* forward_list_; |
+ InstructionsWriter* instructions_writer_; |
Array& scripts_; |
Array& symbol_table_; |
bool snapshot_code_; |
+ bool vm_isolate_is_symbolic_; |
DISALLOW_COPY_AND_ASSIGN(FullSnapshotWriter); |
}; |
@@ -914,6 +994,7 @@ class PrecompiledSnapshotWriter : public FullSnapshotWriter { |
public: |
PrecompiledSnapshotWriter(uint8_t** vm_isolate_snapshot_buffer, |
uint8_t** isolate_snapshot_buffer, |
+ uint8_t** instructions_snapshot_buffer, |
ReAlloc alloc); |
~PrecompiledSnapshotWriter(); |
}; |