Index: runtime/vm/code_generator.cc |
=================================================================== |
--- runtime/vm/code_generator.cc (revision 2291) |
+++ runtime/vm/code_generator.cc (working copy) |
@@ -821,12 +821,31 @@ |
DEFINE_RUNTIME_ENTRY(StackOverflow, 0) { |
ASSERT(arguments.Count() == |
kStackOverflowRuntimeEntry.argument_count()); |
- // Use a preallocated stack overflow exception to avoid calling into |
- // dart code. |
- const Instance& exception = |
- Instance::Handle(isolate->object_store()->stack_overflow()); |
- Exceptions::Throw(exception); |
- UNREACHABLE(); |
+ uword stack_pos; |
+ stack_pos = (uword) &stack_pos; |
Ivan Posva
2011/12/14 23:59:50
Wrong style cast. How about:
uword stack_pos = rei
turnidge
2011/12/15 21:30:07
Done.
|
+ |
+ // If an interrupt happens at the same time as a stack overflow, we |
+ // process the stack overflow first. |
+ if (stack_pos < isolate->saved_stack_limit()) { |
+ // Use a preallocated stack overflow exception to avoid calling |
Ivan Posva
2011/12/14 23:59:50
"Use the preallocated"?
turnidge
2011/12/15 21:30:07
Done.
|
+ // into dart code. |
+ const Instance& exception = |
+ Instance::Handle(isolate->object_store()->stack_overflow()); |
+ Exceptions::Throw(exception); |
+ UNREACHABLE(); |
+ } |
+ |
+ uword interrupt_bits = isolate->GetAndClearInterrupts(); |
+ if (interrupt_bits & Isolate::kApiInterrupt) { |
+ Dart_IsolateInterruptCallback callback = isolate->InterruptCallback(); |
+ if (callback) { |
+ if ((*callback)()) { |
+ return; |
+ } else { |
+ UNIMPLEMENTED(); |
+ } |
+ } |
+ } |
} |