X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/997eda2a30ff9235687cde508148d6456e982813..81b80b9610798ea910daad78cf525dec211639f9:/libguile/continuations.h diff --git a/libguile/continuations.h b/libguile/continuations.h index e5fd91f2e..e0a455632 100644 --- a/libguile/continuations.h +++ b/libguile/continuations.h @@ -3,21 +3,22 @@ #ifndef SCM_CONTINUATIONS_H #define SCM_CONTINUATIONS_H -/* Copyright (C) 1995,1996,2000,2001, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,2000,2001, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA */ @@ -30,6 +31,9 @@ #endif /* __ia64__ */ +#define SCM_CONTINUATIONP(x) \ + (SCM_PROGRAM_P (x) && SCM_PROGRAM_IS_CONTINUATION (x)) + /* a continuation SCM is a non-immediate pointing to a heap cell with: word 0: bits 0-15: smob type tag: scm_tc16_continuation. bits 16-31: unused. @@ -38,12 +42,9 @@ in the num_stack_items field of the structure. */ -SCM_API scm_t_bits scm_tc16_continuation; - typedef struct { - SCM throw_value; - jmp_buf jmpbuf; + scm_i_jmp_buf jmpbuf; SCM dynenv; #ifdef __ia64__ void *backing_store; @@ -51,7 +52,8 @@ typedef struct #endif /* __ia64__ */ size_t num_stack_items; /* size of the saved stack. */ SCM root; /* continuation root identifier. */ - SCM vm_conts; /* vm continuations (they use separate stacks) */ + SCM vm; /* vm */ + SCM vm_cont; /* vm's stack and regs */ /* The offset from the live stack location to this copy. This is used to adjust pointers from within the copied stack to the stack @@ -63,30 +65,21 @@ typedef struct */ scm_t_ptrdiff offset; - /* The most recently created debug frame on the live stack, before - it was saved. This needs to be adjusted with OFFSET, above. - */ - struct scm_t_debug_frame *dframe; - SCM_STACKITEM stack[1]; /* copied stack of size num_stack_items. */ } scm_t_contregs; -#define SCM_CONTINUATIONP(x) SCM_TYP16_PREDICATE (scm_tc16_continuation, x) -#define SCM_CONTREGS(x) ((scm_t_contregs *) SCM_CELL_WORD_1 (x)) + -#define SCM_CONTINUATION_LENGTH(x) (SCM_CONTREGS (x)->num_stack_items) -#define SCM_SET_CONTINUATION_LENGTH(x, n)\ - (SCM_CONTREGS (x)->num_stack_items = (n)) -#define SCM_JMPBUF(x) ((SCM_CONTREGS (x))->jmpbuf) -#define SCM_DYNENV(x) ((SCM_CONTREGS (x))->dynenv) -#define SCM_THROW_VALUE(x) ((SCM_CONTREGS (x))->throw_value) -#define SCM_CONTINUATION_ROOT(x) ((SCM_CONTREGS (x))->root) -#define SCM_DFRAME(x) ((SCM_CONTREGS (x))->dframe) +SCM_INTERNAL SCM scm_i_make_continuation (int *first, SCM vm, SCM vm_cont); +SCM_INTERNAL void scm_i_check_continuation (SCM cont); +SCM_INTERNAL void scm_i_reinstate_continuation (SCM cont); - +SCM_INTERNAL SCM scm_i_call_with_current_continuation (SCM proc); -SCM_API SCM scm_make_continuation (int *first); +SCM_INTERNAL SCM scm_i_continuation_to_frame (SCM cont); +SCM_INTERNAL SCM scm_i_contregs_vm (SCM contregs); +SCM_INTERNAL SCM scm_i_contregs_vm_cont (SCM contregs); SCM_API void *scm_c_with_continuation_barrier (void *(*func)(void*), void *); SCM_API SCM scm_with_continuation_barrier (SCM proc);