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);

Reply via email to