Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(537)

Unified Diff: runtime/vm/exceptions.cc

Issue 326183002: Pass around the current isolate in exception handling code. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/exceptions.h ('k') | runtime/vm/isolate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/exceptions.cc
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 50443a7813c19adbed8506a90ff4f9a757620469..6cefc5a20f6d5f777de046bf39c7e20d6a87ab73 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -163,7 +163,7 @@ void PreallocatedStacktraceBuilder::AddFrame(const Code& code,
}
-static void BuildStackTrace(StacktraceBuilder* builder) {
+static void BuildStackTrace(Isolate* isolate, StacktraceBuilder* builder) {
StackFrameIterator frames(StackFrameIterator::kDontValidateFrames);
StackFrame* frame = frames.NextFrame();
ASSERT(frame != NULL); // We expect to find a dart invocation frame.
@@ -181,7 +181,8 @@ static void BuildStackTrace(StacktraceBuilder* builder) {
bool is_catch_all = false;
uword handler_pc = kUwordMax;
if (!handler_pc_set &&
- frame->FindExceptionHandler(&handler_pc,
+ frame->FindExceptionHandler(isolate,
+ &handler_pc,
&needs_stacktrace,
&is_catch_all)) {
handler_pc_set = true;
@@ -210,7 +211,8 @@ static void BuildStackTrace(StacktraceBuilder* builder) {
// exception handler. Once found, set the pc, sp and fp so that execution
// can continue in that frame. Sets 'needs_stacktrace' if there is no
// cath-all handler or if a stack-trace is specified in the catch.
-static bool FindExceptionHandler(uword* handler_pc,
+static bool FindExceptionHandler(Isolate* isolate,
+ uword* handler_pc,
uword* handler_sp,
uword* handler_fp,
bool* needs_stacktrace) {
@@ -223,7 +225,8 @@ static bool FindExceptionHandler(uword* handler_pc,
uword temp_handler_pc = kUwordMax;
while (!frame->IsEntryFrame()) {
if (frame->IsDartFrame()) {
- if (frame->FindExceptionHandler(&temp_handler_pc,
+ if (frame->FindExceptionHandler(isolate,
+ &temp_handler_pc,
needs_stacktrace,
&is_catch_all)) {
if (!handler_pc_set) {
@@ -270,7 +273,8 @@ static void FindErrorHandler(uword* handler_pc,
}
-static void JumpToExceptionHandler(uword program_counter,
+static void JumpToExceptionHandler(Isolate* isolate,
+ uword program_counter,
uword stack_pointer,
uword frame_pointer,
const Object& exception_object,
@@ -280,7 +284,6 @@ static void JumpToExceptionHandler(uword program_counter,
NoGCScope no_gc;
RawObject* raw_exception = exception_object.raw();
RawObject* raw_stacktrace = stacktrace_object.raw();
- Isolate* isolate = Isolate::Current();
#if defined(USING_SIMULATOR)
// Unwinding of the C++ frames and destroying of their stack resources is done
@@ -356,7 +359,7 @@ static RawField* LookupStacktraceField(const Instance& instance) {
RawStacktrace* Exceptions::CurrentStacktrace() {
Isolate* isolate = Isolate::Current();
RegularStacktraceBuilder frame_builder(true);
- BuildStackTrace(&frame_builder);
+ BuildStackTrace(isolate, &frame_builder);
// Create arrays for code and pc_offset tuples of each frame.
const Array& full_code_array = Array::Handle(isolate,
@@ -375,10 +378,10 @@ RawStacktrace* Exceptions::CurrentStacktrace() {
}
-static void ThrowExceptionHelper(const Instance& incoming_exception,
+static void ThrowExceptionHelper(Isolate* isolate,
+ const Instance& incoming_exception,
const Instance& existing_stacktrace) {
bool use_preallocated_stacktrace = false;
- Isolate* isolate = Isolate::Current();
Instance& exception = Instance::Handle(isolate, incoming_exception.raw());
if (exception.IsNull()) {
exception ^= Exceptions::Create(Exceptions::kNullThrown,
@@ -396,18 +399,20 @@ static void ThrowExceptionHelper(const Instance& incoming_exception,
if (use_preallocated_stacktrace) {
stacktrace ^= isolate->object_store()->preallocated_stack_trace();
PreallocatedStacktraceBuilder frame_builder(stacktrace);
- handler_exists = FindExceptionHandler(&handler_pc,
+ handler_exists = FindExceptionHandler(isolate,
+ &handler_pc,
&handler_sp,
&handler_fp,
&handler_needs_stacktrace);
if (handler_needs_stacktrace) {
- BuildStackTrace(&frame_builder);
+ BuildStackTrace(isolate, &frame_builder);
}
} else {
// Get stacktrace field of class Error.
const Field& stacktrace_field =
Field::Handle(isolate, LookupStacktraceField(exception));
- handler_exists = FindExceptionHandler(&handler_pc,
+ handler_exists = FindExceptionHandler(isolate,
+ &handler_pc,
&handler_sp,
&handler_fp,
&handler_needs_stacktrace);
@@ -419,8 +424,8 @@ static void ThrowExceptionHelper(const Instance& incoming_exception,
if (!stacktrace_field.IsNull()) {
if (exception.GetField(stacktrace_field) == Object::null()) {
// This is an error object and we need to capture the full stack trace
- // here implicitly, so we set up the stack trace. The stack trace field
- // is set only once, it is not overriden.
+ // here implicitly, so we set up the stack trace. The stack trace
+ // field is set only once, it is not overriden.
const Stacktrace& full_stacktrace =
Stacktrace::Handle(isolate, Exceptions::CurrentStacktrace());
exception.SetField(stacktrace_field, full_stacktrace);
@@ -428,7 +433,7 @@ static void ThrowExceptionHelper(const Instance& incoming_exception,
}
if (handler_needs_stacktrace) {
RegularStacktraceBuilder frame_builder(false);
- BuildStackTrace(&frame_builder);
+ BuildStackTrace(isolate, &frame_builder);
// Create arrays for code and pc_offset tuples of each frame.
code_array = Array::MakeArray(frame_builder.code_list());
@@ -460,7 +465,8 @@ static void ThrowExceptionHelper(const Instance& incoming_exception,
}
if (handler_exists) {
// Found a dart handler for the exception, jump to it.
- JumpToExceptionHandler(handler_pc,
+ JumpToExceptionHandler(isolate,
+ handler_pc,
handler_sp,
handler_fp,
exception,
@@ -474,9 +480,10 @@ static void ThrowExceptionHelper(const Instance& incoming_exception,
// dart invocation sequence above it, print diagnostics and terminate
// the isolate etc.).
const UnhandledException& unhandled_exception = UnhandledException::Handle(
- UnhandledException::New(exception, stacktrace));
+ isolate, UnhandledException::New(exception, stacktrace));
stacktrace = Stacktrace::null();
- JumpToExceptionHandler(handler_pc,
+ JumpToExceptionHandler(isolate,
+ handler_pc,
handler_sp,
handler_fp,
unhandled_exception,
@@ -569,30 +576,31 @@ void Exceptions::CreateAndThrowTypeError(intptr_t location,
}
-void Exceptions::Throw(const Instance& exception) {
- Isolate* isolate = Isolate::Current();
+void Exceptions::Throw(Isolate* isolate, const Instance& exception) {
isolate->debugger()->SignalExceptionThrown(exception);
// Null object is a valid exception object.
- ThrowExceptionHelper(exception, Instance::Handle(isolate));
+ ThrowExceptionHelper(isolate, exception, Instance::Handle(isolate));
}
-void Exceptions::ReThrow(const Instance& exception,
+void Exceptions::ReThrow(Isolate* isolate,
+ const Instance& exception,
const Instance& stacktrace) {
// Null object is a valid exception object.
- ThrowExceptionHelper(exception, stacktrace);
+ ThrowExceptionHelper(isolate, exception, stacktrace);
}
void Exceptions::PropagateError(const Error& error) {
- ASSERT(Isolate::Current()->top_exit_frame_info() != 0);
+ Isolate* isolate = Isolate::Current();
+ ASSERT(isolate->top_exit_frame_info() != 0);
if (error.IsUnhandledException()) {
// If the error object represents an unhandled exception, then
// rethrow the exception in the normal fashion.
const UnhandledException& uhe = UnhandledException::Cast(error);
- const Instance& exc = Instance::Handle(uhe.exception());
- const Instance& stk = Instance::Handle(uhe.stacktrace());
- Exceptions::ReThrow(exc, stk);
+ const Instance& exc = Instance::Handle(isolate, uhe.exception());
+ const Instance& stk = Instance::Handle(isolate, uhe.stacktrace());
+ Exceptions::ReThrow(isolate, 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
@@ -601,22 +609,23 @@ void Exceptions::PropagateError(const Error& error) {
uword handler_sp = 0;
uword handler_fp = 0;
FindErrorHandler(&handler_pc, &handler_sp, &handler_fp);
- JumpToExceptionHandler(handler_pc, handler_sp, handler_fp, error,
- Stacktrace::Handle()); // Null stacktrace.
+ JumpToExceptionHandler(isolate, handler_pc, handler_sp, handler_fp, error,
+ Stacktrace::Handle(isolate)); // Null stacktrace.
}
UNREACHABLE();
}
void Exceptions::ThrowByType(ExceptionType type, const Array& arguments) {
- const Object& result = Object::Handle(Create(type, arguments));
+ Isolate* isolate = Isolate::Current();
+ const Object& result = Object::Handle(isolate, Create(type, arguments));
if (result.IsError()) {
// We got an error while constructing the exception object.
// Propagate the error instead of throwing the exception.
PropagateError(Error::Cast(result));
} else {
ASSERT(result.IsInstance());
- Throw(Instance::Cast(result));
+ Throw(isolate, Instance::Cast(result));
}
}
@@ -625,7 +634,7 @@ void Exceptions::ThrowOOM() {
Isolate* isolate = Isolate::Current();
const Instance& oom = Instance::Handle(
isolate, isolate->object_store()->out_of_memory());
- Throw(oom);
+ Throw(isolate, oom);
}
@@ -633,7 +642,7 @@ void Exceptions::ThrowStackOverflow() {
Isolate* isolate = Isolate::Current();
const Instance& stack_overflow = Instance::Handle(
isolate, isolate->object_store()->stack_overflow());
- Throw(stack_overflow);
+ Throw(isolate, stack_overflow);
}
« no previous file with comments | « runtime/vm/exceptions.h ('k') | runtime/vm/isolate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698