| Index: runtime/vm/dart_api_impl.cc
|
| diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
|
| index ef99695a4e31dfa328a75b49db5f2b66df15b2d8..2be5c0eab98af2b6b77ff44dffe8ca2c061ec499 100644
|
| --- a/runtime/vm/dart_api_impl.cc
|
| +++ b/runtime/vm/dart_api_impl.cc
|
| @@ -200,7 +200,7 @@ Dart_Handle Api::NewError(const char* format, ...) {
|
| intptr_t len = OS::VSNPrint(NULL, 0, format, args);
|
| va_end(args);
|
|
|
| - char* buffer = zone.Alloc<char>(len + 1);
|
| + char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
|
| va_list args2;
|
| va_start(args2, format);
|
| OS::VSNPrint(buffer, (len + 1), format, args2);
|
| @@ -410,7 +410,7 @@ DART_EXPORT Dart_Handle Dart_Error(const char* format, ...) {
|
| intptr_t len = OS::VSNPrint(NULL, 0, format, args);
|
| va_end(args);
|
|
|
| - char* buffer = zone.Alloc<char>(len + 1);
|
| + char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
|
| va_list args2;
|
| va_start(args2, format);
|
| OS::VSNPrint(buffer, (len + 1), format, args2);
|
| @@ -432,7 +432,7 @@ DART_EXPORT Dart_Handle Dart_NewApiError(const char* format, ...) {
|
| intptr_t len = OS::VSNPrint(NULL, 0, format, args);
|
| va_end(args);
|
|
|
| - char* buffer = zone.Alloc<char>(len + 1);
|
| + char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
|
| va_list args2;
|
| va_start(args2, format);
|
| OS::VSNPrint(buffer, (len + 1), format, args2);
|
| @@ -457,7 +457,6 @@ DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) {
|
|
|
| DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) {
|
| Isolate* isolate = Isolate::Current();
|
| - CHECK_ISOLATE(isolate);
|
| const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
|
| if (!obj.IsError()) {
|
| return Api::NewError(
|
| @@ -474,10 +473,19 @@ DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) {
|
| // Unwind all the API scopes till the exit frame before propagating.
|
| ApiState* state = isolate->api_state();
|
| ASSERT(state != NULL);
|
| - state->UnwindScopes(isolate->top_exit_frame_info());
|
| - Exceptions::PropagateError(Error::Cast(obj));
|
| + const Error* error;
|
| + {
|
| + // We need to preserve the error object across the destruction of zones
|
| + // when the ApiScopes are unwound. By using NoGCScope, we can ensure
|
| + // that GC won't touch the raw error object before creating a valid
|
| + // handle for it in the surviving zone.
|
| + NoGCScope no_gc;
|
| + RawError* raw_error = static_cast<RawError*>(Api::UnwrapHandle(handle));
|
| + state->UnwindScopes(isolate->top_exit_frame_info());
|
| + error = &Error::Handle(isolate, raw_error);
|
| + }
|
| + Exceptions::PropagateError(*error);
|
| UNREACHABLE();
|
| -
|
| return Api::NewError("Cannot reach here. Internal error.");
|
| }
|
|
|
| @@ -1142,7 +1150,7 @@ DART_EXPORT void Dart_ExitScope() {
|
|
|
|
|
| DART_EXPORT uint8_t* Dart_ScopeAllocate(intptr_t size) {
|
| - ApiZone* zone;
|
| + Zone* zone;
|
| Isolate* isolate = Isolate::Current();
|
| if (isolate != NULL) {
|
| ApiState* state = isolate->api_state();
|
| @@ -3897,10 +3905,12 @@ DART_EXPORT Dart_Handle Dart_SetNativeInstanceField(Dart_Handle obj,
|
|
|
| DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) {
|
| Isolate* isolate = Isolate::Current();
|
| - DARTSCOPE(isolate);
|
| - const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
|
| - if (excp.IsNull()) {
|
| - RETURN_TYPE_ERROR(isolate, exception, Instance);
|
| + CHECK_ISOLATE(isolate);
|
| + {
|
| + const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
|
| + if (excp.IsNull()) {
|
| + RETURN_TYPE_ERROR(isolate, exception, Instance);
|
| + }
|
| }
|
| if (isolate->top_exit_frame_info() == 0) {
|
| // There are no dart frames on the stack so it would be illegal to
|
| @@ -3911,8 +3921,15 @@ DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) {
|
| // exception.
|
| ApiState* state = isolate->api_state();
|
| ASSERT(state != NULL);
|
| - state->UnwindScopes(isolate->top_exit_frame_info());
|
| - Exceptions::Throw(excp);
|
| + const Instance* saved_exception;
|
| + {
|
| + NoGCScope no_gc;
|
| + RawInstance* raw_exception =
|
| + static_cast<RawInstance*>(Api::UnwrapHandle(exception));
|
| + state->UnwindScopes(isolate->top_exit_frame_info());
|
| + saved_exception = &Instance::Handle(raw_exception);
|
| + }
|
| + Exceptions::Throw(*saved_exception);
|
| return Api::NewError("Exception was not thrown, internal error");
|
| }
|
|
|
| @@ -3921,14 +3938,15 @@ DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception,
|
| Dart_Handle stacktrace) {
|
| Isolate* isolate = Isolate::Current();
|
| CHECK_ISOLATE(isolate);
|
| - DARTSCOPE(isolate);
|
| - const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
|
| - if (excp.IsNull()) {
|
| - RETURN_TYPE_ERROR(isolate, exception, Instance);
|
| - }
|
| - const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace);
|
| - if (stk.IsNull()) {
|
| - RETURN_TYPE_ERROR(isolate, stacktrace, Instance);
|
| + {
|
| + const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
|
| + if (excp.IsNull()) {
|
| + RETURN_TYPE_ERROR(isolate, exception, Instance);
|
| + }
|
| + const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace);
|
| + if (stk.IsNull()) {
|
| + RETURN_TYPE_ERROR(isolate, stacktrace, Instance);
|
| + }
|
| }
|
| if (isolate->top_exit_frame_info() == 0) {
|
| // There are no dart frames on the stack so it would be illegal to
|
| @@ -3939,8 +3957,19 @@ DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception,
|
| // exception.
|
| ApiState* state = isolate->api_state();
|
| ASSERT(state != NULL);
|
| - state->UnwindScopes(isolate->top_exit_frame_info());
|
| - Exceptions::ReThrow(excp, stk);
|
| + const Instance* saved_exception;
|
| + const Instance* saved_stacktrace;
|
| + {
|
| + NoGCScope no_gc;
|
| + RawInstance* raw_exception =
|
| + static_cast<RawInstance*>(Api::UnwrapHandle(exception));
|
| + RawInstance* raw_stacktrace =
|
| + static_cast<RawInstance*>(Api::UnwrapHandle(stacktrace));
|
| + state->UnwindScopes(isolate->top_exit_frame_info());
|
| + saved_exception = &Instance::Handle(raw_exception);
|
| + saved_stacktrace = &Instance::Handle(raw_stacktrace);
|
| + }
|
| + Exceptions::ReThrow(*saved_exception, *saved_stacktrace);
|
| return Api::NewError("Exception was not re thrown, internal error");
|
| }
|
|
|
| @@ -4423,7 +4452,7 @@ DART_EXPORT void Dart_GetPprofSymbolInfo(void** buffer, int* buffer_size) {
|
| pprof_symbol_generator->WriteToMemory(debug_region);
|
| *buffer_size = debug_region->size();
|
| if (*buffer_size != 0) {
|
| - ApiZone* zone = Api::TopScope(isolate)->zone();
|
| + Zone* zone = Api::TopScope(isolate)->zone();
|
| *buffer = reinterpret_cast<void*>(zone->AllocUnsafe(*buffer_size));
|
| memmove(*buffer, debug_region->data(), *buffer_size);
|
| } else {
|
|
|