| Index: runtime/vm/isolate.cc
|
| diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
|
| index 4b1124785de7ad9019f6e452420de901fca1c876..0c6a6622ae5c419ed55f6f4ff45759b44e523c31 100644
|
| --- a/runtime/vm/isolate.cc
|
| +++ b/runtime/vm/isolate.cc
|
| @@ -813,6 +813,7 @@ Isolate::Isolate(const Dart_IsolateFlags& api_flags)
|
| object_id_ring_(NULL),
|
| tag_table_(GrowableObjectArray::null()),
|
| deoptimized_code_array_(GrowableObjectArray::null()),
|
| + sticky_error_(Error::null()),
|
| background_compiler_(NULL),
|
| pending_service_extension_calls_(GrowableObjectArray::null()),
|
| registered_service_extension_handlers_(GrowableObjectArray::null()),
|
| @@ -1864,6 +1865,9 @@ void Isolate::VisitObjectPointers(ObjectPointerVisitor* visitor,
|
| visitor->VisitPointer(
|
| reinterpret_cast<RawObject**>(&deoptimized_code_array_));
|
|
|
| + visitor->VisitPointer(
|
| + reinterpret_cast<RawObject**>(&sticky_error_));
|
| +
|
| // Visit the pending service extension calls.
|
| visitor->VisitPointer(
|
| reinterpret_cast<RawObject**>(&pending_service_extension_calls_));
|
| @@ -2081,6 +2085,11 @@ void Isolate::TrackDeoptimizedCode(const Code& code) {
|
| }
|
|
|
|
|
| +void Isolate::clear_sticky_error() {
|
| + sticky_error_ = Error::null();
|
| +}
|
| +
|
| +
|
| void Isolate::set_pending_service_extension_calls(
|
| const GrowableObjectArray& value) {
|
| pending_service_extension_calls_ = value.raw();
|
| @@ -2592,6 +2601,13 @@ void Isolate::UnscheduleThread(Thread* thread,
|
| // so we create a MonitorLocker object which does not do any
|
| // no_safepoint_scope_depth increments/decrements.
|
| MonitorLocker ml(threads_lock(), false);
|
| + if (is_mutator) {
|
| + if (thread->sticky_error() != Error::null()) {
|
| + ASSERT(sticky_error_ == Error::null());
|
| + sticky_error_ = thread->sticky_error();
|
| + thread->clear_sticky_error();
|
| + }
|
| + }
|
| if (!bypass_safepoint) {
|
| // Ensure that the thread reports itself as being at a safepoint.
|
| thread->EnterSafepoint();
|
|
|