OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/dart_api_message.h" | 5 #include "vm/dart_api_message.h" |
6 #include "vm/object.h" | 6 #include "vm/object.h" |
7 #include "vm/snapshot_ids.h" | 7 #include "vm/snapshot_ids.h" |
8 #include "vm/symbols.h" | 8 #include "vm/symbols.h" |
9 #include "vm/unicode.h" | 9 #include "vm/unicode.h" |
10 | 10 |
11 namespace dart { | 11 namespace dart { |
12 | 12 |
13 static const int kNumInitialReferences = 4; | 13 static const int kNumInitialReferences = 4; |
14 | 14 |
15 ApiMessageReader::ApiMessageReader(const uint8_t* buffer, | 15 ApiMessageReader::ApiMessageReader(const uint8_t* buffer, |
16 intptr_t length, | 16 intptr_t length, |
17 ReAlloc alloc, | 17 ReAlloc alloc, |
18 bool use_vm_isolate_snapshot) | 18 bool use_vm_isolate_snapshot) |
19 : BaseReader(buffer, length), | 19 : BaseReader(buffer, length), |
20 alloc_(alloc), | 20 alloc_(alloc), |
21 backward_references_(kNumInitialReferences), | 21 backward_references_(kNumInitialReferences), |
| 22 vm_isolate_references_(kNumInitialReferences), |
22 vm_symbol_references_(NULL), | 23 vm_symbol_references_(NULL), |
23 max_vm_isolate_object_id_( | 24 max_vm_isolate_object_id_( |
24 use_vm_isolate_snapshot ? | 25 use_vm_isolate_snapshot ? |
25 Object::vm_isolate_snapshot_object_table().Length() : 0) { | 26 Object::vm_isolate_snapshot_object_table().Length() : 0) { |
26 Init(); | 27 Init(); |
27 } | 28 } |
28 | 29 |
29 | 30 |
30 void ApiMessageReader::Init() { | 31 void ApiMessageReader::Init() { |
31 // Initialize marker objects used to handle Lists. | 32 // Initialize marker objects used to handle Lists. |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 if (length > 0) { | 194 if (length > 0) { |
194 value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1); | 195 value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1); |
195 } else { | 196 } else { |
196 value->value.as_array.values = NULL; | 197 value->value.as_array.values = NULL; |
197 } | 198 } |
198 return value; | 199 return value; |
199 } | 200 } |
200 | 201 |
201 | 202 |
202 Dart_CObject* ApiMessageReader::AllocateDartCObjectVmIsolateObj(intptr_t id) { | 203 Dart_CObject* ApiMessageReader::AllocateDartCObjectVmIsolateObj(intptr_t id) { |
203 return CreateDartCObjectString(VmIsolateSnapshotObject(id)); | 204 RawObject* raw = VmIsolateSnapshotObject(id); |
| 205 intptr_t cid = raw->GetClassId(); |
| 206 switch (cid) { |
| 207 case kOneByteStringCid: { |
| 208 RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw); |
| 209 const char* str = reinterpret_cast<const char*>(raw_str->ptr()->data()); |
| 210 ASSERT(str != NULL); |
| 211 Dart_CObject* object = NULL; |
| 212 for (intptr_t i = 0; i < vm_isolate_references_.length(); i++) { |
| 213 object = vm_isolate_references_.At(i); |
| 214 if ((object->type == Dart_CObject_kString)) { |
| 215 if (strcmp(str, const_cast<char*>(object->value.as_string)) == 0) { |
| 216 return object; |
| 217 } |
| 218 } |
| 219 } |
| 220 object = CreateDartCObjectString(raw); |
| 221 vm_isolate_references_.Add(object); |
| 222 return object; |
| 223 } |
| 224 |
| 225 case kMintCid: { |
| 226 const Mint& obj = Mint::Handle(reinterpret_cast<RawMint*>(raw)); |
| 227 int64_t value64 = obj.value(); |
| 228 if ((kMinInt32 <= value64) && (value64 <= kMaxInt32)) { |
| 229 return GetCanonicalMintObject(Dart_CObject_kInt32, value64); |
| 230 } else { |
| 231 return GetCanonicalMintObject(Dart_CObject_kInt64, value64); |
| 232 } |
| 233 } |
| 234 |
| 235 default: |
| 236 UNREACHABLE(); |
| 237 return NULL; |
| 238 } |
204 } | 239 } |
205 | 240 |
206 | 241 |
207 Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectInternal( | 242 Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectInternal( |
208 Dart_CObject_Internal::Type type) { | 243 Dart_CObject_Internal::Type type) { |
209 Dart_CObject_Internal* value = | 244 Dart_CObject_Internal* value = |
210 reinterpret_cast<Dart_CObject_Internal*>( | 245 reinterpret_cast<Dart_CObject_Internal*>( |
211 alloc_(NULL, 0, sizeof(Dart_CObject_Internal))); | 246 alloc_(NULL, 0, sizeof(Dart_CObject_Internal))); |
212 ASSERT(value != NULL); | 247 ASSERT(value != NULL); |
213 value->type = static_cast<Dart_CObject_Type>(type); | 248 value->type = static_cast<Dart_CObject_Type>(type); |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw); | 431 RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw); |
397 intptr_t len = Smi::Value(raw_str->ptr()->length_); | 432 intptr_t len = Smi::Value(raw_str->ptr()->length_); |
398 Dart_CObject* object = AllocateDartCObjectString(len); | 433 Dart_CObject* object = AllocateDartCObjectString(len); |
399 char* p = object->value.as_string; | 434 char* p = object->value.as_string; |
400 memmove(p, raw_str->ptr()->data(), len); | 435 memmove(p, raw_str->ptr()->data(), len); |
401 p[len] = '\0'; | 436 p[len] = '\0'; |
402 return object; | 437 return object; |
403 } | 438 } |
404 | 439 |
405 | 440 |
| 441 Dart_CObject* ApiMessageReader::GetCanonicalMintObject(Dart_CObject_Type type, |
| 442 int64_t value64) { |
| 443 Dart_CObject* object = NULL; |
| 444 for (intptr_t i = 0; i < vm_isolate_references_.length(); i++) { |
| 445 object = vm_isolate_references_.At(i); |
| 446 if (object->type == type) { |
| 447 if (value64 == object->value.as_int64) { |
| 448 return object; |
| 449 } |
| 450 } |
| 451 } |
| 452 if (type == Dart_CObject_kInt32) { |
| 453 object = AllocateDartCObjectInt32(static_cast<int32_t>(value64)); |
| 454 } else { |
| 455 object = AllocateDartCObjectInt64(value64); |
| 456 } |
| 457 vm_isolate_references_.Add(object); |
| 458 return object; |
| 459 } |
| 460 |
| 461 |
406 Dart_CObject* ApiMessageReader::ReadObjectRef() { | 462 Dart_CObject* ApiMessageReader::ReadObjectRef() { |
407 int64_t value64 = Read<int64_t>(); | 463 int64_t value64 = Read<int64_t>(); |
408 if ((value64 & kSmiTagMask) == 0) { | 464 if ((value64 & kSmiTagMask) == 0) { |
409 int64_t untagged_value = value64 >> kSmiTagShift; | 465 int64_t untagged_value = value64 >> kSmiTagShift; |
410 if ((kMinInt32 <= untagged_value) && (untagged_value <= kMaxInt32)) { | 466 if ((kMinInt32 <= untagged_value) && (untagged_value <= kMaxInt32)) { |
411 return AllocateDartCObjectInt32(static_cast<int32_t>(untagged_value)); | 467 return AllocateDartCObjectInt32(static_cast<int32_t>(untagged_value)); |
412 } else { | 468 } else { |
413 return AllocateDartCObjectInt64(untagged_value); | 469 return AllocateDartCObjectInt64(untagged_value); |
414 } | 470 } |
415 } | 471 } |
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 if (!success) { | 1303 if (!success) { |
1248 UnmarkAllCObjects(object); | 1304 UnmarkAllCObjects(object); |
1249 return false; | 1305 return false; |
1250 } | 1306 } |
1251 } | 1307 } |
1252 UnmarkAllCObjects(object); | 1308 UnmarkAllCObjects(object); |
1253 return true; | 1309 return true; |
1254 } | 1310 } |
1255 | 1311 |
1256 } // namespace dart | 1312 } // namespace dart |
OLD | NEW |