version 1.247, 2012/03/23 21:48:06
|
version 1.248, 2012/03/23 22:21:51
|
Line 727 int gforth_go(void *image, int stack, Ce
|
Line 727 int gforth_go(void *image, int stack, Ce
|
|
|
#if defined(SYSSIGNALS) && !defined(STANDALONE) |
#if defined(SYSSIGNALS) && !defined(STANDALONE) |
get_winsize(); |
get_winsize(); |
|
|
install_signal_handlers(); /* right place? */ |
do { |
|
install_signal_handlers(); /* right place? */ |
throw_jmp_handler = &throw_jmp_buf; |
|
|
throw_jmp_handler = &throw_jmp_buf; |
debugp(stderr, "setjmp(%p)\n", *throw_jmp_handler); |
|
while((throw_code=setjmp(*throw_jmp_handler))) { |
debugp(stderr, "setjmp(%p)\n", *throw_jmp_handler); |
signal_data_stack[15]=throw_code; |
if((throw_code=setjmp(*throw_jmp_handler))) { |
|
signal_data_stack[15]=throw_code; |
|
|
#ifdef GFORTH_DEBUGGING |
#ifdef GFORTH_DEBUGGING |
debugp(stderr,"\ncaught signal, throwing exception %d, ip=%p rp=%p\n", |
debugp(stderr,"\ncaught signal, throwing exception %d, ip=%p rp=%p\n", |
throw_code, saved_ip, rp); |
throw_code, saved_ip, rp); |
if (rp <= orig_rp0 && rp > (Cell *)(image_header->return_stack_base+5)) { |
if (rp <= orig_rp0 && rp > (Cell *)(image_header->return_stack_base+5)) { |
/* no rstack overflow or underflow */ |
/* no rstack overflow or underflow */ |
rp0 = rp; |
rp0 = rp; |
*--rp0 = (Cell)saved_ip; |
*--rp0 = (Cell)saved_ip; |
} |
} |
else /* I love non-syntactic ifdefs :-) */ |
else /* I love non-syntactic ifdefs :-) */ |
rp0 = signal_return_stack+16; |
rp0 = signal_return_stack+16; |
#else /* !defined(GFORTH_DEBUGGING) */ |
#else /* !defined(GFORTH_DEBUGGING) */ |
debugp(stderr,"\ncaught signal, throwing exception %d\n", throw_code); |
debugp(stderr,"\ncaught signal, throwing exception %d\n", throw_code); |
rp0 = signal_return_stack+16; |
rp0 = signal_return_stack+16; |
#endif /* !defined(GFORTH_DEBUGGING) */ |
#endif /* !defined(GFORTH_DEBUGGING) */ |
/* fprintf(stderr, "rp=$%x\n",rp0);*/ |
/* fprintf(stderr, "rp=$%x\n",rp0);*/ |
|
|
ip0=image_header->throw_entry; |
ip0=image_header->throw_entry; |
sp0=signal_data_stack+15; |
sp0=signal_data_stack+15; |
fp0=signal_fp_stack; |
fp0=signal_fp_stack; |
} |
} |
|
} while(throw_code); |
#endif |
#endif |
|
|
return((int)(Cell)gforth_engine(ip0,sp0,rp0,fp0,lp0 sr_call)); |
return((int)(Cell)gforth_engine(ip0,sp0,rp0,fp0,lp0 sr_call)); |