X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/1cc91f1b2937a230a2dc80dd25cc6003b7b8f2b5..81b80b9610798ea910daad78cf525dec211639f9:/libguile/continuations.h diff --git a/libguile/continuations.h b/libguile/continuations.h dissimilarity index 93% index e34b17014..e0a455632 100644 --- a/libguile/continuations.h +++ b/libguile/continuations.h @@ -1,78 +1,103 @@ -/* classes: h_files */ - -#ifndef CONTINUATIONSH -#define CONTINUATIONSH -/* Copyright (C) 1995,1996 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * As a special exception, the Free Software Foundation gives permission - * for additional uses of the text contained in its release of GUILE. - * - * The exception is that, if you link the GUILE library with other files - * to produce an executable, this does not by itself cause the - * resulting executable to be covered by the GNU General Public License. - * Your use of that executable is in no way restricted on account of - * linking the GUILE library code into it. - * - * This exception does not however invalidate any other reasons why - * the executable file might be covered by the GNU General Public License. - * - * This exception applies only to the code released by the - * Free Software Foundation under the name GUILE. If you copy - * code from other Free Software Foundation releases into a copy of - * GUILE, as the General Public License permits, the exception does - * not apply to the code that you add in this way. To avoid misleading - * anyone as to the status of such modified files, you must delete - * this exception notice from them. - * - * If you write modifications of your own for GUILE, it is your choice - * whether to permit this exception to apply to your modifications. - * If you do not wish that, delete this exception notice. - */ - -#include "libguile/__scm.h" - - - -typedef struct -{ - SCM throw_value; - jmp_buf jmpbuf; - SCM dynenv; - SCM_STACKITEM *base; - unsigned long seq; - -#ifdef DEBUG_EXTENSIONS - struct scm_debug_frame *dframe; -#endif -} regs; - -#define SCM_JMPBUF(x) (((regs *)SCM_CHARS(x))->jmpbuf) -#define SCM_SETJMPBUF SCM_SETCDR -#define SCM_DYNENV(x) (((regs *)SCM_CHARS(x))->dynenv) -#define SCM_THROW_VALUE(x) (((regs *)SCM_CHARS(x))->throw_value) -#define SCM_BASE(x) (((regs *)SCM_CHARS(x))->base) -#define SCM_SEQ(x) (((regs *)SCM_CHARS(x))->seq) -#define SCM_DFRAME(x) (((regs *)SCM_CHARS(x))->dframe) - - - -extern SCM scm_make_cont SCM_P ((SCM * answer)); -extern void scm_dynthrow SCM_P ((SCM *a)); -extern SCM scm_call_continuation SCM_P ((SCM cont, SCM val)); -extern void scm_init_continuations SCM_P ((void)); - -#endif /* CONTINUATIONSH */ +/* classes: h_files */ + +#ifndef SCM_CONTINUATIONS_H +#define SCM_CONTINUATIONS_H + +/* 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 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 + * 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 + */ + + + +#include "libguile/__scm.h" + +#ifdef __ia64__ +#include +#include +#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. + word 1: malloc block containing an scm_t_contregs structure with a + tail array of SCM_STACKITEM. the size of the array is stored + in the num_stack_items field of the structure. +*/ + +typedef struct +{ + scm_i_jmp_buf jmpbuf; + SCM dynenv; +#ifdef __ia64__ + void *backing_store; + unsigned long backing_store_size; +#endif /* __ia64__ */ + size_t num_stack_items; /* size of the saved stack. */ + SCM root; /* continuation root identifier. */ + 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 + itself. + + Thus, when you read a pointer from the copied stack that points + into the live stack, you need to add OFFSET so that it points + into the copy. + */ + scm_t_ptrdiff offset; + + SCM_STACKITEM stack[1]; /* copied stack of size num_stack_items. */ +} scm_t_contregs; + + + + +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_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); + +SCM_INTERNAL SCM +scm_i_with_continuation_barrier (scm_t_catch_body body, + void *body_data, + scm_t_catch_handler handler, + void *handler_data, + scm_t_catch_handler pre_unwind_handler, + void *pre_unwind_handler_data); + +SCM_INTERNAL void scm_init_continuations (void); + +#endif /* SCM_CONTINUATIONS_H */ + +/* + Local Variables: + c-file-style: "gnu" + End: +*/