Index: runtime/vm/exceptions.cc |
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc |
index 1ef229f10b1d1c9f218129015c222edaeaea5347..75ef32219aac6850e4f4609668c7ac7c55d6ff47 100644 |
--- a/runtime/vm/exceptions.cc |
+++ b/runtime/vm/exceptions.cc |
@@ -194,7 +194,7 @@ static void FindErrorHandler(uword* handler_pc, |
} |
-static void JumpToExceptionHandler(Isolate* isolate, |
+static void JumpToExceptionHandler(Thread* thread, |
uword program_counter, |
uword stack_pointer, |
uword frame_pointer, |
@@ -216,17 +216,17 @@ static void JumpToExceptionHandler(Isolate* isolate, |
// object (may be raw null) in the kStackTraceObjectReg register. |
Simulator::Current()->Longjmp(program_counter, stack_pointer, frame_pointer, |
- raw_exception, raw_stacktrace, isolate); |
+ raw_exception, raw_stacktrace, thread); |
#else |
// Prepare for unwinding frames by destroying all the stack resources |
// in the previous frames. |
- StackResource::Unwind(isolate); |
+ StackResource::Unwind(thread->isolate()); |
// Call a stub to set up the exception object in kExceptionObjectReg, |
// to set up the stacktrace object in kStackTraceObjectReg, and to |
// continue execution at the given pc in the given frame. |
typedef void (*ExcpHandler)(uword, uword, uword, RawObject*, RawObject*, |
- Isolate*); |
+ Thread*); |
ExcpHandler func = reinterpret_cast<ExcpHandler>( |
StubCode::JumpToExceptionHandlerEntryPoint()); |
@@ -236,7 +236,7 @@ static void JumpToExceptionHandler(Isolate* isolate, |
stack_pointer - current_sp); |
func(program_counter, stack_pointer, frame_pointer, |
- raw_exception, raw_stacktrace, isolate); |
+ raw_exception, raw_stacktrace, thread); |
#endif |
UNREACHABLE(); |
} |
@@ -288,10 +288,11 @@ RawStacktrace* Exceptions::CurrentStacktrace() { |
} |
-static void ThrowExceptionHelper(Isolate* isolate, |
+static void ThrowExceptionHelper(Thread* thread, |
const Instance& incoming_exception, |
const Instance& existing_stacktrace, |
const bool is_rethrow) { |
+ Isolate* isolate = thread->isolate(); |
bool use_preallocated_stacktrace = false; |
Instance& exception = Instance::Handle(isolate, incoming_exception.raw()); |
if (exception.IsNull()) { |
@@ -363,7 +364,7 @@ static void ThrowExceptionHelper(Isolate* isolate, |
} |
if (handler_exists) { |
// Found a dart handler for the exception, jump to it. |
- JumpToExceptionHandler(isolate, |
+ JumpToExceptionHandler(thread, |
handler_pc, |
handler_sp, |
handler_fp, |
@@ -380,7 +381,7 @@ static void ThrowExceptionHelper(Isolate* isolate, |
const UnhandledException& unhandled_exception = UnhandledException::Handle( |
isolate, UnhandledException::New(exception, stacktrace)); |
stacktrace = Stacktrace::null(); |
- JumpToExceptionHandler(isolate, |
+ JumpToExceptionHandler(thread, |
handler_pc, |
handler_sp, |
handler_fp, |
@@ -474,29 +475,30 @@ void Exceptions::CreateAndThrowTypeError(intptr_t location, |
} |
-void Exceptions::Throw(Isolate* isolate, const Instance& exception) { |
+void Exceptions::Throw(Thread* thread, const Instance& exception) { |
// Do not notify debugger on stack overflow and out of memory exceptions. |
// The VM would crash when the debugger calls back into the VM to |
// get values of variables. |
+ Isolate* isolate = thread->isolate(); |
if (exception.raw() != isolate->object_store()->out_of_memory() && |
exception.raw() != isolate->object_store()->stack_overflow()) { |
isolate->debugger()->SignalExceptionThrown(exception); |
} |
// Null object is a valid exception object. |
- ThrowExceptionHelper(isolate, exception, Stacktrace::Handle(isolate), false); |
+ ThrowExceptionHelper(thread, exception, Stacktrace::Handle(isolate), false); |
} |
- |
-void Exceptions::ReThrow(Isolate* isolate, |
+void Exceptions::ReThrow(Thread* thread, |
const Instance& exception, |
const Instance& stacktrace) { |
// Null object is a valid exception object. |
- ThrowExceptionHelper(isolate, exception, stacktrace, true); |
+ ThrowExceptionHelper(thread, exception, stacktrace, true); |
} |
void Exceptions::PropagateError(const Error& error) { |
- Isolate* isolate = Isolate::Current(); |
+ Thread* thread = Thread::Current(); |
+ Isolate* isolate = thread->isolate(); |
ASSERT(isolate->top_exit_frame_info() != 0); |
if (error.IsUnhandledException()) { |
// If the error object represents an unhandled exception, then |
@@ -504,7 +506,7 @@ void Exceptions::PropagateError(const Error& error) { |
const UnhandledException& uhe = UnhandledException::Cast(error); |
const Instance& exc = Instance::Handle(isolate, uhe.exception()); |
const Instance& stk = Instance::Handle(isolate, uhe.stacktrace()); |
- Exceptions::ReThrow(isolate, exc, stk); |
+ Exceptions::ReThrow(thread, exc, stk); |
} else { |
// Return to the invocation stub and return this error object. The |
// C++ code which invoked this dart sequence can check and do the |
@@ -513,7 +515,7 @@ void Exceptions::PropagateError(const Error& error) { |
uword handler_sp = 0; |
uword handler_fp = 0; |
FindErrorHandler(&handler_pc, &handler_sp, &handler_fp); |
- JumpToExceptionHandler(isolate, handler_pc, handler_sp, handler_fp, error, |
+ JumpToExceptionHandler(thread, handler_pc, handler_sp, handler_fp, error, |
Stacktrace::Handle(isolate)); // Null stacktrace. |
} |
UNREACHABLE(); |
@@ -521,7 +523,8 @@ void Exceptions::PropagateError(const Error& error) { |
void Exceptions::ThrowByType(ExceptionType type, const Array& arguments) { |
- Isolate* isolate = Isolate::Current(); |
+ Thread* thread = Thread::Current(); |
+ Isolate* isolate = thread->isolate(); |
const Object& result = Object::Handle(isolate, Create(type, arguments)); |
if (result.IsError()) { |
// We got an error while constructing the exception object. |
@@ -529,24 +532,26 @@ void Exceptions::ThrowByType(ExceptionType type, const Array& arguments) { |
PropagateError(Error::Cast(result)); |
} else { |
ASSERT(result.IsInstance()); |
- Throw(isolate, Instance::Cast(result)); |
+ Throw(thread, Instance::Cast(result)); |
} |
} |
void Exceptions::ThrowOOM() { |
- Isolate* isolate = Isolate::Current(); |
+ Thread* thread = Thread::Current(); |
+ Isolate* isolate = thread->isolate(); |
const Instance& oom = Instance::Handle( |
isolate, isolate->object_store()->out_of_memory()); |
- Throw(isolate, oom); |
+ Throw(thread, oom); |
} |
void Exceptions::ThrowStackOverflow() { |
- Isolate* isolate = Isolate::Current(); |
+ Thread* thread = Thread::Current(); |
+ Isolate* isolate = thread->isolate(); |
const Instance& stack_overflow = Instance::Handle( |
isolate, isolate->object_store()->stack_overflow()); |
- Throw(isolate, stack_overflow); |
+ Throw(thread, stack_overflow); |
} |