| Index: runtime/vm/dart_api_message.cc
|
| diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
|
| index a4e47bbd97154a8fcdf79e2fa9cbaae747f70254..bec6df921e68ba4f1d24feea123e92eb5ec07c21 100644
|
| --- a/runtime/vm/dart_api_message.cc
|
| +++ b/runtime/vm/dart_api_message.cc
|
| @@ -18,15 +18,26 @@ ApiMessageReader::ApiMessageReader(const uint8_t* buffer, intptr_t length)
|
| backward_references_(kNumInitialReferences),
|
| vm_isolate_references_(kNumInitialReferences),
|
| vm_symbol_references_(NULL) {
|
| +}
|
| +
|
| +
|
| +ApiMessageReader::ApiMessageReader(Message* msg)
|
| + : BaseReader(msg->IsRaw() ? reinterpret_cast<uint8_t*>(msg->raw_obj())
|
| + : msg->data(),
|
| + msg->len()),
|
| + zone_(NULL),
|
| + backward_references_(kNumInitialReferences),
|
| + vm_isolate_references_(kNumInitialReferences),
|
| + vm_symbol_references_(NULL) {
|
| +}
|
| +
|
| +
|
| +void ApiMessageReader::Init() {
|
| // We need to have an enclosing ApiNativeScope.
|
| ASSERT(ApiNativeScope::Current() != NULL);
|
| zone_ = ApiNativeScope::Current()->zone();
|
| ASSERT(zone_ != NULL);
|
| - Init();
|
| -}
|
|
|
| -
|
| -void ApiMessageReader::Init() {
|
| // Initialize marker objects used to handle Lists.
|
| // TODO(sjesse): Remove this when message serialization format is
|
| // updated.
|
| @@ -40,8 +51,19 @@ void ApiMessageReader::Init() {
|
|
|
|
|
| Dart_CObject* ApiMessageReader::ReadMessage() {
|
| - // Read the object out of the message.
|
| - return ReadObject();
|
| + Init();
|
| + if (PendingBytes() > 0) {
|
| + // Read the object out of the message.
|
| + return ReadObject();
|
| + } else {
|
| + const RawObject* raw_obj =
|
| + reinterpret_cast<const RawObject*>(CurrentBufferAddress());
|
| + ASSERT(ApiObjectConverter::CanConvert(raw_obj));
|
| + Dart_CObject* cobj =
|
| + reinterpret_cast<Dart_CObject*>(allocator(sizeof(Dart_CObject)));
|
| + ApiObjectConverter::Convert(raw_obj, cobj);
|
| + return cobj;
|
| + }
|
| }
|
|
|
|
|
|
|