| Index: runtime/vm/code_generator.cc
|
| ===================================================================
|
| --- runtime/vm/code_generator.cc (revision 2528)
|
| +++ runtime/vm/code_generator.cc (working copy)
|
| @@ -872,12 +872,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 = reinterpret_cast<uword>(&arguments);
|
| +
|
| + // 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 the 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 interrupt_bits = isolate->GetAndClearInterrupts();
|
| + if (interrupt_bits & Isolate::kApiInterrupt) {
|
| + Dart_IsolateInterruptCallback callback = isolate->InterruptCallback();
|
| + if (callback) {
|
| + if ((*callback)()) {
|
| + return;
|
| + } else {
|
| + // TODO(turnidge): Unwind the stack.
|
| + UNIMPLEMENTED();
|
| + }
|
| + }
|
| + }
|
| }
|
|
|
|
|
|
|