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

Unified Diff: runtime/vm/isolate.cc

Issue 1499853004: Adds a special case for sending an int over a port with the native API. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Cleanup Created 5 years 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
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;

Powered by Google App Engine
This is Rietveld 408576698