| Index: runtime/vm/dart_api_message.cc
|
| diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
|
| index 2c0cf340bffd5e2b363240e7f37b8b823483fe3d..0d42246df329f5dfa8da63d5b0a13d915df35067 100644
|
| --- a/runtime/vm/dart_api_message.cc
|
| +++ b/runtime/vm/dart_api_message.cc
|
| @@ -19,6 +19,7 @@ ApiMessageReader::ApiMessageReader(const uint8_t* buffer,
|
| : BaseReader(buffer, length),
|
| alloc_(alloc),
|
| backward_references_(kNumInitialReferences),
|
| + vm_isolate_references_(kNumInitialReferences),
|
| vm_symbol_references_(NULL),
|
| max_vm_isolate_object_id_(
|
| use_vm_isolate_snapshot ?
|
| @@ -200,7 +201,41 @@ Dart_CObject* ApiMessageReader::AllocateDartCObjectArray(intptr_t length) {
|
|
|
|
|
| Dart_CObject* ApiMessageReader::AllocateDartCObjectVmIsolateObj(intptr_t id) {
|
| - return CreateDartCObjectString(VmIsolateSnapshotObject(id));
|
| + RawObject* raw = VmIsolateSnapshotObject(id);
|
| + intptr_t cid = raw->GetClassId();
|
| + switch (cid) {
|
| + case kOneByteStringCid: {
|
| + RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw);
|
| + const char* str = reinterpret_cast<const char*>(raw_str->ptr()->data());
|
| + ASSERT(str != NULL);
|
| + Dart_CObject* object = NULL;
|
| + for (intptr_t i = 0; i < vm_isolate_references_.length(); i++) {
|
| + object = vm_isolate_references_.At(i);
|
| + if ((object->type == Dart_CObject_kString)) {
|
| + if (strcmp(str, const_cast<char*>(object->value.as_string)) == 0) {
|
| + return object;
|
| + }
|
| + }
|
| + }
|
| + object = CreateDartCObjectString(raw);
|
| + vm_isolate_references_.Add(object);
|
| + return object;
|
| + }
|
| +
|
| + case kMintCid: {
|
| + const Mint& obj = Mint::Handle(reinterpret_cast<RawMint*>(raw));
|
| + int64_t value64 = obj.value();
|
| + if ((kMinInt32 <= value64) && (value64 <= kMaxInt32)) {
|
| + return GetCanonicalMintObject(Dart_CObject_kInt32, value64);
|
| + } else {
|
| + return GetCanonicalMintObject(Dart_CObject_kInt64, value64);
|
| + }
|
| + }
|
| +
|
| + default:
|
| + UNREACHABLE();
|
| + return NULL;
|
| + }
|
| }
|
|
|
|
|
| @@ -403,6 +438,27 @@ Dart_CObject* ApiMessageReader::CreateDartCObjectString(RawObject* raw) {
|
| }
|
|
|
|
|
| +Dart_CObject* ApiMessageReader::GetCanonicalMintObject(Dart_CObject_Type type,
|
| + int64_t value64) {
|
| + Dart_CObject* object = NULL;
|
| + for (intptr_t i = 0; i < vm_isolate_references_.length(); i++) {
|
| + object = vm_isolate_references_.At(i);
|
| + if (object->type == type) {
|
| + if (value64 == object->value.as_int64) {
|
| + return object;
|
| + }
|
| + }
|
| + }
|
| + if (type == Dart_CObject_kInt32) {
|
| + object = AllocateDartCObjectInt32(static_cast<int32_t>(value64));
|
| + } else {
|
| + object = AllocateDartCObjectInt64(value64);
|
| + }
|
| + vm_isolate_references_.Add(object);
|
| + return object;
|
| +}
|
| +
|
| +
|
| Dart_CObject* ApiMessageReader::ReadObjectRef() {
|
| int64_t value64 = Read<int64_t>();
|
| if ((value64 & kSmiTagMask) == 0) {
|
|
|