#ifndef SCM_CONTINUATIONS_INTERNAL_H
#define SCM_CONTINUATIONS_INTERNAL_H
/* Copyright 1995-1996,2000-2001,2006,2008-2010,2012-2014,2018,2025
Free Software Foundation, Inc.
This file is part of Guile.
Guile 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.
Guile 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 Guile. If not, see
. */
#ifndef _WIN64
#include
#else
#include "libguile/setjump-win.h"
#endif
#include "libguile/gc.h"
#include "libguile/scm.h"
#include "libguile/throw.h"
struct scm_vm_cont;
struct scm_continuation
{
scm_t_bits tag;
jmp_buf jmpbuf;
SCM root; /* continuation root identifier. */
struct scm_vm_cont *vm_cont; /* vm's stack and regs */
/* The address of the live stack location from which this copy was
taken. 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 STACK - BASE so that it points
into the copy.
*/
uintptr_t base;
size_t num_stack_items; /* size of the saved stack. */
SCM_STACKITEM stack[]; /* copied stack of size num_stack_items. */
};
static inline int
scm_is_continuation (SCM c)
{
return SCM_HAS_TYP16 (c, scm_tc16_continuation);
}
static inline struct scm_continuation*
scm_to_continuation (SCM c)
{
if (!scm_is_continuation (c))
abort ();
return (struct scm_continuation*) SCM_UNPACK_POINTER (c);
}
static inline SCM
scm_from_continuation (struct scm_continuation* c)
{
return SCM_PACK_POINTER (c);
}
SCM_INTERNAL SCM
scm_i_make_continuation (scm_thread *thread, struct scm_vm_cont *vm_cont);
SCM_INTERNAL void scm_i_reinstate_continuation (struct scm_continuation *cont,
uint8_t *mra) SCM_NORETURN;
SCM_INTERNAL int scm_i_continuation_to_frame (SCM cont,
struct scm_frame *frame);
SCM_INTERNAL int scm_i_print_continuation (SCM cont, SCM port,
scm_print_state *state);
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_INTERNAL_H */