From 985c1d16f2ea02f054cd94be887f76a9ae6ac75d Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 30 Jun 2025 14:07:05 +0200 Subject: [PATCH] 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. --- libguile/Makefile.am | 2 +- libguile/dynwind.c | 25 +++++++++++++++++++++++-- libguile/dynwind.h | 8 ++++---- libguile/threads-internal.h | 1 + libguile/threads.h | 1 - 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/libguile/Makefile.am b/libguile/Makefile.am index 968361f2c..a69e24267 100644 --- a/libguile/Makefile.am +++ b/libguile/Makefile.am @@ -517,6 +517,7 @@ noinst_HEADERS = atomic.h \ bytevectors-internal.h \ cache-internal.h \ continuations-internal.h \ + dynstack.h \ fluids-internal.h \ gc-inline.h \ gc-internal.h \ @@ -602,7 +603,6 @@ modinclude_HEADERS = \ deprecated.h \ deprecation.h \ dynl.h \ - dynstack.h \ dynwind.h \ eq.h \ error.h \ diff --git a/libguile/dynwind.c b/libguile/dynwind.c index 8a1a2a771..a4e87a808 100644 --- a/libguile/dynwind.c +++ b/libguile/dynwind.c @@ -57,12 +57,21 @@ scm_dynamic_wind (SCM in_guard, SCM thunk, SCM out_guard) #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 scm_dynwind_begin (scm_t_dynwind_flags flags) { 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 @@ -71,6 +80,17 @@ scm_dynwind_end (void) 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 scm_dynwind_unwind_handler (void (*proc) (void *), void *data, 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_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 diff --git a/libguile/dynwind.h b/libguile/dynwind.h index 0ebc1deba..7b3b74f83 100644 --- a/libguile/dynwind.h +++ b/libguile/dynwind.h @@ -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); typedef enum { - SCM_F_DYNWIND_REWINDABLE = SCM_F_DYNSTACK_FRAME_REWINDABLE + SCM_F_DYNWIND_REWINDABLE = 1 } scm_t_dynwind_flags; typedef enum { - SCM_F_WIND_EXPLICITLY = SCM_F_DYNSTACK_WINDER_EXPLICIT, - SCM_F_WIND_MANAGED = SCM_F_DYNSTACK_WINDER_MANAGED + SCM_F_WIND_EXPLICITLY = 1, + SCM_F_WIND_MANAGED = 2 } scm_t_wind_flags; SCM_API void scm_dynwind_begin (scm_t_dynwind_flags); diff --git a/libguile/threads-internal.h b/libguile/threads-internal.h index 96c307437..b6132cc1c 100644 --- a/libguile/threads-internal.h +++ b/libguile/threads-internal.h @@ -22,6 +22,7 @@ +#include "libguile/dynstack.h" #include "libguile/fluids-internal.h" #include "libguile/threads.h" diff --git a/libguile/threads.h b/libguile/threads.h index fe66496aa..f585cbf3b 100644 --- a/libguile/threads.h +++ b/libguile/threads.h @@ -24,7 +24,6 @@ #include "libguile/procs.h" #include "libguile/throw.h" -#include "libguile/dynstack.h" #include "libguile/iselect.h" #include "libguile/vm.h"