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

Side by Side Diff: vm/dart_api_message.cc

Issue 10834069: Do not try to serialize VM objects, these are read only canonical objects and should be referred to… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 4 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « vm/dart_api_message.h ('k') | vm/raw_object.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/object_store.h" 7 #include "vm/object_store.h"
8 #include "vm/symbols.h"
8 9
9 namespace dart { 10 namespace dart {
10 11
11 // TODO(sgjesse): When the external message format is done these 12 // TODO(sgjesse): When the external message format is done these
12 // duplicate constants from snapshot.cc should be removed. 13 // duplicate constants from snapshot.cc should be removed.
13 enum { 14 enum {
14 kInstanceId = ObjectStore::kMaxId, 15 kInstanceId = ObjectStore::kMaxId,
15 kMaxPredefinedObjectIds, 16 kMaxPredefinedObjectIds,
16 }; 17 };
17 static const int kNumInitialReferences = 4; 18 static const int kNumInitialReferences = 4;
(...skipping 21 matching lines...) Expand all
39 } 40 }
40 41
41 42
42 Dart_CObject* ApiMessageReader::ReadMessage() { 43 Dart_CObject* ApiMessageReader::ReadMessage() {
43 // Read the object out of the message. 44 // Read the object out of the message.
44 return ReadObject(); 45 return ReadObject();
45 } 46 }
46 47
47 48
48 intptr_t ApiMessageReader::LookupInternalClass(intptr_t class_header) { 49 intptr_t ApiMessageReader::LookupInternalClass(intptr_t class_header) {
49 SerializedHeaderType header_type = SerializedHeaderTag::decode(class_header); 50 if (IsVMIsolateObject(class_header)) {
50 ASSERT(header_type == kObjectId); 51 return GetVMIsolateObjectId(class_header);
51 intptr_t header_value = SerializedHeaderData::decode(class_header); 52 }
52 return header_value; 53 ASSERT(SerializedHeaderTag::decode(class_header) == kObjectId);
54 return SerializedHeaderData::decode(class_header);
53 } 55 }
54 56
55 57
56 Dart_CObject* ApiMessageReader::AllocateDartCObject(Dart_CObject::Type type) { 58 Dart_CObject* ApiMessageReader::AllocateDartCObject(Dart_CObject::Type type) {
57 Dart_CObject* value = 59 Dart_CObject* value =
58 reinterpret_cast<Dart_CObject*>(alloc_(NULL, 0, sizeof(Dart_CObject))); 60 reinterpret_cast<Dart_CObject*>(alloc_(NULL, 0, sizeof(Dart_CObject)));
59 ASSERT(value != NULL); 61 ASSERT(value != NULL);
60 value->type = type; 62 value->type = type;
61 return value; 63 return value;
62 } 64 }
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 for (int i = 0; i < len; i++) { 212 for (int i = 0; i < len; i++) {
211 value->value.as_array.values[i] = ReadObjectRef(); 213 value->value.as_array.values[i] = ReadObjectRef();
212 } 214 }
213 return value; 215 return value;
214 } 216 }
215 217
216 return ReadInternalVMObject(class_id, object_id); 218 return ReadInternalVMObject(class_id, object_id);
217 } 219 }
218 220
219 221
222 Dart_CObject* ApiMessageReader::ReadVMSymbol(intptr_t object_id) {
223 if (Symbols::IsVMSymbolId(object_id)) {
224 RawOneByteString* str =
225 reinterpret_cast<RawOneByteString*>(Symbols::GetVMSymbol(object_id));
226 intptr_t len = Smi::Value(str->ptr()->length_);
227 Dart_CObject* object = AllocateDartCObjectString(len);
228 char* p = object->value.as_string;
229 memmove(p, str->ptr()->data_, len);
230 p[len] = '\0';
231 return object;
232 }
233 // No other VM isolate objects are supported.
234 return AllocateDartCObjectNull();
235 }
236
237
220 Dart_CObject* ApiMessageReader::ReadObjectRef() { 238 Dart_CObject* ApiMessageReader::ReadObjectRef() {
221 int64_t value = Read<int64_t>(); 239 int64_t value = Read<int64_t>();
222 if ((value & kSmiTagMask) == 0) { 240 if ((value & kSmiTagMask) == 0) {
223 int64_t untagged_value = value >> kSmiTagShift; 241 int64_t untagged_value = value >> kSmiTagShift;
224 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) { 242 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) {
225 return AllocateDartCObjectInt32(untagged_value); 243 return AllocateDartCObjectInt32(untagged_value);
226 } else { 244 } else {
227 return AllocateDartCObjectInt64(untagged_value); 245 return AllocateDartCObjectInt64(untagged_value);
228 } 246 }
229 } 247 }
230 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); 248 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin));
231 SerializedHeaderType header_type = SerializedHeaderTag::decode(value); 249 if (IsVMIsolateObject(value)) {
232 intptr_t header_value = SerializedHeaderData::decode(value); 250 intptr_t object_id = GetVMIsolateObjectId(value);
233 251 if (object_id == Object::kNullObject) {
234 if (header_type == kObjectId) { 252 return AllocateDartCObjectNull();
235 return ReadIndexedObject(header_value); 253 }
254 return ReadVMSymbol(object_id);
236 } 255 }
237 ASSERT(header_type == kInlined); 256 if (SerializedHeaderTag::decode(value) == kObjectId) {
257 return ReadIndexedObject(SerializedHeaderData::decode(value));
258 }
259 ASSERT(SerializedHeaderTag::decode(value) == kInlined);
238 // Read the class header information and lookup the class. 260 // Read the class header information and lookup the class.
239 intptr_t class_header = ReadIntptrValue(); 261 intptr_t class_header = ReadIntptrValue();
240 262
241 // Reading of regular dart instances is not supported. 263 // Reading of regular dart instances is not supported.
242 if (SerializedHeaderData::decode(class_header) == kInstanceId) { 264 if (SerializedHeaderData::decode(class_header) == kInstanceId) {
243 return AllocateDartCObjectUnsupported(); 265 return AllocateDartCObjectUnsupported();
244 } 266 }
245 ASSERT((class_header & kSmiTagMask) != 0); 267 ASSERT((class_header & kSmiTagMask) != 0);
246 intptr_t object_id = header_value; 268 intptr_t object_id = SerializedHeaderData::decode(value);
247 intptr_t class_id = LookupInternalClass(class_header); 269 intptr_t class_id = LookupInternalClass(class_header);
248 if (class_id == ObjectStore::kArrayClass || 270 if (class_id == ObjectStore::kArrayClass ||
249 class_id == ObjectStore::kImmutableArrayClass) { 271 class_id == ObjectStore::kImmutableArrayClass) {
250 ASSERT(GetBackRef(object_id) == NULL); 272 ASSERT(GetBackRef(object_id) == NULL);
251 intptr_t len = ReadSmiValue(); 273 intptr_t len = ReadSmiValue();
252 Dart_CObject* value = AllocateDartCObjectArray(len); 274 Dart_CObject* value = AllocateDartCObjectArray(len);
253 AddBackRef(object_id, value, kIsNotDeserialized); 275 AddBackRef(object_id, value, kIsNotDeserialized);
254 return value; 276 return value;
255 } 277 }
256 intptr_t tags = ReadIntptrValue(); 278 intptr_t tags = ReadIntptrValue();
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 return object; 381 return object;
360 } 382 }
361 default: 383 default:
362 // Everything else not supported. 384 // Everything else not supported.
363 return AllocateDartCObjectUnsupported(); 385 return AllocateDartCObjectUnsupported();
364 } 386 }
365 } 387 }
366 388
367 389
368 Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) { 390 Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) {
369 if (object_id == Object::kNullObject) {
370 return AllocateDartCObjectNull();
371 }
372 if (object_id == ObjectStore::kTrueValue) { 391 if (object_id == ObjectStore::kTrueValue) {
373 return AllocateDartCObjectBool(true); 392 return AllocateDartCObjectBool(true);
374 } 393 }
375 if (object_id == ObjectStore::kFalseValue) { 394 if (object_id == ObjectStore::kFalseValue) {
376 return AllocateDartCObjectBool(false); 395 return AllocateDartCObjectBool(false);
377 } 396 }
378 if (object_id == ObjectStore::kDynamicType || 397 if (object_id == ObjectStore::kDynamicType ||
379 object_id == ObjectStore::kDoubleInterface || 398 object_id == ObjectStore::kDoubleInterface ||
380 object_id == ObjectStore::kIntInterface || 399 object_id == ObjectStore::kIntInterface ||
381 object_id == ObjectStore::kBoolInterface || 400 object_id == ObjectStore::kBoolInterface ||
(...skipping 24 matching lines...) Expand all
406 int64_t value = Read<int64_t>(); 425 int64_t value = Read<int64_t>();
407 if ((value & kSmiTagMask) == 0) { 426 if ((value & kSmiTagMask) == 0) {
408 int64_t untagged_value = value >> kSmiTagShift; 427 int64_t untagged_value = value >> kSmiTagShift;
409 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) { 428 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) {
410 return AllocateDartCObjectInt32(untagged_value); 429 return AllocateDartCObjectInt32(untagged_value);
411 } else { 430 } else {
412 return AllocateDartCObjectInt64(untagged_value); 431 return AllocateDartCObjectInt64(untagged_value);
413 } 432 }
414 } 433 }
415 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); 434 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin));
416 SerializedHeaderType header_type = SerializedHeaderTag::decode(value); 435 if (IsVMIsolateObject(value)) {
417 intptr_t header_value = SerializedHeaderData::decode(value); 436 intptr_t object_id = GetVMIsolateObjectId(value);
418 437 if (object_id == Object::kNullObject) {
419 if (header_type == kObjectId) { 438 return AllocateDartCObjectNull();
420 return ReadIndexedObject(header_value); 439 }
440 return ReadVMSymbol(object_id);
421 } 441 }
422 ASSERT(header_type == kInlined); 442 if (SerializedHeaderTag::decode(value) == kObjectId) {
423 return ReadInlinedObject(header_value); 443 return ReadIndexedObject(SerializedHeaderData::decode(value));
444 }
445 ASSERT(SerializedHeaderTag::decode(value) == kInlined);
446 return ReadInlinedObject(SerializedHeaderData::decode(value));
424 } 447 }
425 448
426 449
427 void ApiMessageReader::AddBackRef(intptr_t id, 450 void ApiMessageReader::AddBackRef(intptr_t id,
428 Dart_CObject* obj, 451 Dart_CObject* obj,
429 DeserializeState state) { 452 DeserializeState state) {
430 intptr_t index = (id - kMaxPredefinedObjectIds); 453 intptr_t index = (id - kMaxPredefinedObjectIds);
431 ASSERT(index == backward_references_.length()); 454 ASSERT(index == backward_references_.length());
432 BackRefNode* node = AllocateBackRefNode(obj, state); 455 BackRefNode* node = AllocateBackRefNode(obj, state);
433 ASSERT(node != NULL); 456 ASSERT(node != NULL);
434 backward_references_.Add(node); 457 backward_references_.Add(node);
435 } 458 }
436 459
437 460
438 Dart_CObject* ApiMessageReader::GetBackRef(intptr_t id) { 461 Dart_CObject* ApiMessageReader::GetBackRef(intptr_t id) {
439 ASSERT(id >= kMaxPredefinedObjectIds); 462 ASSERT(id >= kMaxPredefinedObjectIds);
440 intptr_t index = (id - kMaxPredefinedObjectIds); 463 intptr_t index = (id - kMaxPredefinedObjectIds);
441 if (index < backward_references_.length()) { 464 if (index < backward_references_.length()) {
442 return backward_references_[index]->reference(); 465 return backward_references_[index]->reference();
443 } 466 }
444 return NULL; 467 return NULL;
445 } 468 }
446 469
447 470
448 void ApiMessageWriter::WriteMessage(intptr_t field_count, intptr_t *data) { 471 void ApiMessageWriter::WriteMessage(intptr_t field_count, intptr_t *data) {
449 // Write out the serialization header value for this object. 472 // Write out the serialization header value for this object.
450 WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds); 473 WriteInlinedObjectHeader(kMaxPredefinedObjectIds);
451 474
452 // Write out the class and tags information. 475 // Write out the class and tags information.
453 WriteObjectHeader(ObjectStore::kArrayClass, 0); 476 WriteIndexedObject(ObjectStore::kArrayClass);
477 WriteIntptrValue(0);
454 478
455 // Write out the length field. 479 // Write out the length field.
456 Write<RawObject*>(Smi::New(field_count)); 480 Write<RawObject*>(Smi::New(field_count));
457 481
458 // Write out the type arguments. 482 // Write out the type arguments.
459 WriteIndexedObject(Object::kNullObject); 483 WriteNullObject();
460 484
461 // Write out the individual Smis. 485 // Write out the individual Smis.
462 for (int i = 0; i < field_count; i++) { 486 for (int i = 0; i < field_count; i++) {
463 Write<RawObject*>(Integer::New(data[i])); 487 Write<RawObject*>(Integer::New(data[i]));
464 } 488 }
465 489
466 FinalizeBuffer(); 490 FinalizeBuffer();
467 } 491 }
468 492
469 493
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 forward_id_ += 1; 552 forward_id_ += 1;
529 } 553 }
530 554
531 555
532 void ApiMessageWriter::WriteSmi(int64_t value) { 556 void ApiMessageWriter::WriteSmi(int64_t value) {
533 ASSERT(Smi::IsValid64(value)); 557 ASSERT(Smi::IsValid64(value));
534 Write<RawObject*>(Smi::New(value)); 558 Write<RawObject*>(Smi::New(value));
535 } 559 }
536 560
537 561
562 void ApiMessageWriter::WriteNullObject() {
563 WriteVMIsolateObject(Object::kNullObject);
564 }
565
566
538 void ApiMessageWriter::WriteMint(Dart_CObject* object, int64_t value) { 567 void ApiMessageWriter::WriteMint(Dart_CObject* object, int64_t value) {
539 ASSERT(!Smi::IsValid64(value)); 568 ASSERT(!Smi::IsValid64(value));
540 // Write out the serialization header value for mint object. 569 // Write out the serialization header value for mint object.
541 WriteInlinedHeader(object); 570 WriteInlinedHeader(object);
542 // Write out the class and tags information. 571 // Write out the class and tags information.
543 WriteObjectHeader(ObjectStore::kMintClass, 0); 572 WriteIndexedObject(ObjectStore::kMintClass);
573 WriteIntptrValue(0);
544 // Write the 64-bit value. 574 // Write the 64-bit value.
545 Write<int64_t>(value); 575 Write<int64_t>(value);
546 } 576 }
547 577
548 578
549 void ApiMessageWriter::WriteInt32(Dart_CObject* object) { 579 void ApiMessageWriter::WriteInt32(Dart_CObject* object) {
550 int64_t value = object->value.as_int32; 580 int64_t value = object->value.as_int32;
551 if (Smi::IsValid64(value)) { 581 if (Smi::IsValid64(value)) {
552 WriteSmi(value); 582 WriteSmi(value);
553 } else { 583 } else {
554 WriteMint(object, value); 584 WriteMint(object, value);
555 } 585 }
556 } 586 }
557 587
558 588
559 void ApiMessageWriter::WriteInt64(Dart_CObject* object) { 589 void ApiMessageWriter::WriteInt64(Dart_CObject* object) {
560 int64_t value = object->value.as_int64; 590 int64_t value = object->value.as_int64;
561 if (Smi::IsValid64(value)) { 591 if (Smi::IsValid64(value)) {
562 WriteSmi(value); 592 WriteSmi(value);
563 } else { 593 } else {
564 WriteMint(object, value); 594 WriteMint(object, value);
565 } 595 }
566 } 596 }
567 597
568 598
569 void ApiMessageWriter::WriteInlinedHeader(Dart_CObject* object) { 599 void ApiMessageWriter::WriteInlinedHeader(Dart_CObject* object) {
570 // Write out the serialization header value for this object. 600 // Write out the serialization header value for this object.
571 WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds + object_id_); 601 WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id_);
572 // Mark object with its object id. 602 // Mark object with its object id.
573 MarkCObject(object, object_id_); 603 MarkCObject(object, object_id_);
574 // Advance object id. 604 // Advance object id.
575 object_id_++; 605 object_id_++;
576 } 606 }
577 607
578 608
579 void ApiMessageWriter::WriteCObject(Dart_CObject* object) { 609 void ApiMessageWriter::WriteCObject(Dart_CObject* object) {
580 if (IsCObjectMarked(object)) { 610 if (IsCObjectMarked(object)) {
581 intptr_t object_id = GetMarkedCObjectMark(object); 611 intptr_t object_id = GetMarkedCObjectMark(object);
582 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); 612 WriteIndexedObject(kMaxPredefinedObjectIds + object_id);
583 return; 613 return;
584 } 614 }
585 615
586 Dart_CObject::Type type = object->type; 616 Dart_CObject::Type type = object->type;
587 if (type == Dart_CObject::kArray) { 617 if (type == Dart_CObject::kArray) {
588 // Write out the serialization header value for this object. 618 // Write out the serialization header value for this object.
589 WriteInlinedHeader(object); 619 WriteInlinedHeader(object);
590 // Write out the class and tags information. 620 // Write out the class and tags information.
591 WriteObjectHeader(ObjectStore::kArrayClass, 0); 621 WriteIndexedObject(ObjectStore::kArrayClass);
622 WriteIntptrValue(0);
623
592 WriteSmi(object->value.as_array.length); 624 WriteSmi(object->value.as_array.length);
593 // Write out the type arguments. 625 // Write out the type arguments.
594 WriteIndexedObject(Object::kNullObject); 626 WriteNullObject();
595 // Write out array elements. 627 // Write out array elements.
596 for (int i = 0; i < object->value.as_array.length; i++) { 628 for (int i = 0; i < object->value.as_array.length; i++) {
597 WriteCObjectRef(object->value.as_array.values[i]); 629 WriteCObjectRef(object->value.as_array.values[i]);
598 } 630 }
599 return; 631 return;
600 } 632 }
601 return WriteCObjectInlined(object, type); 633 return WriteCObjectInlined(object, type);
602 } 634 }
603 635
604 636
(...skipping 21 matching lines...) Expand all
626 658
627 659
628 void ApiMessageWriter::WriteForwardedCObject(Dart_CObject* object) { 660 void ApiMessageWriter::WriteForwardedCObject(Dart_CObject* object) {
629 ASSERT(IsCObjectMarked(object)); 661 ASSERT(IsCObjectMarked(object));
630 Dart_CObject::Type type = 662 Dart_CObject::Type type =
631 static_cast<Dart_CObject::Type>(object->type & kDartCObjectTypeMask); 663 static_cast<Dart_CObject::Type>(object->type & kDartCObjectTypeMask);
632 ASSERT(type == Dart_CObject::kArray); 664 ASSERT(type == Dart_CObject::kArray);
633 665
634 // Write out the serialization header value for this object. 666 // Write out the serialization header value for this object.
635 intptr_t object_id = GetMarkedCObjectMark(object); 667 intptr_t object_id = GetMarkedCObjectMark(object);
636 WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds + object_id); 668 WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id);
637 // Write out the class and tags information. 669 // Write out the class and tags information.
638 WriteObjectHeader(ObjectStore::kArrayClass, 0); 670 WriteIndexedObject(ObjectStore::kArrayClass);
671 WriteIntptrValue(0);
672
639 WriteSmi(object->value.as_array.length); 673 WriteSmi(object->value.as_array.length);
640 // Write out the type arguments. 674 // Write out the type arguments.
641 WriteIndexedObject(Object::kNullObject); 675 WriteNullObject();
642 // Write out array elements. 676 // Write out array elements.
643 for (int i = 0; i < object->value.as_array.length; i++) { 677 for (int i = 0; i < object->value.as_array.length; i++) {
644 WriteCObjectRef(object->value.as_array.values[i]); 678 WriteCObjectRef(object->value.as_array.values[i]);
645 } 679 }
646 } 680 }
647 681
648 682
649 void ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object, 683 void ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object,
650 Dart_CObject::Type type) { 684 Dart_CObject::Type type) {
651 switch (type) { 685 switch (type) {
652 case Dart_CObject::kNull: 686 case Dart_CObject::kNull:
653 WriteIndexedObject(Object::kNullObject); 687 WriteNullObject();
654 break; 688 break;
655 case Dart_CObject::kBool: 689 case Dart_CObject::kBool:
656 if (object->value.as_bool) { 690 if (object->value.as_bool) {
657 WriteIndexedObject(ObjectStore::kTrueValue); 691 WriteIndexedObject(ObjectStore::kTrueValue);
658 } else { 692 } else {
659 WriteIndexedObject(ObjectStore::kFalseValue); 693 WriteIndexedObject(ObjectStore::kFalseValue);
660 } 694 }
661 break; 695 break;
662 case Dart_CObject::kInt32: 696 case Dart_CObject::kInt32:
663 WriteInt32(object); 697 WriteInt32(object);
664 break; 698 break;
665 case Dart_CObject::kInt64: 699 case Dart_CObject::kInt64:
666 WriteInt64(object); 700 WriteInt64(object);
667 break; 701 break;
668 case Dart_CObject::kBigint: { 702 case Dart_CObject::kBigint: {
669 // Write out the serialization header value for this object. 703 // Write out the serialization header value for this object.
670 WriteInlinedHeader(object); 704 WriteInlinedHeader(object);
671 // Write out the class and tags information. 705 // Write out the class and tags information.
672 WriteObjectHeader(ObjectStore::kBigintClass, 0); 706 WriteIndexedObject(ObjectStore::kBigintClass);
707 WriteIntptrValue(0);
673 // Write hex string length and content 708 // Write hex string length and content
674 char* hex_string = object->value.as_bigint; 709 char* hex_string = object->value.as_bigint;
675 intptr_t len = strlen(hex_string); 710 intptr_t len = strlen(hex_string);
676 WriteIntptrValue(len); 711 WriteIntptrValue(len);
677 for (intptr_t i = 0; i < len; i++) { 712 for (intptr_t i = 0; i < len; i++) {
678 Write<uint8_t>(hex_string[i]); 713 Write<uint8_t>(hex_string[i]);
679 } 714 }
680 break; 715 break;
681 } 716 }
682 case Dart_CObject::kDouble: 717 case Dart_CObject::kDouble:
683 // Write out the serialization header value for this object. 718 // Write out the serialization header value for this object.
684 WriteInlinedHeader(object); 719 WriteInlinedHeader(object);
685 // Write out the class and tags information. 720 // Write out the class and tags information.
686 WriteObjectHeader(ObjectStore::kDoubleClass, 0); 721 WriteIndexedObject(ObjectStore::kDoubleClass);
722 WriteIntptrValue(0);
687 // Write double value. 723 // Write double value.
688 Write<double>(object->value.as_double); 724 Write<double>(object->value.as_double);
689 break; 725 break;
690 case Dart_CObject::kString: { 726 case Dart_CObject::kString: {
691 // Write out the serialization header value for this object. 727 // Write out the serialization header value for this object.
692 WriteInlinedHeader(object); 728 WriteInlinedHeader(object);
693 // Write out the class and tags information. 729 // Write out the class and tags information.
694 WriteObjectHeader(ObjectStore::kOneByteStringClass, 0); 730 WriteIndexedObject(ObjectStore::kOneByteStringClass);
731 WriteIntptrValue(0);
695 // Write string length, hash and content 732 // Write string length, hash and content
696 char* str = object->value.as_string; 733 char* str = object->value.as_string;
697 intptr_t len = strlen(str); 734 intptr_t len = strlen(str);
698 WriteSmi(len); 735 WriteSmi(len);
699 WriteSmi(0); // TODO(sgjesse): Hash - not written. 736 WriteSmi(0); // TODO(sgjesse): Hash - not written.
700 for (intptr_t i = 0; i < len; i++) { 737 for (intptr_t i = 0; i < len; i++) {
701 Write<uint8_t>(str[i]); 738 Write<uint8_t>(str[i]);
702 } 739 }
703 break; 740 break;
704 } 741 }
705 case Dart_CObject::kUint8Array: { 742 case Dart_CObject::kUint8Array: {
706 // Write out the serialization header value for this object. 743 // Write out the serialization header value for this object.
707 WriteInlinedHeader(object); 744 WriteInlinedHeader(object);
708 // Write out the class and tags information. 745 // Write out the class and tags information.
709 WriteObjectHeader(ObjectStore::kUint8ArrayClass, 0); 746 WriteIndexedObject(ObjectStore::kUint8ArrayClass);
747 WriteIntptrValue(0);
710 uint8_t* bytes = object->value.as_byte_array.values; 748 uint8_t* bytes = object->value.as_byte_array.values;
711 intptr_t len = object->value.as_byte_array.length; 749 intptr_t len = object->value.as_byte_array.length;
712 WriteSmi(len); 750 WriteSmi(len);
713 for (intptr_t i = 0; i < len; i++) { 751 for (intptr_t i = 0; i < len; i++) {
714 Write<uint8_t>(bytes[i]); 752 Write<uint8_t>(bytes[i]);
715 } 753 }
716 break; 754 break;
717 } 755 }
718 case Dart_CObject::kExternalUint8Array: { 756 case Dart_CObject::kExternalUint8Array: {
719 // TODO(ager): we are writing C pointers into the message in 757 // TODO(ager): we are writing C pointers into the message in
720 // order to post external arrays through ports. We need to make 758 // order to post external arrays through ports. We need to make
721 // sure that messages containing pointers can never be posted 759 // sure that messages containing pointers can never be posted
722 // to other processes. 760 // to other processes.
723 761
724 // Write out serialization header value for this object. 762 // Write out serialization header value for this object.
725 WriteInlinedHeader(object); 763 WriteInlinedHeader(object);
726 // Write out the class and tag information. 764 // Write out the class and tag information.
727 WriteObjectHeader(ObjectStore::kExternalUint8ArrayClass, 0); 765 WriteIndexedObject(ObjectStore::kExternalUint8ArrayClass);
766 WriteIntptrValue(0);
728 int length = object->value.as_external_byte_array.length; 767 int length = object->value.as_external_byte_array.length;
729 uint8_t* data = object->value.as_external_byte_array.data; 768 uint8_t* data = object->value.as_external_byte_array.data;
730 void* peer = object->value.as_external_byte_array.peer; 769 void* peer = object->value.as_external_byte_array.peer;
731 Dart_PeerFinalizer callback = 770 Dart_PeerFinalizer callback =
732 object->value.as_external_byte_array.callback; 771 object->value.as_external_byte_array.callback;
733 WriteSmi(length); 772 WriteSmi(length);
734 WriteIntptrValue(reinterpret_cast<intptr_t>(data)); 773 WriteIntptrValue(reinterpret_cast<intptr_t>(data));
735 WriteIntptrValue(reinterpret_cast<intptr_t>(peer)); 774 WriteIntptrValue(reinterpret_cast<intptr_t>(peer));
736 WriteIntptrValue(reinterpret_cast<intptr_t>(callback)); 775 WriteIntptrValue(reinterpret_cast<intptr_t>(callback));
737 break; 776 break;
(...skipping 10 matching lines...) Expand all
748 // not been serialized yet. These would typically be fields of arrays. 787 // not been serialized yet. These would typically be fields of arrays.
749 // NOTE: The forward list might grow as we process the list. 788 // NOTE: The forward list might grow as we process the list.
750 for (intptr_t i = 0; i < forward_id_; i++) { 789 for (intptr_t i = 0; i < forward_id_; i++) {
751 WriteForwardedCObject(forward_list_[i]); 790 WriteForwardedCObject(forward_list_[i]);
752 } 791 }
753 UnmarkAllCObjects(object); 792 UnmarkAllCObjects(object);
754 FinalizeBuffer(); 793 FinalizeBuffer();
755 } 794 }
756 795
757 } // namespace dart 796 } // namespace dart
OLDNEW
« no previous file with comments | « vm/dart_api_message.h ('k') | vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698