| Index: runtime/vm/snapshot.cc
|
| diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
|
| index e5c5b0bbbc4cfa5c0e8a88597a37432d35b71824..a041609c391f29f5137bc2b24ba97e3e343ab93c 100644
|
| --- a/runtime/vm/snapshot.cc
|
| +++ b/runtime/vm/snapshot.cc
|
| @@ -29,8 +29,6 @@
|
|
|
| namespace dart {
|
|
|
| -static const int kNumVmIsolateSnapshotReferences = 32 * KB;
|
| -static const int kNumInitialReferencesInFullSnapshot = 160 * KB;
|
| static const int kNumInitialReferences = 64;
|
|
|
|
|
| @@ -586,82 +584,6 @@ class HeapLocker : public StackResource {
|
| };
|
|
|
|
|
| -RawApiError* SnapshotReader::ReadFullSnapshot() {
|
| - ASSERT(Snapshot::IsFull(kind_));
|
| - Thread* thread = Thread::Current();
|
| - Isolate* isolate = thread->isolate();
|
| - ASSERT(isolate != NULL);
|
| - ObjectStore* object_store = isolate->object_store();
|
| - ASSERT(object_store != NULL);
|
| -
|
| - // First read the version string, and check that it matches.
|
| - RawApiError* error = VerifyVersionAndFeatures();
|
| - if (error != ApiError::null()) {
|
| - return error;
|
| - }
|
| -
|
| - // The version string matches. Read the rest of the snapshot.
|
| -
|
| - // TODO(asiva): Add a check here to ensure we have the right heap
|
| - // size for the full snapshot being read.
|
| - {
|
| - NoSafepointScope no_safepoint;
|
| - HeapLocker hl(thread, old_space());
|
| -
|
| - // Read in all the objects stored in the object store.
|
| - intptr_t num_flds =
|
| - (object_store->to_snapshot(kind_) - object_store->from());
|
| - for (intptr_t i = 0; i <= num_flds; i++) {
|
| - *(object_store->from() + i) = ReadObjectImpl(kAsInlinedObject);
|
| - }
|
| - for (intptr_t i = 0; i < backward_references_->length(); i++) {
|
| - if (!(*backward_references_)[i].is_deserialized()) {
|
| - ReadObjectImpl(kAsInlinedObject);
|
| - (*backward_references_)[i].set_state(kIsDeserialized);
|
| - }
|
| - }
|
| -
|
| - if (kind_ == Snapshot::kAppNoJIT) {
|
| - ICData& ic = ICData::Handle(thread->zone());
|
| - Object& funcOrCode = Object::Handle(thread->zone());
|
| - Code& code = Code::Handle(thread->zone());
|
| - Smi& entry_point = Smi::Handle(thread->zone());
|
| - for (intptr_t i = 0; i < backward_references_->length(); i++) {
|
| - if ((*backward_references_)[i].reference()->IsICData()) {
|
| - ic ^= (*backward_references_)[i].reference()->raw();
|
| - for (intptr_t j = 0; j < ic.NumberOfChecks(); j++) {
|
| - funcOrCode = ic.GetTargetOrCodeAt(j);
|
| - if (funcOrCode.IsCode()) {
|
| - code ^= funcOrCode.raw();
|
| - entry_point = Smi::FromAlignedAddress(code.EntryPoint());
|
| - ic.SetEntryPointAt(j, entry_point);
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Validate the class table.
|
| -#if defined(DEBUG)
|
| - isolate->ValidateClassTable();
|
| -#endif
|
| -
|
| - // Setup native resolver for bootstrap impl.
|
| - Bootstrap::SetupNativeResolver();
|
| - }
|
| -
|
| - Class& cls = Class::Handle(thread->zone());
|
| - for (intptr_t i = 0; i < backward_references_->length(); i++) {
|
| - if ((*backward_references_)[i].reference()->IsClass()) {
|
| - cls ^= (*backward_references_)[i].reference()->raw();
|
| - cls.RehashConstants(thread->zone());
|
| - }
|
| - }
|
| -
|
| - return ApiError::null();
|
| -}
|
| -
|
| -
|
| RawObject* SnapshotReader::ReadScriptSnapshot() {
|
| ASSERT(kind_ == Snapshot::kScript);
|
|
|
| @@ -1702,108 +1624,6 @@ void SnapshotReader::ArrayReadFrom(intptr_t object_id,
|
| }
|
|
|
|
|
| -VmIsolateSnapshotReader::VmIsolateSnapshotReader(
|
| - Snapshot::Kind kind,
|
| - const uint8_t* buffer,
|
| - intptr_t size,
|
| - const uint8_t* instructions_buffer,
|
| - const uint8_t* data_buffer,
|
| - Thread* thread)
|
| - : SnapshotReader(buffer,
|
| - size,
|
| - instructions_buffer,
|
| - data_buffer,
|
| - kind,
|
| - new ZoneGrowableArray<BackRefNode>(
|
| - kNumVmIsolateSnapshotReferences),
|
| - thread) {
|
| - ASSERT(Snapshot::IsFull(kind));
|
| -}
|
| -
|
| -
|
| -VmIsolateSnapshotReader::~VmIsolateSnapshotReader() {
|
| - intptr_t len = GetBackwardReferenceTable()->length();
|
| - Object::InitVmIsolateSnapshotObjectTable(len);
|
| - ZoneGrowableArray<BackRefNode>* backrefs = GetBackwardReferenceTable();
|
| - for (intptr_t i = 0; i < len; i++) {
|
| - Object::vm_isolate_snapshot_object_table().SetAt(
|
| - i, *(backrefs->At(i).reference()));
|
| - }
|
| - ResetBackwardReferenceTable();
|
| - Dart::set_instructions_snapshot_buffer(instructions_buffer_);
|
| - Dart::set_data_snapshot_buffer(data_buffer_);
|
| -}
|
| -
|
| -
|
| -RawApiError* VmIsolateSnapshotReader::ReadVmIsolateSnapshot() {
|
| - ASSERT(Snapshot::IsFull(kind()));
|
| - Thread* thread = Thread::Current();
|
| - Isolate* isolate = thread->isolate();
|
| - ASSERT(isolate != NULL);
|
| - ASSERT(isolate == Dart::vm_isolate());
|
| - ObjectStore* object_store = isolate->object_store();
|
| - ASSERT(object_store != NULL);
|
| -
|
| - // First read the version string, and check that it matches.
|
| - RawApiError* error = VerifyVersionAndFeatures();
|
| - if (error != ApiError::null()) {
|
| - return error;
|
| - }
|
| -
|
| - // The version string matches. Read the rest of the snapshot.
|
| -
|
| - {
|
| - NoSafepointScope no_safepoint;
|
| - HeapLocker hl(thread, old_space());
|
| -
|
| - // Read in the symbol table.
|
| - object_store->symbol_table_ = reinterpret_cast<RawArray*>(ReadObject());
|
| -
|
| - Symbols::InitOnceFromSnapshot(isolate);
|
| -
|
| - // Read in all the script objects and the accompanying token streams
|
| - // for bootstrap libraries so that they are in the VM isolate's read
|
| - // only memory.
|
| - *(ArrayHandle()) ^= ReadObject();
|
| -
|
| - if (Snapshot::IncludesCode(kind())) {
|
| - StubCode::ReadFrom(this);
|
| - }
|
| -
|
| - // Validate the class table.
|
| -#if defined(DEBUG)
|
| - isolate->ValidateClassTable();
|
| -#endif
|
| -
|
| - return ApiError::null();
|
| - }
|
| -}
|
| -
|
| -
|
| -IsolateSnapshotReader::IsolateSnapshotReader(Snapshot::Kind kind,
|
| - const uint8_t* buffer,
|
| - intptr_t size,
|
| - const uint8_t* instructions_buffer,
|
| - const uint8_t* data_buffer,
|
| - Thread* thread)
|
| - : SnapshotReader(buffer,
|
| - size,
|
| - instructions_buffer,
|
| - data_buffer,
|
| - kind,
|
| - new ZoneGrowableArray<BackRefNode>(
|
| - kNumInitialReferencesInFullSnapshot),
|
| - thread) {
|
| - isolate()->set_compilation_allowed(kind != Snapshot::kAppNoJIT);
|
| - ASSERT(Snapshot::IsFull(kind));
|
| -}
|
| -
|
| -
|
| -IsolateSnapshotReader::~IsolateSnapshotReader() {
|
| - ResetBackwardReferenceTable();
|
| -}
|
| -
|
| -
|
| ScriptSnapshotReader::ScriptSnapshotReader(const uint8_t* buffer,
|
| intptr_t size,
|
| Thread* thread)
|
| @@ -2039,212 +1859,6 @@ class ScriptVisitor : public ObjectVisitor {
|
| };
|
|
|
|
|
| -FullSnapshotWriter::FullSnapshotWriter(Snapshot::Kind kind,
|
| - uint8_t** vm_isolate_snapshot_buffer,
|
| - uint8_t** isolate_snapshot_buffer,
|
| - ReAlloc alloc,
|
| - InstructionsWriter* instructions_writer)
|
| - : thread_(Thread::Current()),
|
| - kind_(kind),
|
| - vm_isolate_snapshot_buffer_(vm_isolate_snapshot_buffer),
|
| - isolate_snapshot_buffer_(isolate_snapshot_buffer),
|
| - alloc_(alloc),
|
| - vm_isolate_snapshot_size_(0),
|
| - isolate_snapshot_size_(0),
|
| - forward_list_(NULL),
|
| - instructions_writer_(instructions_writer),
|
| - scripts_(Array::Handle(zone())),
|
| - saved_symbol_table_(Array::Handle(zone())),
|
| - new_vm_symbol_table_(Array::Handle(zone())) {
|
| - ASSERT(isolate_snapshot_buffer_ != NULL);
|
| - ASSERT(alloc_ != NULL);
|
| - ASSERT(isolate() != NULL);
|
| - ASSERT(ClassFinalizer::AllClassesFinalized());
|
| - ASSERT(isolate() != NULL);
|
| - ASSERT(heap() != NULL);
|
| - ObjectStore* object_store = isolate()->object_store();
|
| - ASSERT(object_store != NULL);
|
| -
|
| -#if defined(DEBUG)
|
| - // Ensure the class table is valid.
|
| - isolate()->ValidateClassTable();
|
| -#endif
|
| - // Can't have any mutation happening while we're serializing.
|
| - ASSERT(isolate()->background_compiler() == NULL);
|
| -
|
| - intptr_t first_object_id = -1;
|
| - if (vm_isolate_snapshot_buffer != NULL) {
|
| - NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
|
| - Timeline::GetIsolateStream(), "PrepareNewVMIsolate"));
|
| -
|
| - // Collect all the script objects and their accompanying token stream
|
| - // objects into an array so that we can write it out as part of the VM
|
| - // isolate snapshot. We first count the number of script objects, allocate
|
| - // an array and then fill it up with the script objects.
|
| - ScriptVisitor scripts_counter(thread());
|
| - heap()->IterateOldObjects(&scripts_counter);
|
| - Dart::vm_isolate()->heap()->IterateOldObjects(&scripts_counter);
|
| - intptr_t count = scripts_counter.count();
|
| - scripts_ = Array::New(count, Heap::kOld);
|
| - ScriptVisitor script_visitor(thread(), &scripts_);
|
| - heap()->IterateOldObjects(&script_visitor);
|
| - Dart::vm_isolate()->heap()->IterateOldObjects(&script_visitor);
|
| - ASSERT(script_visitor.count() == count);
|
| -
|
| - // Tuck away the current symbol table.
|
| - saved_symbol_table_ = object_store->symbol_table();
|
| -
|
| - // Create a unified symbol table that will be written as the vm isolate's
|
| - // symbol table.
|
| - new_vm_symbol_table_ = Symbols::UnifiedSymbolTable();
|
| -
|
| - // Create an empty symbol table that will be written as the isolate's symbol
|
| - // table.
|
| - Symbols::SetupSymbolTable(isolate());
|
| -
|
| - first_object_id = kMaxPredefinedObjectIds;
|
| - } else {
|
| - intptr_t max_vm_isolate_object_id =
|
| - Object::vm_isolate_snapshot_object_table().Length();
|
| - first_object_id = kMaxPredefinedObjectIds + max_vm_isolate_object_id;
|
| - }
|
| -
|
| - forward_list_ = new ForwardList(thread(), first_object_id);
|
| - ASSERT(forward_list_ != NULL);
|
| -}
|
| -
|
| -
|
| -FullSnapshotWriter::~FullSnapshotWriter() {
|
| - delete forward_list_;
|
| - // We may run Dart code afterwards, restore the symbol table if needed.
|
| - if (!saved_symbol_table_.IsNull()) {
|
| - isolate()->object_store()->set_symbol_table(saved_symbol_table_);
|
| - saved_symbol_table_ = Array::null();
|
| - }
|
| - new_vm_symbol_table_ = Array::null();
|
| - scripts_ = Array::null();
|
| -}
|
| -
|
| -
|
| -void FullSnapshotWriter::WriteVmIsolateSnapshot() {
|
| - NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
|
| - Timeline::GetIsolateStream(), "WriteVmIsolateSnapshot"));
|
| -
|
| - ASSERT(vm_isolate_snapshot_buffer_ != NULL);
|
| - SnapshotWriter writer(thread(),
|
| - kind_,
|
| - vm_isolate_snapshot_buffer_,
|
| - alloc_,
|
| - kInitialSize,
|
| - forward_list_,
|
| - instructions_writer_,
|
| - true, /* can_send_any_object */
|
| - true /* writing_vm_isolate */);
|
| - // Write full snapshot for the VM isolate.
|
| - // Setup for long jump in case there is an exception while writing
|
| - // the snapshot.
|
| - LongJumpScope jump;
|
| - if (setjmp(*jump.Set()) == 0) {
|
| - // Reserve space in the output buffer for a snapshot header.
|
| - writer.ReserveHeader();
|
| -
|
| - // Write out the version string.
|
| - writer.WriteVersionAndFeatures();
|
| -
|
| - /*
|
| - * Now Write out the following
|
| - * - the symbol table
|
| - * - all the scripts and token streams for these scripts
|
| - * - the stub code (precompiled snapshots only)
|
| - **/
|
| - // Write out the symbol table.
|
| - writer.WriteObject(new_vm_symbol_table_.raw());
|
| -
|
| - // Write out all the script objects and the accompanying token streams
|
| - // for the bootstrap libraries so that they are in the VM isolate
|
| - // read only memory.
|
| - writer.WriteObject(scripts_.raw());
|
| -
|
| - if (Snapshot::IncludesCode(kind_)) {
|
| - StubCode::WriteTo(&writer);
|
| - }
|
| -
|
| - writer.FillHeader(writer.kind());
|
| -
|
| - vm_isolate_snapshot_size_ = writer.BytesWritten();
|
| - } else {
|
| - writer.ThrowException(writer.exception_type(), writer.exception_msg());
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullSnapshotWriter::WriteIsolateFullSnapshot() {
|
| - NOT_IN_PRODUCT(TimelineDurationScope tds(thread(),
|
| - Timeline::GetIsolateStream(), "WriteIsolateFullSnapshot"));
|
| -
|
| - SnapshotWriter writer(thread(),
|
| - kind_,
|
| - isolate_snapshot_buffer_,
|
| - alloc_,
|
| - kInitialSize,
|
| - forward_list_,
|
| - instructions_writer_,
|
| - true, /* can_send_any_object */
|
| - false /* writing_vm_isolate */);
|
| - ObjectStore* object_store = isolate()->object_store();
|
| - ASSERT(object_store != NULL);
|
| -
|
| - // Write full snapshot for a regular isolate.
|
| - // Setup for long jump in case there is an exception while writing
|
| - // the snapshot.
|
| - LongJumpScope jump;
|
| - if (setjmp(*jump.Set()) == 0) {
|
| - // Reserve space in the output buffer for a snapshot header.
|
| - writer.ReserveHeader();
|
| -
|
| - // Write out the version string.
|
| - writer.WriteVersionAndFeatures();
|
| -
|
| - // Write out the full snapshot.
|
| -
|
| - // Write out all the objects in the object store of the isolate which
|
| - // is the root set for all dart allocated objects at this point.
|
| - SnapshotWriterVisitor visitor(&writer, false);
|
| - visitor.VisitPointers(object_store->from(),
|
| - object_store->to_snapshot(kind_));
|
| -
|
| - // Write out all forwarded objects.
|
| - writer.WriteForwardedObjects();
|
| -
|
| - writer.FillHeader(writer.kind());
|
| -
|
| - isolate_snapshot_size_ = writer.BytesWritten();
|
| - } else {
|
| - writer.ThrowException(writer.exception_type(), writer.exception_msg());
|
| - }
|
| -}
|
| -
|
| -
|
| -void FullSnapshotWriter::WriteFullSnapshot() {
|
| - if (vm_isolate_snapshot_buffer() != NULL) {
|
| - WriteVmIsolateSnapshot();
|
| - }
|
| - WriteIsolateFullSnapshot();
|
| - if (Snapshot::IncludesCode(kind_)) {
|
| - instructions_writer_->Write();
|
| -
|
| - OS::Print("VMIsolate(CodeSize): %" Pd "\n", VmIsolateSnapshotSize());
|
| - OS::Print("Isolate(CodeSize): %" Pd "\n", IsolateSnapshotSize());
|
| - OS::Print("Instructions(CodeSize): %" Pd "\n",
|
| - instructions_writer_->binary_size());
|
| - intptr_t total = VmIsolateSnapshotSize() +
|
| - IsolateSnapshotSize() +
|
| - instructions_writer_->binary_size();
|
| - OS::Print("Total(CodeSize): %" Pd "\n", total);
|
| - }
|
| -}
|
| -
|
| -
|
| ForwardList::ForwardList(Thread* thread, intptr_t first_object_id)
|
| : thread_(thread),
|
| first_object_id_(first_object_id),
|
|
|