Index: runtime/vm/isolate.cc |
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc |
index 4d6c56c743ae95cd80433efb7132370acfa6ad6e..186810502a0f0c2e0dfaaae9e2876af9a7e4ee0a 100644 |
--- a/runtime/vm/isolate.cc |
+++ b/runtime/vm/isolate.cc |
@@ -418,9 +418,7 @@ bool IsolateMessageHandler::HandleMessage(Message* message) { |
} |
// Parse the message. |
- MessageSnapshotReader reader(message->data(), |
- message->len(), |
- I, zone); |
+ MessageSnapshotReader reader(message->data(), message->len(), thread); |
const Object& msg_obj = Object::Handle(zone, reader.ReadObject()); |
if (msg_obj.IsError()) { |
// An error occurred while reading the message. |
@@ -510,7 +508,7 @@ void IsolateMessageHandler::NotifyPauseOnStart() { |
if (Service::debug_stream.enabled()) { |
StartIsolateScope start_isolate(isolate()); |
StackZone zone(I); |
- HandleScope handle_scope(I); |
+ HandleScope handle_scope(thread()); |
ServiceEvent pause_event(isolate(), ServiceEvent::kPauseStart); |
Service::HandleEvent(&pause_event); |
} else if (FLAG_trace_service) { |
@@ -524,7 +522,7 @@ void IsolateMessageHandler::NotifyPauseOnExit() { |
if (Service::debug_stream.enabled()) { |
StartIsolateScope start_isolate(isolate()); |
StackZone zone(I); |
- HandleScope handle_scope(I); |
+ HandleScope handle_scope(thread()); |
ServiceEvent pause_event(isolate(), ServiceEvent::kPauseExit); |
Service::HandleEvent(&pause_event); |
} else if (FLAG_trace_service) { |
@@ -1265,6 +1263,7 @@ static void StoreError(Isolate* isolate, const Object& obj) { |
static bool RunIsolate(uword parameter) { |
Isolate* isolate = reinterpret_cast<Isolate*>(parameter); |
IsolateSpawnState* state = NULL; |
+ Thread* thread = Thread::Current(); |
{ |
// TODO(turnidge): Is this locking required here at all anymore? |
MutexLocker ml(isolate->mutex()); |
@@ -1272,8 +1271,9 @@ static bool RunIsolate(uword parameter) { |
} |
{ |
StartIsolateScope start_scope(isolate); |
+ ASSERT(thread->isolate() == isolate); |
StackZone zone(isolate); |
- HandleScope handle_scope(isolate); |
+ HandleScope handle_scope(thread); |
// If particular values were requested for this newly spawned isolate, then |
// they are set here before the isolate starts executing user code. |
@@ -1342,8 +1342,8 @@ static bool RunIsolate(uword parameter) { |
const Array& args = Array::Handle(Array::New(7)); |
args.SetAt(0, SendPort::Handle(SendPort::New(state->parent_port()))); |
args.SetAt(1, Instance::Handle(func.ImplicitStaticClosure())); |
- args.SetAt(2, Instance::Handle(state->BuildArgs(zone.GetZone()))); |
- args.SetAt(3, Instance::Handle(state->BuildMessage(zone.GetZone()))); |
+ args.SetAt(2, Instance::Handle(state->BuildArgs(thread))); |
+ args.SetAt(3, Instance::Handle(state->BuildMessage(thread))); |
args.SetAt(4, is_spawn_uri ? Bool::True() : Bool::False()); |
args.SetAt(5, ReceivePort::Handle( |
ReceivePort::New(isolate->main_port(), true /* control port */))); |
@@ -1370,9 +1370,11 @@ static void ShutdownIsolate(uword parameter) { |
{ |
// Print the error if there is one. This may execute dart code to |
// print the exception object, so we need to use a StartIsolateScope. |
+ Thread* thread = Thread::Current(); |
StartIsolateScope start_scope(isolate); |
+ ASSERT(thread->isolate() == isolate); |
StackZone zone(isolate); |
- HandleScope handle_scope(isolate); |
+ HandleScope handle_scope(thread); |
Error& error = Error::Handle(); |
error = isolate->object_store()->sticky_error(); |
if (!error.IsNull() && !error.IsUnwindError()) { |
@@ -1493,11 +1495,13 @@ void Isolate::Shutdown() { |
} |
#endif // DEBUG |
+ Thread* thread = Thread::Current(); |
+ |
// First, perform higher-level cleanup that may need to allocate. |
{ |
// Ensure we have a zone and handle scope so that we can call VM functions. |
StackZone stack_zone(this); |
- HandleScope handle_scope(this); |
+ HandleScope handle_scope(thread); |
// Write out the coverage data if collection has been enabled. |
CodeCoverage::Write(this); |
@@ -1522,7 +1526,7 @@ void Isolate::Shutdown() { |
// Ensure we have a zone and handle scope so that we can call VM functions, |
// but we no longer allocate new heap objects. |
StackZone stack_zone(this); |
- HandleScope handle_scope(this); |
+ HandleScope handle_scope(thread); |
NoSafepointScope no_safepoint_scope; |
if (compiler_stats_ != NULL) { |
@@ -2153,20 +2157,17 @@ T* Isolate::AllocateReusableHandle() { |
} |
-static RawInstance* DeserializeObject(Isolate* isolate, |
- Zone* zone, |
+static RawInstance* DeserializeObject(Thread* thread, |
uint8_t* obj_data, |
intptr_t obj_len) { |
if (obj_data == NULL) { |
return Instance::null(); |
} |
- MessageSnapshotReader reader(obj_data, |
- obj_len, |
- isolate, |
- zone); |
- const Object& obj = Object::Handle(isolate, reader.ReadObject()); |
+ MessageSnapshotReader reader(obj_data, obj_len, thread); |
+ Zone* zone = thread->zone(); |
+ const Object& obj = Object::Handle(zone, reader.ReadObject()); |
ASSERT(!obj.IsError()); |
- Instance& instance = Instance::Handle(isolate); |
+ Instance& instance = Instance::Handle(zone); |
instance ^= obj.raw(); // Can't use Instance::Cast because may be null. |
return instance.raw(); |
} |
@@ -2341,14 +2342,13 @@ RawObject* IsolateSpawnState::ResolveFunction() { |
} |
-RawInstance* IsolateSpawnState::BuildArgs(Zone* zone) { |
- return DeserializeObject(isolate_, zone, |
- serialized_args_, serialized_args_len_); |
+RawInstance* IsolateSpawnState::BuildArgs(Thread* thread) { |
+ return DeserializeObject(thread, serialized_args_, serialized_args_len_); |
} |
-RawInstance* IsolateSpawnState::BuildMessage(Zone* zone) { |
- return DeserializeObject(isolate_, zone, |
+RawInstance* IsolateSpawnState::BuildMessage(Thread* thread) { |
+ return DeserializeObject(thread, |
serialized_message_, serialized_message_len_); |
} |