Index: runtime/vm/dart_api_impl.cc |
=================================================================== |
--- runtime/vm/dart_api_impl.cc (revision 6423) |
+++ runtime/vm/dart_api_impl.cc (working copy) |
@@ -771,7 +771,12 @@ |
DART_EXPORT Dart_Handle Dart_RunLoop() { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
- const Object& obj = Object::Handle(isolate, isolate->StandardRunLoop()); |
+ { |
+ SetIsolateScope set_scope(NULL); |
siva
2012/04/14 00:29:53
Why is NULL passed in and not isolate? Won't it en
turnidge
2012/04/17 23:46:55
Yeah. When I call RunBlocking, it actually runs t
turnidge
2012/04/17 23:49:21
These comments are out of date, now that I've remo
|
+ isolate->message_handler()->RunBlocking(Dart::thread_pool(), NULL, NULL); |
+ } |
+ const Object& obj = Object::Handle(isolate->object_store()->sticky_error()); |
+ isolate->object_store()->clear_sticky_error(); |
if (obj.IsError()) { |
return Api::NewHandle(isolate, obj.raw()); |
} |
@@ -780,58 +785,13 @@ |
} |
-static RawInstance* DeserializeMessage(Isolate* isolate, void* data) { |
- // Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(data); |
- ASSERT(snapshot->IsMessageSnapshot()); |
- |
- // Read object back from the snapshot. |
- SnapshotReader reader(snapshot, isolate); |
- Instance& instance = Instance::Handle(isolate); |
- instance ^= reader.ReadObject(); |
- return instance.raw(); |
-} |
- |
- |
DART_EXPORT Dart_Handle Dart_HandleMessage() { |
Isolate* isolate = Isolate::Current(); |
- // Process all OOB messages and at most one normal message. |
- Message* message = NULL; |
- Message::Priority priority = Message::kNormalPriority; |
- do { |
- DARTSCOPE(isolate); |
- // TODO(turnidge): This code is duplicated elsewhere. Consolidate. |
- message = isolate->message_handler()->queue()->DequeueNoWait(); |
- if (message == NULL) { |
- break; |
- } |
- const Instance& msg = |
- Instance::Handle(isolate, DeserializeMessage(isolate, message->data())); |
- priority = message->priority(); |
- if (priority == Message::kOOBPriority) { |
- // For now the only OOB messages are Mirrors messages. |
- const Object& result = Object::Handle( |
- isolate, |
- DartLibraryCalls::HandleMirrorsMessage( |
- message->dest_port(), message->reply_port(), msg)); |
- delete message; |
- if (result.IsError()) { |
- // TODO(turnidge): Propagating the error is probably wrong here. |
- return Api::NewHandle(isolate, result.raw()); |
- } |
- ASSERT(result.IsNull()); |
- } else { |
- const Object& result = Object::Handle( |
- isolate, |
- DartLibraryCalls::HandleMessage( |
- message->dest_port(), message->reply_port(), msg)); |
- delete message; |
- if (result.IsError()) { |
- return Api::NewHandle(isolate, result.raw()); |
- } |
- ASSERT(result.IsNull()); |
- } |
- } while (priority >= Message::kOOBPriority); |
+ CHECK_ISOLATE(isolate); |
+ if (!isolate->message_handler()->HandleNextMessage()) { |
+ // TODO(turnidge): Clear sticky error here? |
+ return Api::NewHandle(isolate, isolate->object_store()->sticky_error()); |
+ } |
return Api::Success(isolate); |
} |
@@ -905,7 +865,7 @@ |
NativeMessageHandler* nmh = new NativeMessageHandler(name, handler); |
Dart_Port port_id = PortMap::CreatePort(nmh); |
- nmh->StartWorker(); |
+ nmh->Run(Dart::thread_pool(), NULL, NULL); |
return port_id; |
} |