bool VM::check_interrupts(CallFrame* call_frame, void* end) { // First, we might be here because someone reset the stack_limit_ so that // we'd fall into here to check interrupts even if the stack is fine, // // So fix up the stack_limit_ if thats the case first. // If this is true, stack_limit_ was just changed to get our attention, reset // it now. if(stack_limit_ == stack_start_) { reset_stack_limit(); } else { if(!check_stack(call_frame, end)) return false; } if(unlikely(check_local_interrupts)) { if(!process_async(call_frame)) return false; } // If the current thread is trying to step, debugger wise, then assist! if(thread_step()) { clear_thread_step(); if(!Helpers::yield_debugger(this, call_frame, Qnil)) return false; } return true; }
bool VM::check_thread_raise_or_kill(STATE) { Exception* exc = interrupted_exception(); if(!exc->nil_p()) { clear_interrupted_exception(); // Only write the locations if there are none. if(exc->locations()->nil_p() || exc->locations()->size() == 0) { exc->locations(this, Location::from_call_stack(state)); } thread_state_.raise_exception(exc); return true; } if(interrupt_by_kill()) { Fiber* fib = current_fiber.get(); if(fib->nil_p() || fib->root_p()) { clear_interrupt_by_kill(); } else { set_check_local_interrupts(); } thread_state_.raise_thread_kill(); return true; } // If the current thread is trying to step, debugger wise, then assist! if(thread_step()) { clear_thread_step(); if(!Helpers::yield_debugger(state, cNil)) return true; } return false; }