diff options
Diffstat (limited to 'continue.c')
-rw-r--r-- | continue.c | 44 |
1 files changed, 24 insertions, 20 deletions
@@ -84,6 +84,7 @@ long stack_size(start) to `setjump(new_continuation->jmpbuf)' in order to complete the capture of this continuation. */ +#ifndef __ia64__ CONTINUATION *make_root_continuation(stack_base) STACKITEM *stack_base; { @@ -111,12 +112,12 @@ CONTINUATION *make_continuation(parent_cont) CONTINUATION *parent_cont; { CONTINUATION *cont; -#ifdef CHEAP_CONTINUATIONS +# ifdef CHEAP_CONTINUATIONS cont = (CONTINUATION *)malloc(sizeof(CONTINUATION)); if (!cont) return 0; cont->length = 0; cont->stkbse = parent_cont->stkbse; -#else +# else long j; register STACKITEM *src, *dst; FLUSH_REGISTER_WINDOWS; @@ -126,17 +127,18 @@ CONTINUATION *make_continuation(parent_cont) cont->length = j; cont->stkbse = parent_cont->stkbse; src = cont->stkbse; -# ifdef STACK_GROWS_UP +# ifdef STACK_GROWS_UP src += parent_cont->length; -# else +# else src -= parent_cont->length + cont->length; -# endif/* ndef STACK_GROWS_UP */ +# endif/* ndef STACK_GROWS_UP */ dst = (STACKITEM *)(cont + 1); for (j = cont->length; 0 <= --j; ) *dst++ = *src++; -#endif /* ndef CHEAP_CONTINUATIONS */ +# endif /* ndef CHEAP_CONTINUATIONS */ cont->parent = parent_cont; return cont; } +#endif /* free_continuation() is trivial, but who knows what the future holds. */ @@ -177,40 +179,41 @@ void free_continuation(cont) /* SCM_GROWTH is how many `long's to grow the stack by when we need room. */ #define SCM_GROWTH 100 +#ifndef __ia64__ void dynthrow(a) long *a; { register CONTINUATION *cont = (CONTINUATION *)(a[0]); long val = a[1]; -#ifndef CHEAP_CONTINUATIONS +# ifndef CHEAP_CONTINUATIONS register long j; register STACKITEM *src, *dst = cont->stkbse; -# ifdef STACK_GROWS_UP -# ifndef hpux +# ifdef STACK_GROWS_UP +# ifndef hpux if (a[2] && (a - ((long *)a[3]) < SCM_GROWTH)) puts("grow_throw: check if long growth[]; being optimized out"); -# endif +# endif /* if (a[2]) fprintf(stderr, " ct = %ld, dist = %ld\n", a[2], (((long *)a[3]) - a)); */ if (PTR_GE(dst + (cont->length), (STACKITEM *)&a)) grow_throw(a); -# else -# ifndef hpux +# else +# ifndef hpux if (a[2] && (((long *)a[3]) - a < SCM_GROWTH)) puts("grow_throw: check if long growth[]; being optimized out"); -# endif +# endif /* if (a[2]) fprintf(stderr, " ct = %ld, dist = %ld\n", a[2], (((long *)a[3]) - a)); */ dst -= cont->length; if (PTR_LE(dst, (STACKITEM *)&a)) grow_throw(a); -# endif/* def STACK_GROWS_UP */ +# endif/* def STACK_GROWS_UP */ FLUSH_REGISTER_WINDOWS; src = (STACKITEM *)(cont + 1); for (j = cont->length;0 <= --j;) *dst++ = *src++; -#endif /* ndef CHEAP_CONTINUATIONS */ -#ifdef SHORT_INT +# endif /* ndef CHEAP_CONTINUATIONS */ +# ifdef SHORT_INT thrown_value = val; longjump(cont->jmpbuf, 1); -#else +# else longjump(cont->jmpbuf, val); -#endif +# endif } /* grow_throw() grows the stack by SCM_GROWTH long words. If the @@ -221,7 +224,7 @@ void dynthrow(a) so the compiler won't be able to guess that the growth array isn't all used. */ -#ifndef CHEAP_CONTINUATIONS +# ifndef CHEAP_CONTINUATIONS void grow_throw(a) /* Grow the stack so that there is room */ long *a; /* to copy in the continuation. Then */ { /* retry the throw. */ @@ -233,7 +236,8 @@ void grow_throw(a) /* Grow the stack so that there is room */ growth[SCM_GROWTH-1] = sizeof growth; dynthrow(growth); } -#endif /* ndef CHEAP_CONTINUATIONS */ +# endif /* ndef CHEAP_CONTINUATIONS */ +#endif /* throw_to_continuation() restores the stack in effect when @var{cont} was made and resumes @var{cont}'s processor state. If |