--- gforth/Attic/engine.c 1994/07/07 14:59:21 1.9 +++ gforth/Attic/engine.c 1994/07/08 15:00:35 1.10 @@ -1,5 +1,5 @@ /* - $Id: engine.c,v 1.9 1994/07/07 14:59:21 pazsan Exp $ + $Id: engine.c,v 1.10 1994/07/08 15:00:35 anton Exp $ Copyright 1992 by the ANSI figForth Development Group */ @@ -96,6 +96,7 @@ Label *engine(Xt *ip, Cell *sp, Cell *rp &&dodoes, /* dummy for does handler address */ #include "prim_labels.i" }; + int throw_code; IF_TOS(register Cell TOS;) IF_FTOS(Float FTOS;) #ifdef CPU_DEP @@ -105,6 +106,19 @@ Label *engine(Xt *ip, Cell *sp, Cell *rp if (ip == NULL) return symbols; + if ((throw_code=setjmp(throw_jmp_buf))) { + static Cell signal_data_stack[8]; + + /* AFAIK, it's not guarateed that the registers have the right value + after a longjump, so we avoid using the current values. + If it were guaranteed that the registers keep their values, we could + call a signal handler in Forth instead of doing the throw from C */ + sp = &signal_data_stack[7]; + TOS = throw_code; + ip = throw_ip; + NEXT; + } + IF_TOS(TOS = sp[0]); IF_FTOS(FTOS = fp[0]); prep_terminal();