--- scrt/callcc.c.orig Wed Feb 24 08:25:41 1993 +++ scrt/callcc.c Wed Feb 2 22:22:22 2000 @@ -91,6 +91,11 @@ #define SETJMP( x ) sc_setjmp( x ) #endif +#ifdef FREEBSD +#define LONGJMP( x, y ) longjmp( x, y ) +#define SETJMP( x ) setjmp( x ) +#endif + TSCP sc_clink; /* Pointer to inner most continuation on stack. */ /* Static declarations for data structures internal to the module. These @@ -192,6 +197,17 @@ STACKPTR( tos ); count = (((STACK_BYTES (bfp, tos)) + ((sizeof (S2CINT)) - 1)) / (sizeof (S2CINT))); +#ifdef LAZY_STACK_POP + /* NOTE WELL! + * For machines that must pop arguments after a function call, + * the compiler may let arguments accumulate on the stack for several + * function calls and pop them all at once. + * If your compiler uses this optimization, 'count' must be incremented + * by the number of S2CINTs pushed as arguments between this point and + * the point where 'bcount' is computed. + */ + count += LAZY_STACK_INCREMENT; +#endif save_fp = (S2CINT*)bfp; cp = sc_allocateheap( NULLCONTINUATIONSIZE+count+2+sc_maxdisplay, CONTINUATIONTAG, @@ -199,6 +215,13 @@ STACKPTR( tos ); fp = save_fp; bcount = (STACK_BYTES (fp, tos)); + if (bcount > count*sizeof(S2CINT)) + /* If you get this error, look above at LAZY_STACK_POP */ + sc_error( "CALL-WITH-CURRENT-CONTINUATION", + "internal error: want to write ~s bytes of stack, " + "but only ~s bytes allocated.", + LIST2( C_FIXED( bcount ), + C_FIXED( count*sizeof(S2CINT) ) ) ); cp->continuation.continuation = sc_clink; cp->continuation.stackbytes = bcount; cp->continuation.stacktrace = sc_stacktrace;