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 |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 value->value.as_array.values[i] = ReadObjectRef(); | 208 value->value.as_array.values[i] = ReadObjectRef(); |
209 } | 209 } |
210 return value; | 210 return value; |
211 } | 211 } |
212 | 212 |
213 return ReadInternalVMObject(class_id, object_id); | 213 return ReadInternalVMObject(class_id, object_id); |
214 } | 214 } |
215 | 215 |
216 | 216 |
217 Dart_CObject* ApiMessageReader::ReadVMSymbol(intptr_t object_id) { | 217 Dart_CObject* ApiMessageReader::ReadVMSymbol(intptr_t object_id) { |
218 if (Symbols::IsVMSymbolId(object_id)) { | 218 ASSERT(Symbols::IsVMSymbolId(object_id)); |
219 intptr_t symbol_id = object_id - kMaxPredefinedObjectIds; | 219 intptr_t symbol_id = object_id - kMaxPredefinedObjectIds; |
220 Dart_CObject* object; | 220 Dart_CObject* object; |
221 if (vm_symbol_references_ != NULL && | 221 if (vm_symbol_references_ != NULL && |
222 (object = vm_symbol_references_[symbol_id]) != NULL) { | 222 (object = vm_symbol_references_[symbol_id]) != NULL) { |
223 return object; | |
224 } | |
225 | |
226 if (vm_symbol_references_ == NULL) { | |
227 intptr_t size = | |
228 (sizeof(*vm_symbol_references_) * Symbols::kMaxPredefinedId); | |
229 vm_symbol_references_ = | |
230 reinterpret_cast<Dart_CObject**>(alloc_(NULL, 0, size)); | |
231 memset(vm_symbol_references_, 0, size); | |
232 } | |
233 | |
234 RawOneByteString* str = | |
235 reinterpret_cast<RawOneByteString*>(Symbols::GetVMSymbol(object_id)); | |
236 intptr_t len = Smi::Value(str->ptr()->length_); | |
237 object = AllocateDartCObjectString(len); | |
238 char* p = object->value.as_string; | |
239 memmove(p, str->ptr()->data_, len); | |
240 p[len] = '\0'; | |
241 ASSERT(vm_symbol_references_[symbol_id] == NULL); | |
242 vm_symbol_references_[symbol_id] = object; | |
243 return object; | 223 return object; |
244 } | 224 } |
245 // No other VM isolate objects are supported. | 225 |
246 return AllocateDartCObjectNull(); | 226 if (vm_symbol_references_ == NULL) { |
| 227 intptr_t size = |
| 228 (sizeof(*vm_symbol_references_) * Symbols::kMaxPredefinedId); |
| 229 vm_symbol_references_ = |
| 230 reinterpret_cast<Dart_CObject**>(alloc_(NULL, 0, size)); |
| 231 memset(vm_symbol_references_, 0, size); |
| 232 } |
| 233 |
| 234 RawOneByteString* str = |
| 235 reinterpret_cast<RawOneByteString*>(Symbols::GetVMSymbol(object_id)); |
| 236 intptr_t len = Smi::Value(str->ptr()->length_); |
| 237 object = AllocateDartCObjectString(len); |
| 238 char* p = object->value.as_string; |
| 239 memmove(p, str->ptr()->data_, len); |
| 240 p[len] = '\0'; |
| 241 ASSERT(vm_symbol_references_[symbol_id] == NULL); |
| 242 vm_symbol_references_[symbol_id] = object; |
| 243 return object; |
247 } | 244 } |
248 | 245 |
249 | 246 |
250 Dart_CObject* ApiMessageReader::ReadObjectRef() { | 247 Dart_CObject* ApiMessageReader::ReadObjectRef() { |
251 int64_t value = Read<int64_t>(); | 248 int64_t value = Read<int64_t>(); |
252 if ((value & kSmiTagMask) == 0) { | 249 if ((value & kSmiTagMask) == 0) { |
253 int64_t untagged_value = value >> kSmiTagShift; | 250 int64_t untagged_value = value >> kSmiTagShift; |
254 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) { | 251 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) { |
255 return AllocateDartCObjectInt32(untagged_value); | 252 return AllocateDartCObjectInt32(untagged_value); |
256 } else { | 253 } else { |
257 return AllocateDartCObjectInt64(untagged_value); | 254 return AllocateDartCObjectInt64(untagged_value); |
258 } | 255 } |
259 } | 256 } |
260 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); | 257 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); |
261 if (IsVMIsolateObject(value)) { | 258 if (IsVMIsolateObject(value)) { |
262 intptr_t object_id = GetVMIsolateObjectId(value); | 259 return ReadVMIsolateObject(value); |
263 if (object_id == kNullObject) { | |
264 return AllocateDartCObjectNull(); | |
265 } | |
266 return ReadVMSymbol(object_id); | |
267 } | 260 } |
268 if (SerializedHeaderTag::decode(value) == kObjectId) { | 261 if (SerializedHeaderTag::decode(value) == kObjectId) { |
269 return ReadIndexedObject(SerializedHeaderData::decode(value)); | 262 return ReadIndexedObject(SerializedHeaderData::decode(value)); |
270 } | 263 } |
271 ASSERT(SerializedHeaderTag::decode(value) == kInlined); | 264 ASSERT(SerializedHeaderTag::decode(value) == kInlined); |
272 // Read the class header information and lookup the class. | 265 // Read the class header information and lookup the class. |
273 intptr_t class_header = ReadIntptrValue(); | 266 intptr_t class_header = ReadIntptrValue(); |
274 | 267 |
275 // Reading of regular dart instances is not supported. | 268 // Reading of regular dart instances is not supported. |
276 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { | 269 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { |
(...skipping 10 matching lines...) Expand all Loading... |
287 return value; | 280 return value; |
288 } | 281 } |
289 | 282 |
290 intptr_t tags = ReadIntptrValue(); | 283 intptr_t tags = ReadIntptrValue(); |
291 USE(tags); | 284 USE(tags); |
292 | 285 |
293 return ReadInternalVMObject(class_id, object_id); | 286 return ReadInternalVMObject(class_id, object_id); |
294 } | 287 } |
295 | 288 |
296 | 289 |
| 290 Dart_CObject* ApiMessageReader::ReadVMIsolateObject(intptr_t value) { |
| 291 intptr_t object_id = GetVMIsolateObjectId(value); |
| 292 if (object_id == kNullObject) { |
| 293 return AllocateDartCObjectNull(); |
| 294 } |
| 295 if (object_id == kTrueValue) { |
| 296 return AllocateDartCObjectBool(true); |
| 297 } |
| 298 if (object_id == kFalseValue) { |
| 299 return AllocateDartCObjectBool(false); |
| 300 } |
| 301 if (Symbols::IsVMSymbolId(object_id)) { |
| 302 return ReadVMSymbol(object_id); |
| 303 } |
| 304 // No other VM isolate objects are supported. |
| 305 return AllocateDartCObjectNull(); |
| 306 } |
| 307 |
| 308 |
297 Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id, | 309 Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id, |
298 intptr_t object_id) { | 310 intptr_t object_id) { |
299 switch (class_id) { | 311 switch (class_id) { |
300 case kClassCid: { | 312 case kClassCid: { |
301 return AllocateDartCObjectUnsupported(); | 313 return AllocateDartCObjectUnsupported(); |
302 } | 314 } |
303 case kTypeArgumentsCid: { | 315 case kTypeArgumentsCid: { |
304 // TODO(sjesse): Remove this when message serialization format is | 316 // TODO(sjesse): Remove this when message serialization format is |
305 // updated (currently length is leaked). | 317 // updated (currently length is leaked). |
306 Dart_CObject* value = &type_arguments_marker; | 318 Dart_CObject* value = &type_arguments_marker; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 return value; | 465 return value; |
454 } | 466 } |
455 default: | 467 default: |
456 // Everything else not supported. | 468 // Everything else not supported. |
457 return AllocateDartCObjectUnsupported(); | 469 return AllocateDartCObjectUnsupported(); |
458 } | 470 } |
459 } | 471 } |
460 | 472 |
461 | 473 |
462 Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) { | 474 Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) { |
463 if (object_id == kTrueValue) { | |
464 return AllocateDartCObjectBool(true); | |
465 } | |
466 if (object_id == kFalseValue) { | |
467 return AllocateDartCObjectBool(false); | |
468 } | |
469 if (object_id == kDynamicType || | 475 if (object_id == kDynamicType || |
470 object_id == kDoubleType || | 476 object_id == kDoubleType || |
471 object_id == kIntType || | 477 object_id == kIntType || |
472 object_id == kBoolType || | 478 object_id == kBoolType || |
473 object_id == kStringType) { | 479 object_id == kStringType) { |
474 // Always return dynamic type (this is only a marker). | 480 // Always return dynamic type (this is only a marker). |
475 return &dynamic_type_marker; | 481 return &dynamic_type_marker; |
476 } | 482 } |
477 intptr_t index = object_id - kMaxPredefinedObjectIds; | 483 intptr_t index = object_id - kMaxPredefinedObjectIds; |
478 ASSERT((0 <= index) && (index < backward_references_.length())); | 484 ASSERT((0 <= index) && (index < backward_references_.length())); |
(...skipping 19 matching lines...) Expand all Loading... |
498 if ((value & kSmiTagMask) == 0) { | 504 if ((value & kSmiTagMask) == 0) { |
499 int64_t untagged_value = value >> kSmiTagShift; | 505 int64_t untagged_value = value >> kSmiTagShift; |
500 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) { | 506 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) { |
501 return AllocateDartCObjectInt32(untagged_value); | 507 return AllocateDartCObjectInt32(untagged_value); |
502 } else { | 508 } else { |
503 return AllocateDartCObjectInt64(untagged_value); | 509 return AllocateDartCObjectInt64(untagged_value); |
504 } | 510 } |
505 } | 511 } |
506 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); | 512 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); |
507 if (IsVMIsolateObject(value)) { | 513 if (IsVMIsolateObject(value)) { |
508 intptr_t object_id = GetVMIsolateObjectId(value); | 514 return ReadVMIsolateObject(value); |
509 if (object_id == kNullObject) { | |
510 return AllocateDartCObjectNull(); | |
511 } | |
512 return ReadVMSymbol(object_id); | |
513 } | 515 } |
514 if (SerializedHeaderTag::decode(value) == kObjectId) { | 516 if (SerializedHeaderTag::decode(value) == kObjectId) { |
515 return ReadIndexedObject(SerializedHeaderData::decode(value)); | 517 return ReadIndexedObject(SerializedHeaderData::decode(value)); |
516 } | 518 } |
517 ASSERT(SerializedHeaderTag::decode(value) == kInlined); | 519 ASSERT(SerializedHeaderTag::decode(value) == kInlined); |
518 return ReadInlinedObject(SerializedHeaderData::decode(value)); | 520 return ReadInlinedObject(SerializedHeaderData::decode(value)); |
519 } | 521 } |
520 | 522 |
521 | 523 |
522 void ApiMessageReader::AddBackRef(intptr_t id, | 524 void ApiMessageReader::AddBackRef(intptr_t id, |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 | 756 |
755 | 757 |
756 bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object, | 758 bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object, |
757 Dart_CObject::Type type) { | 759 Dart_CObject::Type type) { |
758 switch (type) { | 760 switch (type) { |
759 case Dart_CObject::kNull: | 761 case Dart_CObject::kNull: |
760 WriteNullObject(); | 762 WriteNullObject(); |
761 break; | 763 break; |
762 case Dart_CObject::kBool: | 764 case Dart_CObject::kBool: |
763 if (object->value.as_bool) { | 765 if (object->value.as_bool) { |
764 WriteIndexedObject(kTrueValue); | 766 WriteVMIsolateObject(kTrueValue); |
765 } else { | 767 } else { |
766 WriteIndexedObject(kFalseValue); | 768 WriteVMIsolateObject(kFalseValue); |
767 } | 769 } |
768 break; | 770 break; |
769 case Dart_CObject::kInt32: | 771 case Dart_CObject::kInt32: |
770 WriteInt32(object); | 772 WriteInt32(object); |
771 break; | 773 break; |
772 case Dart_CObject::kInt64: | 774 case Dart_CObject::kInt64: |
773 WriteInt64(object); | 775 WriteInt64(object); |
774 break; | 776 break; |
775 case Dart_CObject::kBigint: { | 777 case Dart_CObject::kBigint: { |
776 // Write out the serialization header value for this object. | 778 // Write out the serialization header value for this object. |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 if (!success) { | 900 if (!success) { |
899 UnmarkAllCObjects(object); | 901 UnmarkAllCObjects(object); |
900 return false; | 902 return false; |
901 } | 903 } |
902 } | 904 } |
903 UnmarkAllCObjects(object); | 905 UnmarkAllCObjects(object); |
904 return true; | 906 return true; |
905 } | 907 } |
906 | 908 |
907 } // namespace dart | 909 } // namespace dart |
OLD | NEW |