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

Unified Diff: runtime/vm/snapshot.cc

Issue 9325022: Decode the Dart message into a Dart_CMessage structure before calling the native port callback (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments from asiva@ Created 8 years, 10 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/snapshot.h ('k') | runtime/vm/snapshot_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/snapshot.cc
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index ee4fb30dd67265062a6e4cb3db14fed35f8cbb45..016465ab74358eeb10683528c0766a82c18607a7 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -437,242 +437,6 @@ RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id) {
}
-CMessageReader::CMessageReader(const uint8_t* buffer,
- intptr_t length,
- ReAlloc alloc)
- : BaseReader(buffer, length),
- alloc_(alloc),
- backward_references_(kNumInitialReferences) {
- // Initialize marker objects used to handle Lists.
- // TODO(sjesse): Remove this when message serialization format is
- // updated.
- memset(&type_arguments_marker, 0, sizeof(type_arguments_marker));
- memset(&dynamic_type_marker, 0, sizeof(dynamic_type_marker));
- type_arguments_marker.type =
- static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kTypeArguments);
- dynamic_type_marker.type =
- static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kDynamicType);
-}
-
-
-Dart_CObject* CMessageReader::ReadMessage() {
- // Read the object out of the message.
- return ReadObject();
-}
-
-intptr_t CMessageReader::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;
-}
-
-
-Dart_CObject* CMessageReader::AllocateDartCObject(Dart_CObject::Type type) {
- Dart_CObject* value =
- reinterpret_cast<Dart_CObject*>(
- alloc_(NULL, 0, sizeof(Dart_CObject)));
- value->type = type;
- return value;
-}
-
-
-Dart_CObject* CMessageReader::AllocateDartCObjectNull() {
- return AllocateDartCObject(Dart_CObject::kNull);
-}
-
-
-Dart_CObject* CMessageReader::AllocateDartCObjectBool(bool val) {
- Dart_CObject* value = AllocateDartCObject(Dart_CObject::kBool);
- value->value.as_bool = val;
- return value;
-}
-
-
-Dart_CObject* CMessageReader::AllocateDartCObjectInt32(int32_t val) {
- Dart_CObject* value = AllocateDartCObject(Dart_CObject::kInt32);
- value->value.as_int32 = val;
- return value;
-}
-
-
-Dart_CObject* CMessageReader::AllocateDartCObjectDouble(double val) {
- Dart_CObject* value = AllocateDartCObject(Dart_CObject::kDouble);
- value->value.as_double = val;
- return value;
-}
-
-
-Dart_CObject* CMessageReader::AllocateDartCObjectString(intptr_t length) {
- // Allocate a Dart_CObject structure followed by an array of chars
- // for the string content. The pointer to the string content is set
- // up to this area.
- Dart_CObject* value =
- reinterpret_cast<Dart_CObject*>(
- alloc_(NULL, 0, sizeof(Dart_CObject) + length + 1));
- value->value.as_string = reinterpret_cast<char*>(value) + sizeof(*value);
- value->type = Dart_CObject::kString;
- return value;
-}
-
-
-Dart_CObject* CMessageReader::AllocateDartCObjectArray(intptr_t length) {
- // Allocate a Dart_CObject structure followed by an array of
- // pointers to Dart_CObject structures. The pointer to the array
- // content is set up to this area.
- Dart_CObject* value =
- reinterpret_cast<Dart_CObject*>(
- alloc_(NULL, 0, sizeof(Dart_CObject) + length * sizeof(value)));
- value->type = Dart_CObject::kArray;
- value->value.as_array.length = length;
- if (length > 0) {
- value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1);
- } else {
- value->value.as_array.values = NULL;
- }
- return value;
-}
-
-
-Dart_CObject* CMessageReader::ReadInlinedObject(intptr_t object_id) {
- // Read the class header information and lookup the class.
- intptr_t class_header = ReadIntptrValue();
- intptr_t tags = ReadIntptrValue();
- USE(tags);
- intptr_t class_id;
-
- // Reading of regular dart instances is not supported.
- if (SerializedHeaderData::decode(class_header) == kInstanceId) {
- return NULL;
- }
-
- ASSERT((class_header & kSmiTagMask) != 0);
- class_id = LookupInternalClass(class_header);
- switch (class_id) {
- case Object::kClassClass: {
- return NULL;
- }
- case Object::kTypeArgumentsClass: {
- // TODO(sjesse): Remove this when message serialization format is
- // updated (currently length is leaked).
- AddBackwardReference(object_id, NULL);
- Dart_CObject* length = ReadObject();
- ASSERT(length->type == Dart_CObject::kInt32);
- for (int i = 0; i < length->value.as_int32; i++) {
- Dart_CObject* type = ReadObject();
- if (type != &dynamic_type_marker) return NULL;
- }
- return &type_arguments_marker;
- break;
- }
- case ObjectStore::kArrayClass: {
- intptr_t len = ReadSmiValue();
- Dart_CObject* value = AllocateDartCObjectArray(len);
- AddBackwardReference(object_id, value);
- // Skip type arguments.
- // TODO(sjesse): Remove this when message serialization format is
- // updated (currently type_arguments is leaked).
- Dart_CObject* type_arguments = ReadObject();
- if (type_arguments != &type_arguments_marker &&
- type_arguments->type != Dart_CObject::kNull) {
- return NULL;
- }
- for (int i = 0; i < len; i++) {
- value->value.as_array.values[i] = ReadObject();
- }
- return value;
- break;
- }
- case ObjectStore::kDoubleClass: {
- // Read the double value for the object.
- Dart_CObject* object = AllocateDartCObjectDouble(Read<double>());
- AddBackwardReference(object_id, object);
- return object;
- break;
- }
- case ObjectStore::kOneByteStringClass: {
- intptr_t len = ReadSmiValue();
- intptr_t hash = ReadSmiValue();
- USE(hash);
- Dart_CObject* object = AllocateDartCObjectString(len);
- AddBackwardReference(object_id, object);
- char* p = object->value.as_string;
- for (intptr_t i = 0; i < len; i++) {
- *p = Read<uint8_t>();
- p++;
- }
- *p = '\0';
- return object;
- break;
- }
- case ObjectStore::kTwoByteStringClass:
- // Two byte strings not supported.
- return NULL;
- break;
- case ObjectStore::kFourByteStringClass:
- // Four byte strings not supported.
- return NULL;
- break;
- default:
- // Everything else not supported.
- return NULL;
- }
-}
-
-
-Dart_CObject* CMessageReader::ReadIndexedObject(intptr_t object_id) {
- if (object_id == Object::kNullObject) {
- return AllocateDartCObjectNull();
- } else if (object_id == ObjectStore::kTrueValue) {
- return AllocateDartCObjectBool(true);
- } else if (object_id == ObjectStore::kFalseValue) {
- return AllocateDartCObjectBool(false);
- } else if (object_id == ObjectStore::kDynamicType ||
- object_id == ObjectStore::kDoubleInterface ||
- object_id == ObjectStore::kIntInterface ||
- object_id == ObjectStore::kBoolInterface ||
- object_id == ObjectStore::kStringInterface) {
- // Always return dynamic type (this is only a marker).
- return &dynamic_type_marker;
- } else {
- intptr_t index = object_id - kMaxPredefinedObjectIds;
- ASSERT(index < backward_references_.length());
- ASSERT(backward_references_[index] != NULL);
- return backward_references_[index];
- }
- return NULL;
-}
-
-
-Dart_CObject* CMessageReader::ReadObjectImpl(intptr_t header) {
- SerializedHeaderType header_type = SerializedHeaderTag::decode(header);
- intptr_t header_value = SerializedHeaderData::decode(header);
-
- if (header_type == kObjectId) {
- return ReadIndexedObject(header_value);
- }
- ASSERT(header_type == kInlined);
- return ReadInlinedObject(header_value);
-}
-
-
-Dart_CObject* CMessageReader::ReadObject() {
- int64_t value = Read<int64_t>();
- if ((value & kSmiTagMask) == 0) {
- Dart_CObject* dart_value = AllocateDartCObjectInt32(value >> kSmiTagShift);
- return dart_value;
- }
- ASSERT((value <= kIntptrMax) && (value >= kIntptrMin));
- return ReadObjectImpl(value);
-}
-
-
-void CMessageReader::AddBackwardReference(intptr_t id, Dart_CObject* obj) {
- ASSERT((id - kMaxPredefinedObjectIds) == backward_references_.length());
- backward_references_.Add(obj);
-}
-
-
void MessageWriter::WriteMessage(intptr_t field_count, intptr_t *data) {
// Write out the serialization header value for this object.
WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds);
« no previous file with comments | « runtime/vm/snapshot.h ('k') | runtime/vm/snapshot_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698