| 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) {
 | 
| 
 |