| Index: runtime/vm/exceptions.cc
|
| ===================================================================
|
| --- runtime/vm/exceptions.cc (revision 3821)
|
| +++ runtime/vm/exceptions.cc (working copy)
|
| @@ -46,24 +46,6 @@
|
| }
|
|
|
|
|
| -static void FindErrorHandler(uword* handler_pc,
|
| - uword* handler_sp,
|
| - uword* handler_fp) {
|
| - // TODO(turnidge): Is there a faster way to get the next entry frame?
|
| - StackFrameIterator frames(StackFrameIterator::kDontValidateFrames);
|
| - StackFrame* frame = frames.NextFrame();
|
| - ASSERT(frame != NULL);
|
| - while (!frame->IsEntryFrame()) {
|
| - frame = frames.NextFrame();
|
| - ASSERT(frame != NULL);
|
| - }
|
| - ASSERT(frame->IsEntryFrame());
|
| - *handler_pc = frame->pc();
|
| - *handler_sp = frame->sp();
|
| - *handler_fp = frame->fp();
|
| -}
|
| -
|
| -
|
| static void ThrowExceptionHelper(const Instance& exception,
|
| const Instance& existing_stacktrace) {
|
| uword handler_pc = 0;
|
| @@ -109,10 +91,10 @@
|
| // the isolate etc.).
|
| const UnhandledException& unhandled_exception = UnhandledException::Handle(
|
| UnhandledException::New(exception, stacktrace));
|
| - CPU::JumpToErrorHandler(handler_pc,
|
| - handler_sp,
|
| - handler_fp,
|
| - unhandled_exception);
|
| + CPU::JumpToUnhandledExceptionHandler(handler_pc,
|
| + handler_sp,
|
| + handler_fp,
|
| + unhandled_exception);
|
| }
|
| UNREACHABLE();
|
| }
|
| @@ -130,51 +112,14 @@
|
| }
|
|
|
|
|
| -void Exceptions::PropagateError(const Object& obj) {
|
| - ASSERT(Isolate::Current()->top_exit_frame_info() != 0);
|
| - Error& error = Error::Handle();
|
| - error ^= obj.raw();
|
| - if (error.IsUnhandledException()) {
|
| - // If the error object represents an unhandled exception, then
|
| - // rethrow the exception in the normal fashion.
|
| - UnhandledException& uhe = UnhandledException::Handle();
|
| - uhe ^= error.raw();
|
| - const Instance& exc = Instance::Handle(uhe.exception());
|
| - const Instance& stk = Instance::Handle(uhe.stacktrace());
|
| - Exceptions::ReThrow(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
|
| - // appropriate thing.
|
| - uword handler_pc = 0;
|
| - uword handler_sp = 0;
|
| - uword handler_fp = 0;
|
| - FindErrorHandler(&handler_pc, &handler_sp, &handler_fp);
|
| - CPU::JumpToErrorHandler(handler_pc, handler_sp, handler_fp, error);
|
| - }
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| void Exceptions::ThrowByType(
|
| ExceptionType type, const GrowableArray<const Object*>& arguments) {
|
| - const Object& result = Object::Handle(Create(type, arguments));
|
| - if (result.IsError()) {
|
| - // We got an error while constructing the exception object.
|
| - // Propagate the error instead of throwing the exception.
|
| - Error& error = Error::Handle();
|
| - error ^= result.raw();
|
| - PropagateError(error);
|
| - } else {
|
| - ASSERT(result.IsInstance());
|
| - Instance& exception = Instance::Handle();
|
| - exception ^= result.raw();
|
| - Throw(exception);
|
| - }
|
| + const Instance& exception = Instance::Handle(Create(type, arguments));
|
| + Throw(exception);
|
| }
|
|
|
|
|
| -RawObject* Exceptions::Create(
|
| +RawInstance* Exceptions::Create(
|
| ExceptionType type, const GrowableArray<const Object*>& arguments) {
|
| String& class_name = String::Handle();
|
| switch (type) {
|
|
|