| Index: runtime/vm/isolate.cc
|
| diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
|
| index f8133efa01441bf6c2a1b3e9a705498c4d8cb102..fe5289180a6a853a853c82ff35c8e883cfc0c9fe 100644
|
| --- a/runtime/vm/isolate.cc
|
| +++ b/runtime/vm/isolate.cc
|
| @@ -134,6 +134,19 @@ static void SerializeObject(const Instance& obj,
|
| *obj_len = writer.BytesWritten();
|
| }
|
|
|
| +// TODO(zra): Allocation of Message objects should be centralized.
|
| +static Message* SerializeMessage(
|
| + Dart_Port dest_port, const Instance& obj) {
|
| + if (ApiObjectConverter::CanConvert(obj.raw())) {
|
| + return new Message(dest_port, obj.raw(), Message::kNormalPriority);
|
| + } else {
|
| + uint8_t* obj_data;
|
| + intptr_t obj_len;
|
| + SerializeObject(obj, &obj_data, &obj_len, false);
|
| + return new Message(dest_port, obj_data, obj_len, Message::kNormalPriority);
|
| + }
|
| +}
|
| +
|
|
|
| void Isolate::RegisterClass(const Class& cls) {
|
| class_table()->Register(cls);
|
| @@ -260,12 +273,8 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| const Instance& response =
|
| obj4.IsNull() ? Instance::null_instance() : Instance::Cast(obj4);
|
| if (priority == Isolate::kImmediateAction) {
|
| - uint8_t* data = NULL;
|
| - intptr_t len = 0;
|
| - SerializeObject(response, &data, &len, false);
|
| - PortMap::PostMessage(new Message(send_port.Id(),
|
| - data, len,
|
| - Message::kNormalPriority));
|
| + PortMap::PostMessage(SerializeMessage(
|
| + send_port.Id(), response));
|
| } else {
|
| ASSERT((priority == Isolate::kBeforeNextEventAction) ||
|
| (priority == Isolate::kAsEventAction));
|
| @@ -275,13 +284,8 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| Smi::New(Message::kDelayedIsolateLibOOBMsg)));
|
| message.SetAt(3, Smi::Handle(zone,
|
| Smi::New(Isolate::kImmediateAction)));
|
| - uint8_t* data = NULL;
|
| - intptr_t len = 0;
|
| - SerializeObject(message, &data, &len, false);
|
| - this->PostMessage(
|
| - new Message(Message::kIllegalPort,
|
| - data, len,
|
| - Message::kNormalPriority),
|
| + this->PostMessage(SerializeMessage(
|
| + Message::kIllegalPort, message),
|
| priority == Isolate::kBeforeNextEventAction /* at_head */);
|
| }
|
| break;
|
| @@ -334,13 +338,8 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| Smi::New(Message::kDelayedIsolateLibOOBMsg)));
|
| message.SetAt(3, Smi::Handle(zone,
|
| Smi::New(Isolate::kImmediateAction)));
|
| - uint8_t* data = NULL;
|
| - intptr_t len = 0;
|
| - SerializeObject(message, &data, &len, false);
|
| - this->PostMessage(
|
| - new Message(Message::kIllegalPort,
|
| - data, len,
|
| - Message::kNormalPriority),
|
| + this->PostMessage(SerializeMessage(
|
| + Message::kIllegalPort, message),
|
| priority == Isolate::kBeforeNextEventAction /* at_head */);
|
| }
|
| break;
|
| @@ -468,8 +467,15 @@ MessageHandler::MessageStatus IsolateMessageHandler::HandleMessage(
|
| }
|
|
|
| // Parse the message.
|
| - MessageSnapshotReader reader(message->data(), message->len(), thread);
|
| - const Object& msg_obj = Object::Handle(zone, reader.ReadObject());
|
| + Object& msg_obj = Object::Handle(zone);
|
| + if (message->IsRaw()) {
|
| + msg_obj = message->raw_obj();
|
| + // We should only be sending RawObjects that can be converted to CObjects.
|
| + ASSERT(ApiObjectConverter::CanConvert(msg_obj.raw()));
|
| + } else {
|
| + MessageSnapshotReader reader(message->data(), message->len(), thread);
|
| + msg_obj = reader.ReadObject();
|
| + }
|
| if (msg_obj.IsError()) {
|
| // An error occurred while reading the message.
|
| delete message;
|
| @@ -483,7 +489,6 @@ MessageHandler::MessageStatus IsolateMessageHandler::HandleMessage(
|
| // always true for now, then this should never occur.
|
| UNREACHABLE();
|
| }
|
| -
|
| Instance& msg = Instance::Handle(zone);
|
| msg ^= msg_obj.raw(); // Can't use Instance::Cast because may be null.
|
|
|
| @@ -1203,12 +1208,8 @@ void Isolate::NotifyExitListeners() {
|
| listener ^= listeners.At(i);
|
| if (!listener.IsNull()) {
|
| Dart_Port port_id = listener.Id();
|
| - uint8_t* data = NULL;
|
| - intptr_t len = 0;
|
| response ^= listeners.At(i + 1);
|
| - SerializeObject(response, &data, &len, false);
|
| - Message* msg = new Message(port_id, data, len, Message::kNormalPriority);
|
| - PortMap::PostMessage(msg);
|
| + PortMap::PostMessage(SerializeMessage(port_id, response));
|
| }
|
| }
|
| }
|
| @@ -1276,11 +1277,7 @@ bool Isolate::NotifyErrorListeners(const String& msg,
|
| listener ^= listeners.At(i);
|
| if (!listener.IsNull()) {
|
| Dart_Port port_id = listener.Id();
|
| - uint8_t* data = NULL;
|
| - intptr_t len = 0;
|
| - SerializeObject(arr, &data, &len, false);
|
| - Message* msg = new Message(port_id, data, len, Message::kNormalPriority);
|
| - PortMap::PostMessage(msg);
|
| + PortMap::PostMessage(SerializeMessage(port_id, arr));
|
| }
|
| }
|
| return listeners.Length() > 0;
|
|
|