wingo pushed a commit to branch wip-whippet in repository guile. commit 67c572ba6c3a7887cfc11436062c6e8d9653e570 Author: Andy Wingo <wi...@pobox.com> AuthorDate: Fri May 2 16:45:41 2025 +0200
Move pointers to new finalization API * libguile/finalizers.h: * libguile/finalizers.c (pointer_finalizer_trampoline) (scm_i_add_pointer_finalizer): New helpers. * libguile/foreign.c (scm_i_finalize_pointer, scm_from_pointer) (scm_set_pointer_finalizer_x): Use new API. --- libguile/finalizers.c | 21 +++++++++++++++++++++ libguile/finalizers.h | 2 ++ libguile/foreign.c | 18 +++++++++--------- libguile/foreign.h | 4 +++- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/libguile/finalizers.c b/libguile/finalizers.c index d486ef842..6e44b37fe 100644 --- a/libguile/finalizers.c +++ b/libguile/finalizers.c @@ -36,6 +36,7 @@ #include "bdw-gc.h" #include "eval.h" #include "extensions.h" +#include "foreign.h" #include "gc.h" #include "gsubr.h" #include "init.h" @@ -171,6 +172,13 @@ port_finalizer_trampoline (void *ptr, void *data) scm_i_finalize_port (SCM_I_CURRENT_THREAD, PTR2SCM (ptr)); } +static void +pointer_finalizer_trampoline (void *ptr, void *data) +{ + scm_i_finalize_pointer (SCM_I_CURRENT_THREAD, PTR2SCM (ptr), + PTR2SCM (data)); +} + SCM scm_i_add_struct_finalizer (struct scm_thread *thread, SCM obj) { @@ -201,6 +209,19 @@ scm_i_add_port_finalizer (struct scm_thread *thread, SCM obj) return SCM_UNSPECIFIED; } +SCM +scm_i_add_pointer_finalizer (struct scm_thread *thread, SCM obj, SCM free) +{ + if (!SCM_POINTER_P (obj)) + abort (); + if (!SCM_POINTER_P (free)) + abort (); + + scm_i_set_finalizer (SCM2PTR (obj), pointer_finalizer_trampoline, + SCM2PTR(free)); + return SCM_UNSPECIFIED; +} + static void invoke_finalizer (void *obj, void *data) { diff --git a/libguile/finalizers.h b/libguile/finalizers.h index 8c29fdb8a..b30036c76 100644 --- a/libguile/finalizers.h +++ b/libguile/finalizers.h @@ -41,6 +41,8 @@ SCM_INTERNAL SCM scm_i_add_smob_finalizer (struct scm_thread *thread, SCM obj); SCM_INTERNAL SCM scm_i_add_port_finalizer (struct scm_thread *thread, SCM obj); +SCM_INTERNAL SCM scm_i_add_pointer_finalizer (struct scm_thread *thread, + SCM obj, SCM free); SCM_INTERNAL void scm_i_finalizer_pre_fork (void); diff --git a/libguile/foreign.c b/libguile/foreign.c index b49e1473b..280a21749 100644 --- a/libguile/foreign.c +++ b/libguile/foreign.c @@ -1,4 +1,4 @@ -/* Copyright 2010-2016,2018,2024 +/* Copyright 2010-2016,2018,2024,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -120,11 +120,11 @@ register_weak_reference (SCM from, SCM to) scm_weak_table_putq_x (pointer_weak_refs, from, to); } -static void -pointer_finalizer_trampoline (void *ptr, void *data) +void +scm_i_finalize_pointer (struct scm_thread *thread, SCM ptr, SCM data) { - scm_t_pointer_finalizer finalizer = data; - finalizer (SCM_POINTER_VALUE (SCM_PACK_POINTER (ptr))); + scm_t_pointer_finalizer finalizer = SCM_POINTER_VALUE (data); + finalizer (SCM_POINTER_VALUE (ptr)); } SCM_DEFINE (scm_pointer_p, "pointer?", 1, 0, 0, @@ -182,8 +182,9 @@ scm_from_pointer (void *ptr, scm_t_pointer_finalizer finalizer) ret = scm_cell (scm_tc7_pointer, (scm_t_bits) ptr); if (finalizer) - scm_i_set_finalizer (SCM2PTR (ret), pointer_finalizer_trampoline, - finalizer); + scm_i_add_pointer_finalizer (SCM_I_CURRENT_THREAD, ret, + scm_cell (scm_tc7_pointer, + (scm_t_bits) finalizer)); } return ret; @@ -336,8 +337,7 @@ SCM_DEFINE (scm_set_pointer_finalizer_x, "set-pointer-finalizer!", 2, 0, 0, SCM_VALIDATE_POINTER (1, pointer); SCM_VALIDATE_POINTER (2, finalizer); - scm_i_add_finalizer (SCM2PTR (pointer), pointer_finalizer_trampoline, - SCM_POINTER_VALUE (finalizer)); + scm_i_add_pointer_finalizer (SCM_I_CURRENT_THREAD, pointer, finalizer); return SCM_UNSPECIFIED; } diff --git a/libguile/foreign.h b/libguile/foreign.h index c1d892f01..9cd895976 100644 --- a/libguile/foreign.h +++ b/libguile/foreign.h @@ -1,7 +1,7 @@ #ifndef SCM_FOREIGN_H #define SCM_FOREIGN_H -/* Copyright 2010-2013,2016,2018,2024 +/* Copyright 2010-2013,2016,2018,2024,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -78,6 +78,8 @@ SCM_INTERNAL SCM scm_pointer_p (SCM obj); SCM_INTERNAL SCM scm_make_pointer (SCM address, SCM finalizer); SCM_INTERNAL void scm_i_pointer_print (SCM pointer, SCM port, scm_print_state *pstate); +SCM_INTERNAL void scm_i_finalize_pointer (struct scm_thread *thread, + SCM pointer, SCM free); SCM_INTERNAL SCM scm_dereference_pointer (SCM pointer); SCM_INTERNAL SCM scm_string_to_pointer (SCM string, SCM encoding);