#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 */