Chromium Code Reviews| Index: runtime/vm/isolate.cc |
| diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc |
| index f8133efa01441bf6c2a1b3e9a705498c4d8cb102..efb2618cbb74e2a85eb83be43bf8e6bc90b42fbb 100644 |
| --- a/runtime/vm/isolate.cc |
| +++ b/runtime/vm/isolate.cc |
| @@ -135,6 +135,21 @@ static void SerializeObject(const Instance& obj, |
| } |
| +static Message* SerializeMessage( |
|
turnidge
2015/12/11 22:30:48
Instead of having this helper function, how about
Ivan Posva
2015/12/11 22:53:39
Todd,
I tend to agree with your concern about the
zra
2015/12/11 23:44:32
Added TODO here.
|
| + Dart_Port dest_port, const Instance& obj) { |
| + if (ApiObjectConverter::CanConvert(obj.raw())) { |
| + return new Message(dest_port, |
| + reinterpret_cast<uint8_t*>(obj.raw()), 0, |
| + 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 +275,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 +286,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 +340,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 +469,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 +491,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 +1210,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 +1279,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; |