Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(404)

Unified Diff: runtime/vm/dart_api_message.cc

Issue 1151113002: Move bootstrap scripts and token streams to the VM isolate so that they become read only objects. T… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Address code review comments Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/dart_api_message.h ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « runtime/vm/dart_api_message.h ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698