OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 "vm/exceptions.h" | 5 #include "vm/exceptions.h" |
6 | 6 |
7 #include "platform/address_sanitizer.h" | 7 #include "platform/address_sanitizer.h" |
8 | 8 |
9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
11 #include "vm/debugger.h" | 11 #include "vm/debugger.h" |
12 #include "vm/flags.h" | 12 #include "vm/flags.h" |
13 #include "vm/log.h" | 13 #include "vm/log.h" |
| 14 #include "vm/longjump.h" |
14 #include "vm/object.h" | 15 #include "vm/object.h" |
15 #include "vm/object_store.h" | 16 #include "vm/object_store.h" |
16 #include "vm/stack_frame.h" | 17 #include "vm/stack_frame.h" |
17 #include "vm/stub_code.h" | 18 #include "vm/stub_code.h" |
18 #include "vm/symbols.h" | 19 #include "vm/symbols.h" |
19 #include "vm/tags.h" | 20 #include "vm/tags.h" |
20 | 21 |
21 namespace dart { | 22 namespace dart { |
22 | 23 |
23 DEFINE_FLAG(bool, print_stacktrace_at_throw, false, | 24 DEFINE_FLAG(bool, print_stacktrace_at_throw, false, |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 // exception handler. Once found, set the pc, sp and fp so that execution | 140 // exception handler. Once found, set the pc, sp and fp so that execution |
140 // can continue in that frame. Sets 'needs_stacktrace' if there is no | 141 // can continue in that frame. Sets 'needs_stacktrace' if there is no |
141 // cath-all handler or if a stack-trace is specified in the catch. | 142 // cath-all handler or if a stack-trace is specified in the catch. |
142 static bool FindExceptionHandler(Thread* thread, | 143 static bool FindExceptionHandler(Thread* thread, |
143 uword* handler_pc, | 144 uword* handler_pc, |
144 uword* handler_sp, | 145 uword* handler_sp, |
145 uword* handler_fp, | 146 uword* handler_fp, |
146 bool* needs_stacktrace) { | 147 bool* needs_stacktrace) { |
147 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames); | 148 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames); |
148 StackFrame* frame = frames.NextFrame(); | 149 StackFrame* frame = frames.NextFrame(); |
149 ASSERT(frame != NULL); // We expect to find a dart invocation frame. | 150 if (frame == NULL) return false; // No Dart frame. |
150 bool handler_pc_set = false; | 151 bool handler_pc_set = false; |
151 *needs_stacktrace = false; | 152 *needs_stacktrace = false; |
152 bool is_catch_all = false; | 153 bool is_catch_all = false; |
153 uword temp_handler_pc = kUwordMax; | 154 uword temp_handler_pc = kUwordMax; |
154 while (!frame->IsEntryFrame()) { | 155 while (!frame->IsEntryFrame()) { |
155 if (frame->IsDartFrame()) { | 156 if (frame->IsDartFrame()) { |
156 if (frame->FindExceptionHandler(thread, | 157 if (frame->FindExceptionHandler(thread, |
157 &temp_handler_pc, | 158 &temp_handler_pc, |
158 needs_stacktrace, | 159 needs_stacktrace, |
159 &is_catch_all)) { | 160 &is_catch_all)) { |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 bool handler_exists = false; | 321 bool handler_exists = false; |
321 bool handler_needs_stacktrace = false; | 322 bool handler_needs_stacktrace = false; |
322 if (use_preallocated_stacktrace) { | 323 if (use_preallocated_stacktrace) { |
323 stacktrace ^= isolate->object_store()->preallocated_stack_trace(); | 324 stacktrace ^= isolate->object_store()->preallocated_stack_trace(); |
324 PreallocatedStacktraceBuilder frame_builder(stacktrace); | 325 PreallocatedStacktraceBuilder frame_builder(stacktrace); |
325 handler_exists = FindExceptionHandler(thread, | 326 handler_exists = FindExceptionHandler(thread, |
326 &handler_pc, | 327 &handler_pc, |
327 &handler_sp, | 328 &handler_sp, |
328 &handler_fp, | 329 &handler_fp, |
329 &handler_needs_stacktrace); | 330 &handler_needs_stacktrace); |
| 331 if (handler_pc == 0) { |
| 332 // No Dart frame. |
| 333 ASSERT(!thread->IsMutatorThread()); |
| 334 ASSERT(incoming_exception.raw() == |
| 335 isolate->object_store()->out_of_memory()); |
| 336 const UnhandledException& error = UnhandledException::Handle( |
| 337 zone, isolate->object_store()->preallocated_unhandled_exception()); |
| 338 thread->long_jump_base()->Jump(1, error); |
| 339 UNREACHABLE(); |
| 340 } |
330 if (handler_needs_stacktrace) { | 341 if (handler_needs_stacktrace) { |
331 BuildStackTrace(&frame_builder); | 342 BuildStackTrace(&frame_builder); |
332 } | 343 } |
333 } else { | 344 } else { |
334 // Get stacktrace field of class Error. This is needed to determine whether | 345 // Get stacktrace field of class Error. This is needed to determine whether |
335 // we have a subclass of Error which carries around its stack trace. | 346 // we have a subclass of Error which carries around its stack trace. |
336 const Field& stacktrace_field = | 347 const Field& stacktrace_field = |
337 Field::Handle(zone, LookupStacktraceField(exception)); | 348 Field::Handle(zone, LookupStacktraceField(exception)); |
338 | 349 |
339 // Find the exception handler and determine if the handler needs a | 350 // Find the exception handler and determine if the handler needs a |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 } | 727 } |
717 | 728 |
718 return DartLibraryCalls::InstanceCreate(library, | 729 return DartLibraryCalls::InstanceCreate(library, |
719 *class_name, | 730 *class_name, |
720 *constructor_name, | 731 *constructor_name, |
721 arguments); | 732 arguments); |
722 } | 733 } |
723 | 734 |
724 | 735 |
725 } // namespace dart | 736 } // namespace dart |
OLD | NEW |