| Index: runtime/vm/isolate.cc
|
| diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
|
| index 9fa203000c8cf22997b353295c2b3efcb1795e04..b97fabb19bddccab09a79f7685de8e52f10c3895 100644
|
| --- a/runtime/vm/isolate.cc
|
| +++ b/runtime/vm/isolate.cc
|
| @@ -217,14 +217,15 @@ const char* IsolateMessageHandler::name() const {
|
| // [ OOB dispatch, Isolate library dispatch, <message specific data> ]
|
| RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| if (message.Length() < 2) return Error::null();
|
| - const Object& type = Object::Handle(I, message.At(1));
|
| + Zone* zone = I->current_zone();
|
| + const Object& type = Object::Handle(zone, message.At(1));
|
| if (!type.IsSmi()) return Error::null();
|
| const intptr_t msg_type = Smi::Cast(type).Value();
|
| switch (msg_type) {
|
| case Isolate::kPauseMsg: {
|
| // [ OOB, kPauseMsg, pause capability, resume capability ]
|
| if (message.Length() != 4) return Error::null();
|
| - Object& obj = Object::Handle(I, message.At(2));
|
| + Object& obj = Object::Handle(zone, message.At(2));
|
| if (!I->VerifyPauseCapability(obj)) return Error::null();
|
| obj = message.At(3);
|
| if (!obj.IsCapability()) return Error::null();
|
| @@ -236,7 +237,7 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| case Isolate::kResumeMsg: {
|
| // [ OOB, kResumeMsg, pause capability, resume capability ]
|
| if (message.Length() != 4) return Error::null();
|
| - Object& obj = Object::Handle(I, message.At(2));
|
| + Object& obj = Object::Handle(zone, message.At(2));
|
| if (!I->VerifyPauseCapability(obj)) return Error::null();
|
| obj = message.At(3);
|
| if (!obj.IsCapability()) return Error::null();
|
| @@ -248,13 +249,13 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| case Isolate::kPingMsg: {
|
| // [ OOB, kPingMsg, responsePort, priority, response ]
|
| if (message.Length() != 5) return Error::null();
|
| - const Object& obj2 = Object::Handle(I, message.At(2));
|
| + const Object& obj2 = Object::Handle(zone, message.At(2));
|
| if (!obj2.IsSendPort()) return Error::null();
|
| const SendPort& send_port = SendPort::Cast(obj2);
|
| - const Object& obj3 = Object::Handle(I, message.At(3));
|
| + const Object& obj3 = Object::Handle(zone, message.At(3));
|
| if (!obj3.IsSmi()) return Error::null();
|
| const intptr_t priority = Smi::Cast(obj3).Value();
|
| - const Object& obj4 = Object::Handle(I, message.At(4));
|
| + const Object& obj4 = Object::Handle(zone, message.At(4));
|
| if (!obj4.IsInstance() && !obj4.IsNull()) return Error::null();
|
| const Instance& response =
|
| obj4.IsNull() ? Instance::null_instance() : Instance::Cast(obj4);
|
| @@ -270,9 +271,10 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| (priority == Isolate::kAsEventAction));
|
| // Update the message so that it will be handled immediately when it
|
| // is picked up from the message queue the next time.
|
| - message.SetAt(
|
| - 0, Smi::Handle(I, Smi::New(Message::kDelayedIsolateLibOOBMsg)));
|
| - message.SetAt(3, Smi::Handle(I, Smi::New(Isolate::kImmediateAction)));
|
| + message.SetAt(0, Smi::Handle(zone,
|
| + 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);
|
| @@ -289,7 +291,7 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| case Isolate::kVMRestartMsg: {
|
| // [ OOB, kKillMsg, terminate capability, priority ]
|
| if (message.Length() != 4) return Error::null();
|
| - Object& obj = Object::Handle(I, message.At(3));
|
| + Object& obj = Object::Handle(zone, message.At(3));
|
| if (!obj.IsSmi()) return Error::null();
|
| const intptr_t priority = Smi::Cast(obj).Value();
|
| if (priority == Isolate::kImmediateAction) {
|
| @@ -328,9 +330,10 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| (priority == Isolate::kAsEventAction));
|
| // Update the message so that it will be handled immediately when it
|
| // is picked up from the message queue the next time.
|
| - message.SetAt(
|
| - 0, Smi::Handle(I, Smi::New(Message::kDelayedIsolateLibOOBMsg)));
|
| - message.SetAt(3, Smi::Handle(I, Smi::New(Isolate::kImmediateAction)));
|
| + message.SetAt(0, Smi::Handle(zone,
|
| + 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);
|
| @@ -345,7 +348,7 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| case Isolate::kInterruptMsg: {
|
| // [ OOB, kInterruptMsg, pause capability ]
|
| if (message.Length() != 3) return Error::null();
|
| - Object& obj = Object::Handle(I, message.At(2));
|
| + Object& obj = Object::Handle(zone, message.At(2));
|
| if (!I->VerifyPauseCapability(obj)) return Error::null();
|
|
|
| // If we are already paused, don't pause again.
|
| @@ -361,14 +364,14 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| case Isolate::kDelErrorMsg: {
|
| // [ OOB, msg, listener port ]
|
| if (message.Length() < 3) return Error::null();
|
| - const Object& obj = Object::Handle(I, message.At(2));
|
| + const Object& obj = Object::Handle(zone, message.At(2));
|
| if (!obj.IsSendPort()) return Error::null();
|
| const SendPort& listener = SendPort::Cast(obj);
|
| switch (msg_type) {
|
| case Isolate::kAddExitMsg: {
|
| if (message.Length() != 4) return Error::null();
|
| // [ OOB, msg, listener port, response object ]
|
| - const Object& response = Object::Handle(I, message.At(3));
|
| + const Object& response = Object::Handle(zone, message.At(3));
|
| if (!response.IsInstance() && !response.IsNull()) {
|
| return Error::null();
|
| }
|
| @@ -398,7 +401,7 @@ RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
|
| // [ OOB, kErrorFatalMsg, terminate capability, val ]
|
| if (message.Length() != 4) return Error::null();
|
| // Check that the terminate capability has been passed correctly.
|
| - Object& obj = Object::Handle(I, message.At(2));
|
| + Object& obj = Object::Handle(zone, message.At(2));
|
| if (!I->VerifyTerminateCapability(obj)) return Error::null();
|
| // Get the value to be set.
|
| obj = message.At(3);
|
| @@ -637,19 +640,20 @@ MessageHandler::MessageStatus IsolateMessageHandler::ProcessUnhandledException(
|
| }
|
|
|
| // Generate the error and stacktrace strings for the error message.
|
| - String& exc_str = String::Handle(I);
|
| - String& stacktrace_str = String::Handle(I);
|
| + String& exc_str = String::Handle(I->current_zone());
|
| + String& stacktrace_str = String::Handle(I->current_zone());
|
| if (result.IsUnhandledException()) {
|
| + Zone* zone = I->current_zone();
|
| const UnhandledException& uhe = UnhandledException::Cast(result);
|
| - const Instance& exception = Instance::Handle(I, uhe.exception());
|
| - Object& tmp = Object::Handle(I);
|
| + const Instance& exception = Instance::Handle(zone, uhe.exception());
|
| + Object& tmp = Object::Handle(zone);
|
| tmp = DartLibraryCalls::ToString(exception);
|
| if (!tmp.IsString()) {
|
| tmp = String::New(exception.ToCString());
|
| }
|
| exc_str ^= tmp.raw();
|
|
|
| - const Instance& stacktrace = Instance::Handle(I, uhe.stacktrace());
|
| + const Instance& stacktrace = Instance::Handle(zone, uhe.stacktrace());
|
| tmp = DartLibraryCalls::ToString(stacktrace);
|
| if (!tmp.IsString()) {
|
| tmp = String::New(stacktrace.ToCString());
|
| @@ -1062,9 +1066,9 @@ void Isolate::ScheduleInterrupts(uword interrupt_bits) {
|
|
|
|
|
| void Isolate::DoneLoading() {
|
| - GrowableObjectArray& libs =
|
| - GrowableObjectArray::Handle(this, object_store()->libraries());
|
| - Library& lib = Library::Handle(this);
|
| + GrowableObjectArray& libs = GrowableObjectArray::Handle(current_zone(),
|
| + object_store()->libraries());
|
| + Library& lib = Library::Handle(current_zone());
|
| intptr_t num_libs = libs.Length();
|
| for (intptr_t i = 0; i < num_libs; i++) {
|
| lib ^= libs.At(i);
|
| @@ -1132,8 +1136,8 @@ bool Isolate::AddResumeCapability(const Capability& capability) {
|
| static const intptr_t kMaxResumeCapabilities = kSmiMax / (6 * kWordSize);
|
|
|
| const GrowableObjectArray& caps = GrowableObjectArray::Handle(
|
| - this, object_store()->resume_capabilities());
|
| - Capability& current = Capability::Handle(this);
|
| + current_zone(), object_store()->resume_capabilities());
|
| + Capability& current = Capability::Handle(current_zone());
|
| intptr_t insertion_index = -1;
|
| for (intptr_t i = 0; i < caps.Length(); i++) {
|
| current ^= caps.At(i);
|
| @@ -1162,8 +1166,8 @@ bool Isolate::AddResumeCapability(const Capability& capability) {
|
|
|
| bool Isolate::RemoveResumeCapability(const Capability& capability) {
|
| const GrowableObjectArray& caps = GrowableObjectArray::Handle(
|
| - this, object_store()->resume_capabilities());
|
| - Capability& current = Capability::Handle(this);
|
| + current_zone(), object_store()->resume_capabilities());
|
| + Capability& current = Capability::Handle(current_zone());
|
| for (intptr_t i = 0; i < caps.Length(); i++) {
|
| current ^= caps.At(i);
|
| if (!current.IsNull() && (current.Id() == capability.Id())) {
|
| @@ -1185,8 +1189,8 @@ void Isolate::AddExitListener(const SendPort& listener,
|
| static const intptr_t kMaxListeners = kSmiMax / (12 * kWordSize);
|
|
|
| const GrowableObjectArray& listeners = GrowableObjectArray::Handle(
|
| - this, object_store()->exit_listeners());
|
| - SendPort& current = SendPort::Handle(this);
|
| + current_zone(), object_store()->exit_listeners());
|
| + SendPort& current = SendPort::Handle(current_zone());
|
| intptr_t insertion_index = -1;
|
| for (intptr_t i = 0; i < listeners.Length(); i += 2) {
|
| current ^= listeners.At(i);
|
| @@ -1217,8 +1221,8 @@ void Isolate::AddExitListener(const SendPort& listener,
|
|
|
| void Isolate::RemoveExitListener(const SendPort& listener) {
|
| const GrowableObjectArray& listeners = GrowableObjectArray::Handle(
|
| - this, object_store()->exit_listeners());
|
| - SendPort& current = SendPort::Handle(this);
|
| + current_zone(), object_store()->exit_listeners());
|
| + SendPort& current = SendPort::Handle(current_zone());
|
| for (intptr_t i = 0; i < listeners.Length(); i += 2) {
|
| current ^= listeners.At(i);
|
| if (!current.IsNull() && (current.Id() == listener.Id())) {
|
| @@ -1234,11 +1238,11 @@ void Isolate::RemoveExitListener(const SendPort& listener) {
|
|
|
| void Isolate::NotifyExitListeners() {
|
| const GrowableObjectArray& listeners = GrowableObjectArray::Handle(
|
| - this, this->object_store()->exit_listeners());
|
| + current_zone(), this->object_store()->exit_listeners());
|
| if (listeners.IsNull()) return;
|
|
|
| - SendPort& listener = SendPort::Handle(this);
|
| - Instance& response = Instance::Handle(this);
|
| + SendPort& listener = SendPort::Handle(current_zone());
|
| + Instance& response = Instance::Handle(current_zone());
|
| for (intptr_t i = 0; i < listeners.Length(); i += 2) {
|
| listener ^= listeners.At(i);
|
| if (!listener.IsNull()) {
|
| @@ -1259,8 +1263,8 @@ void Isolate::AddErrorListener(const SendPort& listener) {
|
| static const intptr_t kMaxListeners = kSmiMax / (6 * kWordSize);
|
|
|
| const GrowableObjectArray& listeners = GrowableObjectArray::Handle(
|
| - this, object_store()->error_listeners());
|
| - SendPort& current = SendPort::Handle(this);
|
| + current_zone(), object_store()->error_listeners());
|
| + SendPort& current = SendPort::Handle(current_zone());
|
| intptr_t insertion_index = -1;
|
| for (intptr_t i = 0; i < listeners.Length(); i++) {
|
| current ^= listeners.At(i);
|
| @@ -1288,8 +1292,8 @@ void Isolate::AddErrorListener(const SendPort& listener) {
|
|
|
| void Isolate::RemoveErrorListener(const SendPort& listener) {
|
| const GrowableObjectArray& listeners = GrowableObjectArray::Handle(
|
| - this, object_store()->error_listeners());
|
| - SendPort& current = SendPort::Handle(this);
|
| + current_zone(), object_store()->error_listeners());
|
| + SendPort& current = SendPort::Handle(current_zone());
|
| for (intptr_t i = 0; i < listeners.Length(); i++) {
|
| current ^= listeners.At(i);
|
| if (!current.IsNull() && (current.Id() == listener.Id())) {
|
| @@ -1305,13 +1309,13 @@ void Isolate::RemoveErrorListener(const SendPort& listener) {
|
| bool Isolate::NotifyErrorListeners(const String& msg,
|
| const String& stacktrace) {
|
| const GrowableObjectArray& listeners = GrowableObjectArray::Handle(
|
| - this, this->object_store()->error_listeners());
|
| + current_zone(), this->object_store()->error_listeners());
|
| if (listeners.IsNull()) return false;
|
|
|
| - const Array& arr = Array::Handle(this, Array::New(2));
|
| + const Array& arr = Array::Handle(current_zone(), Array::New(2));
|
| arr.SetAt(0, msg);
|
| arr.SetAt(1, stacktrace);
|
| - SendPort& listener = SendPort::Handle(this);
|
| + SendPort& listener = SendPort::Handle(current_zone());
|
| for (intptr_t i = 0; i < listeners.Length(); i++) {
|
| listener ^= listeners.At(i);
|
| if (!listener.IsNull()) {
|
| @@ -1376,7 +1380,7 @@ static MessageHandler::MessageStatus RunIsolate(uword parameter) {
|
| return StoreError(isolate, Error::Cast(result));
|
| }
|
| ASSERT(result.IsFunction());
|
| - Function& func = Function::Handle(isolate);
|
| + Function& func = Function::Handle(thread->zone());
|
| func ^= result.raw();
|
|
|
| // TODO(turnidge): Currently we need a way to force a one-time
|
| @@ -1668,7 +1672,7 @@ void Isolate::Shutdown() {
|
| // Write out the coverage data if collection has been enabled.
|
| if ((this != Dart::vm_isolate()) &&
|
| !ServiceIsolate::IsServiceIsolateDescendant(this)) {
|
| - CodeCoverage::Write(this);
|
| + CodeCoverage::Write(thread);
|
| }
|
|
|
| // Write compiler stats data if enabled.
|
| @@ -1898,7 +1902,8 @@ void Isolate::PrintJSON(JSONStream* stream, bool ref) {
|
| vm_tag_counters()->PrintToJSONObject(&tagCounters);
|
| }
|
| if (object_store()->sticky_error() != Object::null()) {
|
| - Error& error = Error::Handle(this, object_store()->sticky_error());
|
| + Error& error = Error::Handle(current_zone(),
|
| + object_store()->sticky_error());
|
| ASSERT(!error.IsNull());
|
| jsobj.AddProperty("error", error, false);
|
| }
|
|
|