mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
* libguile/__scm.h (scm_i_jmp_buf): Remove definition, which was a shim for ia64. Instead, always use setjmp/longjmp and jmp_buf. * libguile/_scm.h (SCM_I_SETJMP, SCM_I_LONGJMP): Remove; instead use setjmp and longjmp. * libguile/continuations.c (capture_auxiliary_stack): (restore_auxiliary_stack): New helpers. (scm_i_make_continuation): Use capture_auxiliary_stack. (copy_stack_and_call): Use restore_auxiliary_stack. No need to stash the aux stack on the thread, either. * libguile/continuations.h (scm_t_contregs): Use SCM_HAVE_AUXILIARY_STACK to flag when to have an auxiliary_stack member. * libguile/control.h: * libguile/control.c (reify_partial_continuation, scm_c_abort): (scm_suspendable_continuation_p): Adapt to use setjmp/longjmp directly. * libguile/deprecated.h: Add deprecated scm_i_jmp_buf define. * libguile/dynstack.h: * libguile/dynstack.c (PROMPT_JMPBUF): (scm_dynstack_push_prompt, scm_dynstack_find_prompt): (scm_dynstack_wind_prompt): Adapt to jmp_buf type. * libguile/eval.c (eval): Use jmp_buf and setjmp directly. * libguile/gc-malloc.c: No need for ia64-specific things. * libguile/gc.c: No need for ia64-specific things. * libguile/gc.h: No need to declare scm_ia64_ar_bsp. * libguile/init.c: Remove typedef of setjmp_type for Cray, unused. * libguile/threads.c (guilify_self_1): No more pending_rbs_continuation in scm_i_thread, and register_backing_store_base is handled by libgc. (scm_ia64_ar_bsp): Remove definitions; inlined into continuations.c's capture_auxiliary_stack. * libguile/threads.h (scm_i_thread): jmpbuf member is plain jmp_buf. * libguile/throw.c (catch): Just use jmp_buf and setjmp. * libguile/vm-engine.c (VM_NAME): Adapt prototype to take jmp_buf pointer. * libguile/vm.c (vm_abort): Adapt jmp_buf types. (scm_call_n): Use setjmp.
104 lines
3.2 KiB
C
104 lines
3.2 KiB
C
/* classes: h_files */
|
||
|
||
#ifndef SCM_CONTINUATIONS_H
|
||
#define SCM_CONTINUATIONS_H
|
||
|
||
/* Copyright (C) 1995-1996,2000-2001,2006,2008-2010,2012-2014,2018
|
||
* 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 <setjmp.h>
|
||
|
||
#include "libguile/__scm.h"
|
||
|
||
|
||
|
||
#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
|
||
{
|
||
jmp_buf jmpbuf;
|
||
#if SCM_HAVE_AUXILIARY_STACK
|
||
void *auxiliary_stack;
|
||
unsigned long auxiliary_stack_size;
|
||
#endif
|
||
size_t num_stack_items; /* size of the saved stack. */
|
||
SCM root; /* continuation root identifier. */
|
||
struct scm_vm *vp; /* 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,
|
||
struct scm_vm *vp,
|
||
SCM vm_cont);
|
||
SCM_INTERNAL void scm_i_check_continuation (SCM cont);
|
||
SCM_INTERNAL void scm_i_reinstate_continuation (SCM cont);
|
||
|
||
struct scm_frame;
|
||
SCM_INTERNAL int scm_i_continuation_to_frame (SCM cont,
|
||
struct scm_frame *frame);
|
||
|
||
SCM_INTERNAL struct scm_vm* scm_i_contregs_vp (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:
|
||
*/
|