| Index: runtime/vm/dart_api_impl.cc
|
| diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
|
| index 43d308eb52fae79ee2c5bb23c9905d7760d5a1c4..192a86616f27b485b8d954f6d0b0aef6211af6ba 100644
|
| --- a/runtime/vm/dart_api_impl.cc
|
| +++ b/runtime/vm/dart_api_impl.cc
|
| @@ -733,7 +733,7 @@ void FinalizablePersistentHandle::Finalize(
|
| // --- Handles ---
|
|
|
| DART_EXPORT bool Dart_IsError(Dart_Handle handle) {
|
| - return RawObject::IsErrorClassId(Api::ClassId(handle));
|
| + return Api::IsError(handle);
|
| }
|
|
|
|
|
| @@ -4410,6 +4410,10 @@ DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) {
|
| Isolate* isolate = thread->isolate();
|
| CHECK_ISOLATE(isolate);
|
| CHECK_CALLBACK_STATE(thread);
|
| + if (Api::IsError(exception)) {
|
| + Dart_PropagateError(exception);
|
| + }
|
| +
|
| {
|
| const Instance& excp = Api::UnwrapInstanceHandle(zone, exception);
|
| if (excp.IsNull()) {
|
| @@ -4833,15 +4837,17 @@ DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args,
|
| Dart_Handle retval) {
|
| NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
|
| ASSERT(arguments->thread()->isolate() == Isolate::Current());
|
| - if ((retval != Api::Null()) && (!Api::IsInstance(retval))) {
|
| + if ((retval != Api::Null()) &&
|
| + !Api::IsInstance(retval) &&
|
| + !Api::IsError(retval)) {
|
| // Print the current stack trace to make the problematic caller
|
| // easier to find.
|
| const Stacktrace& stacktrace = GetCurrentStacktrace(0);
|
| OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString());
|
|
|
| const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval));
|
| - FATAL1("Return value check failed: saw '%s' expected a dart Instance.",
|
| - ret_obj.ToCString());
|
| + FATAL1("Return value check failed: saw '%s' expected a dart Instance or "
|
| + "an Error.", ret_obj.ToCString());
|
| }
|
| ASSERT(retval != 0);
|
| Api::SetReturnValue(arguments, retval);
|
|
|