1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-07-04 08:40:21 +02:00

Make dynstack interface completely internal

* libguile/Makefile.am (noinst_HEADERS, modinclude_HEADERS): Don't
install dynstack.h.
* libguile/dynwind.c (translate_frame_flags, scm_dynwind_begin)
(translate_winder_flags, scm_dynwind_unwind_handler):
* libguile/dynwind.h (scm_t_dynwind_flags, scm_t_wind_flags): Instead of
punning the dynwind.h flags to dynstack.h values, translate them.
* libguile/threads-internal.h:
* libguile/threads.h: Include dynstack.h in the private header.
This commit is contained in:
Andy Wingo 2025-06-30 14:07:05 +02:00
parent 8726b8789b
commit 985c1d16f2
5 changed files with 29 additions and 8 deletions

View file

@ -517,6 +517,7 @@ noinst_HEADERS = atomic.h \
bytevectors-internal.h \ bytevectors-internal.h \
cache-internal.h \ cache-internal.h \
continuations-internal.h \ continuations-internal.h \
dynstack.h \
fluids-internal.h \ fluids-internal.h \
gc-inline.h \ gc-inline.h \
gc-internal.h \ gc-internal.h \
@ -602,7 +603,6 @@ modinclude_HEADERS = \
deprecated.h \ deprecated.h \
deprecation.h \ deprecation.h \
dynl.h \ dynl.h \
dynstack.h \
dynwind.h \ dynwind.h \
eq.h \ eq.h \
error.h \ error.h \

View file

@ -57,12 +57,21 @@ scm_dynamic_wind (SCM in_guard, SCM thunk, SCM out_guard)
#undef FUNC_NAME #undef FUNC_NAME
static scm_t_dynstack_frame_flags
translate_frame_flags (scm_t_dynwind_flags flags)
{
scm_t_dynstack_frame_flags ret = 0;
if (flags & SCM_F_DYNWIND_REWINDABLE)
ret |= SCM_F_DYNSTACK_FRAME_REWINDABLE;
return ret;
}
void void
scm_dynwind_begin (scm_t_dynwind_flags flags) scm_dynwind_begin (scm_t_dynwind_flags flags)
{ {
scm_thread *thread = SCM_I_CURRENT_THREAD; scm_thread *thread = SCM_I_CURRENT_THREAD;
scm_dynstack_push_frame (&thread->dynstack, flags); scm_dynstack_push_frame (&thread->dynstack, translate_frame_flags (flags));
} }
void void
@ -71,6 +80,17 @@ scm_dynwind_end (void)
scm_dynstack_unwind_frame (&SCM_I_CURRENT_THREAD->dynstack); scm_dynstack_unwind_frame (&SCM_I_CURRENT_THREAD->dynstack);
} }
static scm_t_dynstack_winder_flags
translate_winder_flags (scm_t_wind_flags flags)
{
scm_t_dynstack_winder_flags ret = 0;
if (flags & SCM_F_WIND_EXPLICITLY)
ret |= SCM_F_DYNSTACK_WINDER_EXPLICIT;
if (flags & SCM_F_WIND_MANAGED)
ret |= SCM_F_DYNSTACK_WINDER_MANAGED;
return ret;
}
void void
scm_dynwind_unwind_handler (void (*proc) (void *), void *data, scm_dynwind_unwind_handler (void (*proc) (void *), void *data,
scm_t_wind_flags flags) scm_t_wind_flags flags)
@ -78,7 +98,8 @@ scm_dynwind_unwind_handler (void (*proc) (void *), void *data,
scm_thread *thread = SCM_I_CURRENT_THREAD; scm_thread *thread = SCM_I_CURRENT_THREAD;
scm_t_dynstack *dynstack = &thread->dynstack; scm_t_dynstack *dynstack = &thread->dynstack;
scm_dynstack_push_unwinder (dynstack, flags, proc, data); scm_dynstack_push_unwinder (dynstack, translate_winder_flags (flags),
proc, data);
} }
void void

View file

@ -22,7 +22,7 @@
#include "libguile/dynstack.h" #include "libguile/scm.h"
@ -33,12 +33,12 @@ SCM_INTERNAL void scm_init_dynwind (void);
SCM_API void scm_swap_bindings (SCM vars, SCM vals); SCM_API void scm_swap_bindings (SCM vars, SCM vals);
typedef enum { typedef enum {
SCM_F_DYNWIND_REWINDABLE = SCM_F_DYNSTACK_FRAME_REWINDABLE SCM_F_DYNWIND_REWINDABLE = 1
} scm_t_dynwind_flags; } scm_t_dynwind_flags;
typedef enum { typedef enum {
SCM_F_WIND_EXPLICITLY = SCM_F_DYNSTACK_WINDER_EXPLICIT, SCM_F_WIND_EXPLICITLY = 1,
SCM_F_WIND_MANAGED = SCM_F_DYNSTACK_WINDER_MANAGED SCM_F_WIND_MANAGED = 2
} scm_t_wind_flags; } scm_t_wind_flags;
SCM_API void scm_dynwind_begin (scm_t_dynwind_flags); SCM_API void scm_dynwind_begin (scm_t_dynwind_flags);

View file

@ -22,6 +22,7 @@
#include "libguile/dynstack.h"
#include "libguile/fluids-internal.h" #include "libguile/fluids-internal.h"
#include "libguile/threads.h" #include "libguile/threads.h"

View file

@ -24,7 +24,6 @@
#include "libguile/procs.h" #include "libguile/procs.h"
#include "libguile/throw.h" #include "libguile/throw.h"
#include "libguile/dynstack.h"
#include "libguile/iselect.h" #include "libguile/iselect.h"
#include "libguile/vm.h" #include "libguile/vm.h"