| Index: runtime/vm/dart_api_message.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_message.cc (revision 45789)
|
| +++ runtime/vm/dart_api_message.cc (working copy)
|
| @@ -14,11 +14,15 @@
|
|
|
| ApiMessageReader::ApiMessageReader(const uint8_t* buffer,
|
| intptr_t length,
|
| - ReAlloc alloc)
|
| + ReAlloc alloc,
|
| + bool use_vm_isolate_snapshot)
|
| : BaseReader(buffer, length),
|
| alloc_(alloc),
|
| backward_references_(kNumInitialReferences),
|
| - vm_symbol_references_(NULL) {
|
| + vm_symbol_references_(NULL),
|
| + max_vm_isolate_object_id_(
|
| + use_vm_isolate_snapshot ?
|
| + Object::vm_isolate_snapshot_object_table().Length() : 0) {
|
| Init();
|
| }
|
|
|
| @@ -195,6 +199,11 @@
|
| }
|
|
|
|
|
| +Dart_CObject* ApiMessageReader::AllocateDartCObjectVmIsolateObj(intptr_t id) {
|
| + return CreateDartCObjectString(VmIsolateSnapshotObject(id));
|
| +}
|
| +
|
| +
|
| Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectInternal(
|
| Dart_CObject_Internal::Type type) {
|
| Dart_CObject_Internal* value =
|
| @@ -369,13 +378,7 @@
|
| memset(vm_symbol_references_, 0, size);
|
| }
|
|
|
| - RawOneByteString* str =
|
| - reinterpret_cast<RawOneByteString*>(Symbols::GetVMSymbol(object_id));
|
| - intptr_t len = Smi::Value(str->ptr()->length_);
|
| - object = AllocateDartCObjectString(len);
|
| - char* p = object->value.as_string;
|
| - memmove(p, str->ptr()->data(), len);
|
| - p[len] = '\0';
|
| + object = CreateDartCObjectString(Symbols::GetVMSymbol(object_id));
|
| ASSERT(vm_symbol_references_[symbol_id] == NULL);
|
| vm_symbol_references_[symbol_id] = object;
|
| return object;
|
| @@ -383,10 +386,23 @@
|
|
|
|
|
| intptr_t ApiMessageReader::NextAvailableObjectId() const {
|
| - return backward_references_.length() + kMaxPredefinedObjectIds;
|
| + return backward_references_.length() +
|
| + kMaxPredefinedObjectIds + max_vm_isolate_object_id_;
|
| }
|
|
|
|
|
| +Dart_CObject* ApiMessageReader::CreateDartCObjectString(RawObject* raw) {
|
| + ASSERT(RawObject::IsOneByteStringClassId(raw->GetClassId()));
|
| + RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw);
|
| + intptr_t len = Smi::Value(raw_str->ptr()->length_);
|
| + Dart_CObject* object = AllocateDartCObjectString(len);
|
| + char* p = object->value.as_string;
|
| + memmove(p, raw_str->ptr()->data(), len);
|
| + p[len] = '\0';
|
| + return object;
|
| +}
|
| +
|
| +
|
| Dart_CObject* ApiMessageReader::ReadObjectRef() {
|
| int64_t value64 = Read<int64_t>();
|
| if ((value64 & kSmiTagMask) == 0) {
|
| @@ -735,6 +751,10 @@
|
| return &dynamic_type_marker;
|
| }
|
| intptr_t index = object_id - kMaxPredefinedObjectIds;
|
| + if (index < max_vm_isolate_object_id_) {
|
| + return AllocateDartCObjectVmIsolateObj(index);
|
| + }
|
| + index -= max_vm_isolate_object_id_;
|
| ASSERT((0 <= index) && (index < backward_references_.length()));
|
| ASSERT(backward_references_[index]->reference() != NULL);
|
| return backward_references_[index]->reference();
|
| @@ -785,6 +805,8 @@
|
| Dart_CObject* obj,
|
| DeserializeState state) {
|
| intptr_t index = (id - kMaxPredefinedObjectIds);
|
| + ASSERT(index >= max_vm_isolate_object_id_);
|
| + index -= max_vm_isolate_object_id_;
|
| ASSERT(index == backward_references_.length());
|
| BackRefNode* node = AllocateBackRefNode(obj, state);
|
| ASSERT(node != NULL);
|
| @@ -795,6 +817,8 @@
|
| Dart_CObject* ApiMessageReader::GetBackRef(intptr_t id) {
|
| ASSERT(id >= kMaxPredefinedObjectIds);
|
| intptr_t index = (id - kMaxPredefinedObjectIds);
|
| + ASSERT(index >= max_vm_isolate_object_id_);
|
| + index -= max_vm_isolate_object_id_;
|
| if (index < backward_references_.length()) {
|
| return backward_references_[index]->reference();
|
| }
|
| @@ -932,7 +956,7 @@
|
|
|
| void ApiMessageWriter::WriteInlinedHeader(Dart_CObject* object) {
|
| // Write out the serialization header value for this object.
|
| - WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id_);
|
| + WriteInlinedObjectHeader(SnapshotWriter::FirstObjectId() + object_id_);
|
| // Mark object with its object id.
|
| MarkCObject(object, object_id_);
|
| // Advance object id.
|
| @@ -943,7 +967,7 @@
|
| bool ApiMessageWriter::WriteCObject(Dart_CObject* object) {
|
| if (IsCObjectMarked(object)) {
|
| intptr_t object_id = GetMarkedCObjectMark(object);
|
| - WriteIndexedObject(kMaxPredefinedObjectIds + object_id);
|
| + WriteIndexedObject(SnapshotWriter::FirstObjectId() + object_id);
|
| return true;
|
| }
|
|
|
| @@ -978,7 +1002,7 @@
|
| bool ApiMessageWriter::WriteCObjectRef(Dart_CObject* object) {
|
| if (IsCObjectMarked(object)) {
|
| intptr_t object_id = GetMarkedCObjectMark(object);
|
| - WriteIndexedObject(kMaxPredefinedObjectIds + object_id);
|
| + WriteIndexedObject(SnapshotWriter::FirstObjectId() + object_id);
|
| return true;
|
| }
|
|
|
| @@ -1016,7 +1040,7 @@
|
|
|
| // Write out the serialization header value for this object.
|
| intptr_t object_id = GetMarkedCObjectMark(object);
|
| - WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id);
|
| + WriteInlinedObjectHeader(SnapshotWriter::FirstObjectId() + object_id);
|
| // Write out the class and tags information.
|
| WriteIndexedObject(kArrayCid);
|
| WriteTags(0);
|
|
|