Index: vm/dart_api_message.cc |
=================================================================== |
--- vm/dart_api_message.cc (revision 10306) |
+++ vm/dart_api_message.cc (working copy) |
@@ -5,6 +5,7 @@ |
#include "vm/dart_api_message.h" |
#include "vm/object.h" |
#include "vm/object_store.h" |
+#include "vm/symbols.h" |
namespace dart { |
@@ -46,10 +47,11 @@ |
intptr_t ApiMessageReader::LookupInternalClass(intptr_t class_header) { |
- SerializedHeaderType header_type = SerializedHeaderTag::decode(class_header); |
- ASSERT(header_type == kObjectId); |
- intptr_t header_value = SerializedHeaderData::decode(class_header); |
- return header_value; |
+ if (IsVMIsolateObject(class_header)) { |
+ return GetVMIsolateObjectId(class_header); |
+ } |
+ ASSERT(SerializedHeaderTag::decode(class_header) == kObjectId); |
+ return SerializedHeaderData::decode(class_header); |
} |
@@ -217,6 +219,22 @@ |
} |
+Dart_CObject* ApiMessageReader::ReadVMSymbol(intptr_t object_id) { |
+ if (Symbols::IsVMSymbolId(object_id)) { |
+ RawOneByteString* str = |
+ reinterpret_cast<RawOneByteString*>(Symbols::GetVMSymbol(object_id)); |
+ intptr_t len = Smi::Value(str->ptr()->length_); |
+ Dart_CObject* object = AllocateDartCObjectString(len); |
+ char* p = object->value.as_string; |
+ memmove(p, str->ptr()->data_, len); |
+ p[len] = '\0'; |
+ return object; |
+ } |
+ // No other VM isolate objects are supported. |
+ return AllocateDartCObjectNull(); |
+} |
+ |
+ |
Dart_CObject* ApiMessageReader::ReadObjectRef() { |
int64_t value = Read<int64_t>(); |
if ((value & kSmiTagMask) == 0) { |
@@ -228,13 +246,17 @@ |
} |
} |
ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); |
- SerializedHeaderType header_type = SerializedHeaderTag::decode(value); |
- intptr_t header_value = SerializedHeaderData::decode(value); |
- |
- if (header_type == kObjectId) { |
- return ReadIndexedObject(header_value); |
+ if (IsVMIsolateObject(value)) { |
+ intptr_t object_id = GetVMIsolateObjectId(value); |
+ if (object_id == Object::kNullObject) { |
+ return AllocateDartCObjectNull(); |
+ } |
+ return ReadVMSymbol(object_id); |
} |
- ASSERT(header_type == kInlined); |
+ if (SerializedHeaderTag::decode(value) == kObjectId) { |
+ return ReadIndexedObject(SerializedHeaderData::decode(value)); |
+ } |
+ ASSERT(SerializedHeaderTag::decode(value) == kInlined); |
// Read the class header information and lookup the class. |
intptr_t class_header = ReadIntptrValue(); |
@@ -243,7 +265,7 @@ |
return AllocateDartCObjectUnsupported(); |
} |
ASSERT((class_header & kSmiTagMask) != 0); |
- intptr_t object_id = header_value; |
+ intptr_t object_id = SerializedHeaderData::decode(value); |
intptr_t class_id = LookupInternalClass(class_header); |
if (class_id == ObjectStore::kArrayClass || |
class_id == ObjectStore::kImmutableArrayClass) { |
@@ -366,9 +388,6 @@ |
Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) { |
- if (object_id == Object::kNullObject) { |
- return AllocateDartCObjectNull(); |
- } |
if (object_id == ObjectStore::kTrueValue) { |
return AllocateDartCObjectBool(true); |
} |
@@ -413,14 +432,18 @@ |
} |
} |
ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); |
- SerializedHeaderType header_type = SerializedHeaderTag::decode(value); |
- intptr_t header_value = SerializedHeaderData::decode(value); |
- |
- if (header_type == kObjectId) { |
- return ReadIndexedObject(header_value); |
+ if (IsVMIsolateObject(value)) { |
+ intptr_t object_id = GetVMIsolateObjectId(value); |
+ if (object_id == Object::kNullObject) { |
+ return AllocateDartCObjectNull(); |
+ } |
+ return ReadVMSymbol(object_id); |
} |
- ASSERT(header_type == kInlined); |
- return ReadInlinedObject(header_value); |
+ if (SerializedHeaderTag::decode(value) == kObjectId) { |
+ return ReadIndexedObject(SerializedHeaderData::decode(value)); |
+ } |
+ ASSERT(SerializedHeaderTag::decode(value) == kInlined); |
+ return ReadInlinedObject(SerializedHeaderData::decode(value)); |
} |
@@ -447,16 +470,17 @@ |
void ApiMessageWriter::WriteMessage(intptr_t field_count, intptr_t *data) { |
// Write out the serialization header value for this object. |
- WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds); |
+ WriteInlinedObjectHeader(kMaxPredefinedObjectIds); |
// Write out the class and tags information. |
- WriteObjectHeader(ObjectStore::kArrayClass, 0); |
+ WriteIndexedObject(ObjectStore::kArrayClass); |
+ WriteIntptrValue(0); |
// Write out the length field. |
Write<RawObject*>(Smi::New(field_count)); |
// Write out the type arguments. |
- WriteIndexedObject(Object::kNullObject); |
+ WriteNullObject(); |
// Write out the individual Smis. |
for (int i = 0; i < field_count; i++) { |
@@ -535,12 +559,18 @@ |
} |
+void ApiMessageWriter::WriteNullObject() { |
+ WriteVMIsolateObject(Object::kNullObject); |
+} |
+ |
+ |
void ApiMessageWriter::WriteMint(Dart_CObject* object, int64_t value) { |
ASSERT(!Smi::IsValid64(value)); |
// Write out the serialization header value for mint object. |
WriteInlinedHeader(object); |
// Write out the class and tags information. |
- WriteObjectHeader(ObjectStore::kMintClass, 0); |
+ WriteIndexedObject(ObjectStore::kMintClass); |
+ WriteIntptrValue(0); |
// Write the 64-bit value. |
Write<int64_t>(value); |
} |
@@ -568,7 +598,7 @@ |
void ApiMessageWriter::WriteInlinedHeader(Dart_CObject* object) { |
// Write out the serialization header value for this object. |
- WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds + object_id_); |
+ WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id_); |
// Mark object with its object id. |
MarkCObject(object, object_id_); |
// Advance object id. |
@@ -588,10 +618,12 @@ |
// Write out the serialization header value for this object. |
WriteInlinedHeader(object); |
// Write out the class and tags information. |
- WriteObjectHeader(ObjectStore::kArrayClass, 0); |
+ WriteIndexedObject(ObjectStore::kArrayClass); |
+ WriteIntptrValue(0); |
+ |
WriteSmi(object->value.as_array.length); |
// Write out the type arguments. |
- WriteIndexedObject(Object::kNullObject); |
+ WriteNullObject(); |
// Write out array elements. |
for (int i = 0; i < object->value.as_array.length; i++) { |
WriteCObjectRef(object->value.as_array.values[i]); |
@@ -633,12 +665,14 @@ |
// Write out the serialization header value for this object. |
intptr_t object_id = GetMarkedCObjectMark(object); |
- WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds + object_id); |
+ WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id); |
// Write out the class and tags information. |
- WriteObjectHeader(ObjectStore::kArrayClass, 0); |
+ WriteIndexedObject(ObjectStore::kArrayClass); |
+ WriteIntptrValue(0); |
+ |
WriteSmi(object->value.as_array.length); |
// Write out the type arguments. |
- WriteIndexedObject(Object::kNullObject); |
+ WriteNullObject(); |
// Write out array elements. |
for (int i = 0; i < object->value.as_array.length; i++) { |
WriteCObjectRef(object->value.as_array.values[i]); |
@@ -650,7 +684,7 @@ |
Dart_CObject::Type type) { |
switch (type) { |
case Dart_CObject::kNull: |
- WriteIndexedObject(Object::kNullObject); |
+ WriteNullObject(); |
break; |
case Dart_CObject::kBool: |
if (object->value.as_bool) { |
@@ -669,7 +703,8 @@ |
// Write out the serialization header value for this object. |
WriteInlinedHeader(object); |
// Write out the class and tags information. |
- WriteObjectHeader(ObjectStore::kBigintClass, 0); |
+ WriteIndexedObject(ObjectStore::kBigintClass); |
+ WriteIntptrValue(0); |
// Write hex string length and content |
char* hex_string = object->value.as_bigint; |
intptr_t len = strlen(hex_string); |
@@ -683,7 +718,8 @@ |
// Write out the serialization header value for this object. |
WriteInlinedHeader(object); |
// Write out the class and tags information. |
- WriteObjectHeader(ObjectStore::kDoubleClass, 0); |
+ WriteIndexedObject(ObjectStore::kDoubleClass); |
+ WriteIntptrValue(0); |
// Write double value. |
Write<double>(object->value.as_double); |
break; |
@@ -691,7 +727,8 @@ |
// Write out the serialization header value for this object. |
WriteInlinedHeader(object); |
// Write out the class and tags information. |
- WriteObjectHeader(ObjectStore::kOneByteStringClass, 0); |
+ WriteIndexedObject(ObjectStore::kOneByteStringClass); |
+ WriteIntptrValue(0); |
// Write string length, hash and content |
char* str = object->value.as_string; |
intptr_t len = strlen(str); |
@@ -706,7 +743,8 @@ |
// Write out the serialization header value for this object. |
WriteInlinedHeader(object); |
// Write out the class and tags information. |
- WriteObjectHeader(ObjectStore::kUint8ArrayClass, 0); |
+ WriteIndexedObject(ObjectStore::kUint8ArrayClass); |
+ WriteIntptrValue(0); |
uint8_t* bytes = object->value.as_byte_array.values; |
intptr_t len = object->value.as_byte_array.length; |
WriteSmi(len); |
@@ -724,7 +762,8 @@ |
// Write out serialization header value for this object. |
WriteInlinedHeader(object); |
// Write out the class and tag information. |
- WriteObjectHeader(ObjectStore::kExternalUint8ArrayClass, 0); |
+ WriteIndexedObject(ObjectStore::kExternalUint8ArrayClass); |
+ WriteIntptrValue(0); |
int length = object->value.as_external_byte_array.length; |
uint8_t* data = object->value.as_external_byte_array.data; |
void* peer = object->value.as_external_byte_array.peer; |