From fa8a0613a3ef993ae69ffad683c668d45d432306 Mon Sep 17 00:00:00 2001 From: Zachary Anderson Date: Mon, 14 Dec 2015 11:12:25 -0800 Subject: [PATCH] Fold ApiObjectConverter use into ApiMessageReader TODO from change on Friday. R=turnidge@google.com Review URL: https://codereview.chromium.org/1523013002 . --- runtime/vm/dart_api_message.cc | 36 ++++++++++++++++++++++------ runtime/vm/dart_api_message.h | 10 ++++---- runtime/vm/native_message_handler.cc | 20 ++++------------ 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc index a4e47bbd971..bec6df921e6 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) { - // We need to have an enclosing ApiNativeScope. - ASSERT(ApiNativeScope::Current() != NULL); - zone_ = ApiNativeScope::Current()->zone(); - ASSERT(zone_ != NULL); - Init(); +} + + +ApiMessageReader::ApiMessageReader(Message* msg) + : BaseReader(msg->IsRaw() ? reinterpret_cast(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); + // 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(CurrentBufferAddress()); + ASSERT(ApiObjectConverter::CanConvert(raw_obj)); + Dart_CObject* cobj = + reinterpret_cast(allocator(sizeof(Dart_CObject))); + ApiObjectConverter::Convert(raw_obj, cobj); + return cobj; + } } diff --git a/runtime/vm/dart_api_message.h b/runtime/vm/dart_api_message.h index de1b5c3c5b5..f4675c4b384 100644 --- a/runtime/vm/dart_api_message.h +++ b/runtime/vm/dart_api_message.h @@ -9,6 +9,7 @@ #include "platform/utils.h" #include "vm/allocation.h" #include "vm/dart_api_state.h" +#include "vm/message.h" #include "vm/raw_object.h" #include "vm/snapshot.h" @@ -48,6 +49,7 @@ class ApiMessageReader : public BaseReader { // Allocation of all C Heap objects is done in the zone associated with // the enclosing ApiNativeScope. ApiMessageReader(const uint8_t* buffer, intptr_t length); + explicit ApiMessageReader(Message* message); ~ApiMessageReader() { } Dart_CObject* ReadMessage(); @@ -212,13 +214,13 @@ class ApiMessageWriter : public BaseWriter { // as well. class ApiObjectConverter : public AllStatic { public: - static bool CanConvert(RawObject* raw_obj) { + static bool CanConvert(const RawObject* raw_obj) { return !raw_obj->IsHeapObject() || (raw_obj == Object::null()); } - static bool Convert(RawObject* raw_obj, Dart_CObject* c_obj) { + static bool Convert(const RawObject* raw_obj, Dart_CObject* c_obj) { if (!raw_obj->IsHeapObject()) { - ConvertSmi(reinterpret_cast(raw_obj), c_obj); + ConvertSmi(reinterpret_cast(raw_obj), c_obj); } else if (raw_obj == Object::null()) { ConvertNull(c_obj); } else { @@ -228,7 +230,7 @@ class ApiObjectConverter : public AllStatic { } private: - static void ConvertSmi(RawSmi* raw_smi, Dart_CObject* c_obj) { + static void ConvertSmi(const RawSmi* raw_smi, Dart_CObject* c_obj) { ASSERT(!raw_smi->IsHeapObject()); intptr_t value = Smi::Value(raw_smi); if (Utils::IsInt(31, value)) { diff --git a/runtime/vm/native_message_handler.cc b/runtime/vm/native_message_handler.cc index e99caa5debe..7779e95c5f3 100644 --- a/runtime/vm/native_message_handler.cc +++ b/runtime/vm/native_message_handler.cc @@ -42,22 +42,10 @@ MessageHandler::MessageStatus NativeMessageHandler::HandleMessage( // All allocation of objects for decoding the message is done in the // zone associated with this scope. ApiNativeScope scope; - - if (message->IsRaw()) { - // TODO(zra): This should be folded into ApiMessageReader. This will likely - // require ApiMessageReader to have a constructor that takes a Message*. - ASSERT(ApiObjectConverter::CanConvert(message->raw_obj())); - Dart_CObject object; - bool success = ApiObjectConverter::Convert(message->raw_obj(), &object); - ASSERT(success); - (*func())(message->dest_port(), &object); - } else { - Dart_CObject* object; - ApiMessageReader reader(message->data(), message->len()); - object = reader.ReadMessage(); - (*func())(message->dest_port(), object); - } - + Dart_CObject* object; + ApiMessageReader reader(message); + object = reader.ReadMessage(); + (*func())(message->dest_port(), object); delete message; return kOK; }