Merge remote-tracking branch 'origin/stable-2.0'
[bpt/guile.git] / libguile / continuations.h
index 6f09820..29ea1c1 100644 (file)
@@ -3,21 +3,22 @@
 #ifndef SCM_CONTINUATIONS_H
 #define SCM_CONTINUATIONS_H
 
-/* Copyright (C) 1995,1996,2000,2001 Free Software Foundation, Inc.
+/* Copyright (C) 1995,1996,2000,2001, 2006, 2008, 2009, 2010, 2012 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
  */
 
 \f
 #ifdef __ia64__
 #include <signal.h>
 #include <ucontext.h>
-extern unsigned long * __libc_ia64_register_backing_store_base;
 #endif /* __ia64__ */
 \f
 
+#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.
@@ -39,47 +42,56 @@ extern unsigned long * __libc_ia64_register_backing_store_base;
           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 dynenv;
+  scm_i_jmp_buf jmpbuf;
 #ifdef __ia64__
-  ucontext_t ctx;
   void *backing_store;
   unsigned long backing_store_size;
 #endif /* __ia64__ */
-  SCM_STACKITEM *base;      /* base of the live stack, before it was saved.  */
   size_t num_stack_items;   /* size of the saved stack.  */
-  unsigned long seq;        /* dynamic root identifier.  */
+  SCM root;                 /* continuation root identifier.  */
+  SCM vm;                   /* vm */
+  SCM vm_cont;              /* vm's stack and regs */
 
-  /* the most recently created debug frame on the live stack, before
-     it was saved.  */
-  struct scm_t_debug_frame *dframe;
+  /* 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;
 
-#define SCM_CONTINUATIONP(x)   SCM_TYP16_PREDICATE (scm_tc16_continuation, x)
 
-#define SCM_CONTREGS(x)                ((scm_t_contregs *) SCM_CELL_WORD_1 (x))
+\f
+
+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);
 
-#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_BASE(x)            ((SCM_CONTREGS (x))->base) 
-#define SCM_SEQ(x)             ((SCM_CONTREGS (x))->seq)   
-#define SCM_DFRAME(x)          ((SCM_CONTREGS (x))->dframe)
+SCM_INTERNAL SCM scm_i_call_with_current_continuation (SCM proc);
 
-\f
+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_API SCM scm_make_continuation (int *first);
-SCM_API void scm_init_continuations (void);
+SCM_INTERNAL void scm_init_continuations (void);
 
 #endif  /* SCM_CONTINUATIONS_H */