OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 #include "include/dart_mirrors_api.h" | 6 #include "include/dart_mirrors_api.h" |
7 #include "include/dart_native_api.h" | 7 #include "include/dart_native_api.h" |
8 | 8 |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "lib/stacktrace.h" | 10 #include "lib/stacktrace.h" |
(...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 const UnhandledException& error = UnhandledException::Cast(obj); | 819 const UnhandledException& error = UnhandledException::Cast(obj); |
820 return Api::NewHandle(T, error.exception()); | 820 return Api::NewHandle(T, error.exception()); |
821 } else if (obj.IsError()) { | 821 } else if (obj.IsError()) { |
822 return Api::NewError("This error is not an unhandled exception error."); | 822 return Api::NewError("This error is not an unhandled exception error."); |
823 } else { | 823 } else { |
824 return Api::NewError("Can only get exceptions from error handles."); | 824 return Api::NewError("Can only get exceptions from error handles."); |
825 } | 825 } |
826 } | 826 } |
827 | 827 |
828 | 828 |
829 DART_EXPORT Dart_Handle Dart_ErrorGetStacktrace(Dart_Handle handle) { | 829 DART_EXPORT Dart_Handle Dart_ErrorGetStackTrace(Dart_Handle handle) { |
830 DARTSCOPE(Thread::Current()); | 830 DARTSCOPE(Thread::Current()); |
831 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); | 831 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); |
832 if (obj.IsUnhandledException()) { | 832 if (obj.IsUnhandledException()) { |
833 const UnhandledException& error = UnhandledException::Cast(obj); | 833 const UnhandledException& error = UnhandledException::Cast(obj); |
834 return Api::NewHandle(T, error.stacktrace()); | 834 return Api::NewHandle(T, error.stacktrace()); |
835 } else if (obj.IsError()) { | 835 } else if (obj.IsError()) { |
836 return Api::NewError("This error is not an unhandled exception error."); | 836 return Api::NewError("This error is not an unhandled exception error."); |
837 } else { | 837 } else { |
838 return Api::NewError("Can only get stacktraces from error handles."); | 838 return Api::NewError("Can only get stacktraces from error handles."); |
839 } | 839 } |
(...skipping 19 matching lines...) Expand all Loading... |
859 intptr_t class_id = Api::ClassId(exception); | 859 intptr_t class_id = Api::ClassId(exception); |
860 if ((class_id == kApiErrorCid) || (class_id == kLanguageErrorCid)) { | 860 if ((class_id == kApiErrorCid) || (class_id == kLanguageErrorCid)) { |
861 const Object& excp = Object::Handle(Z, Api::UnwrapHandle(exception)); | 861 const Object& excp = Object::Handle(Z, Api::UnwrapHandle(exception)); |
862 obj = String::New(GetErrorString(T, excp)); | 862 obj = String::New(GetErrorString(T, excp)); |
863 } else { | 863 } else { |
864 obj = Api::UnwrapInstanceHandle(Z, exception).raw(); | 864 obj = Api::UnwrapInstanceHandle(Z, exception).raw(); |
865 if (obj.IsNull()) { | 865 if (obj.IsNull()) { |
866 RETURN_TYPE_ERROR(Z, exception, Instance); | 866 RETURN_TYPE_ERROR(Z, exception, Instance); |
867 } | 867 } |
868 } | 868 } |
869 const Stacktrace& stacktrace = Stacktrace::Handle(Z); | 869 const StackTrace& stacktrace = StackTrace::Handle(Z); |
870 return Api::NewHandle(T, UnhandledException::New(obj, stacktrace)); | 870 return Api::NewHandle(T, UnhandledException::New(obj, stacktrace)); |
871 } | 871 } |
872 | 872 |
873 | 873 |
874 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) { | 874 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) { |
875 Thread* thread = Thread::Current(); | 875 Thread* thread = Thread::Current(); |
876 TransitionNativeToVM transition(thread); | 876 TransitionNativeToVM transition(thread); |
877 const Object& obj = Object::Handle(thread->zone(), Api::UnwrapHandle(handle)); | 877 const Object& obj = Object::Handle(thread->zone(), Api::UnwrapHandle(handle)); |
878 if (!obj.IsError()) { | 878 if (!obj.IsError()) { |
879 return Api::NewError( | 879 return Api::NewError( |
(...skipping 3771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4651 } | 4651 } |
4652 } | 4652 } |
4653 if (thread->top_exit_frame_info() == 0) { | 4653 if (thread->top_exit_frame_info() == 0) { |
4654 // There are no dart frames on the stack so it would be illegal to | 4654 // There are no dart frames on the stack so it would be illegal to |
4655 // throw an exception here. | 4655 // throw an exception here. |
4656 return Api::NewError("No Dart frames on stack, cannot throw exception"); | 4656 return Api::NewError("No Dart frames on stack, cannot throw exception"); |
4657 } | 4657 } |
4658 // Unwind all the API scopes till the exit frame before throwing an | 4658 // Unwind all the API scopes till the exit frame before throwing an |
4659 // exception. | 4659 // exception. |
4660 const Instance* saved_exception; | 4660 const Instance* saved_exception; |
4661 const Stacktrace* saved_stacktrace; | 4661 const StackTrace* saved_stacktrace; |
4662 { | 4662 { |
4663 NoSafepointScope no_safepoint; | 4663 NoSafepointScope no_safepoint; |
4664 RawInstance* raw_exception = | 4664 RawInstance* raw_exception = |
4665 Api::UnwrapInstanceHandle(zone, exception).raw(); | 4665 Api::UnwrapInstanceHandle(zone, exception).raw(); |
4666 RawStacktrace* raw_stacktrace = | 4666 RawStackTrace* raw_stacktrace = |
4667 Api::UnwrapStacktraceHandle(zone, stacktrace).raw(); | 4667 Api::UnwrapStackTraceHandle(zone, stacktrace).raw(); |
4668 thread->UnwindScopes(thread->top_exit_frame_info()); | 4668 thread->UnwindScopes(thread->top_exit_frame_info()); |
4669 saved_exception = &Instance::Handle(raw_exception); | 4669 saved_exception = &Instance::Handle(raw_exception); |
4670 saved_stacktrace = &Stacktrace::Handle(raw_stacktrace); | 4670 saved_stacktrace = &StackTrace::Handle(raw_stacktrace); |
4671 } | 4671 } |
4672 Exceptions::ReThrow(thread, *saved_exception, *saved_stacktrace); | 4672 Exceptions::ReThrow(thread, *saved_exception, *saved_stacktrace); |
4673 return Api::NewError("Exception was not re thrown, internal error"); | 4673 return Api::NewError("Exception was not re thrown, internal error"); |
4674 } | 4674 } |
4675 | 4675 |
4676 | 4676 |
4677 // --- Native fields and functions --- | 4677 // --- Native fields and functions --- |
4678 | 4678 |
4679 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, | 4679 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, |
4680 Dart_Handle name, | 4680 Dart_Handle name, |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5022 | 5022 |
5023 | 5023 |
5024 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, | 5024 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, |
5025 Dart_Handle retval) { | 5025 Dart_Handle retval) { |
5026 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 5026 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
5027 ASSERT(arguments->thread()->isolate() == Isolate::Current()); | 5027 ASSERT(arguments->thread()->isolate() == Isolate::Current()); |
5028 if ((retval != Api::Null()) && !Api::IsInstance(retval) && | 5028 if ((retval != Api::Null()) && !Api::IsInstance(retval) && |
5029 !Api::IsError(retval)) { | 5029 !Api::IsError(retval)) { |
5030 // Print the current stack trace to make the problematic caller | 5030 // Print the current stack trace to make the problematic caller |
5031 // easier to find. | 5031 // easier to find. |
5032 const Stacktrace& stacktrace = GetCurrentStacktrace(0); | 5032 const StackTrace& stacktrace = GetCurrentStackTrace(0); |
5033 OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString()); | 5033 OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString()); |
5034 | 5034 |
5035 const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval)); | 5035 const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval)); |
5036 FATAL1( | 5036 FATAL1( |
5037 "Return value check failed: saw '%s' expected a dart Instance or " | 5037 "Return value check failed: saw '%s' expected a dart Instance or " |
5038 "an Error.", | 5038 "an Error.", |
5039 ret_obj.ToCString()); | 5039 ret_obj.ToCString()); |
5040 } | 5040 } |
5041 ASSERT(retval != 0); | 5041 ASSERT(retval != 0); |
5042 Api::SetReturnValue(arguments, retval); | 5042 Api::SetReturnValue(arguments, retval); |
(...skipping 1668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6711 } | 6711 } |
6712 | 6712 |
6713 | 6713 |
6714 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { | 6714 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { |
6715 #ifndef PRODUCT | 6715 #ifndef PRODUCT |
6716 Profiler::DumpStackTrace(context); | 6716 Profiler::DumpStackTrace(context); |
6717 #endif | 6717 #endif |
6718 } | 6718 } |
6719 | 6719 |
6720 } // namespace dart | 6720 } // namespace dart |
OLD | NEW |