wingo pushed a commit to branch wip-whippet
in repository guile.

commit 93e5a2454a414ae0bf9e1badc40d7925b5c7b03b
Author: Andy Wingo <wi...@pobox.com>
AuthorDate: Fri May 30 10:25:00 2025 +0200

    Tighten up exported ABI / API of "programs"
    
    * libguile/programs.h (scm_program_p, scm_program_code)
    (scm_primitive_code_p, scm_primitive_code_name, scm_primitive_call_ip):
    Don't expose these internal functions to C
    ABI.
    (scm_program_num_free_variables, scm_program_free_variable_ref,
    scm_program_free_variable_set_x): Don't expose these previously-public
    functions to C ABI.
    (scm_is_program): New internal inline function.
    * libguile/stacks.c (narrow_stack): Use new scm_is_program helper.
    * libguile/programs.c: Adapt implementation to use SCM_DEFINE_STATIC.
---
 libguile/programs.c | 66 ++++++++++++++++++++++++++---------------------------
 libguile/programs.h | 20 ++++++----------
 libguile/stacks.c   |  4 ++--
 3 files changed, 42 insertions(+), 48 deletions(-)

diff --git a/libguile/programs.c b/libguile/programs.c
index 81495a5b1..eb814f802 100644
--- a/libguile/programs.c
+++ b/libguile/programs.c
@@ -1,4 +1,4 @@
-/* Copyright 2001,2009-2014,2017-2019
+/* Copyright 2001,2009-2014,2017-2019,2025
      Free Software Foundation, Inc.
 
    This file is part of Guile.
@@ -43,10 +43,10 @@
 
 static SCM write_program = SCM_BOOL_F;
 
-SCM_DEFINE (scm_program_code, "program-code", 1, 0, 0,
-            (SCM program),
-            "")
-#define FUNC_NAME s_scm_program_code
+SCM_DEFINE_STATIC (program_code, "program-code", 1, 0, 0,
+                   (SCM program),
+                   "")
+#define FUNC_NAME s_program_code
 {
   SCM_VALIDATE_PROGRAM (1, program);
 
@@ -148,19 +148,19 @@ scm_i_program_print (SCM program, SCM port, 
scm_print_state *pstate)
  * Scheme interface
  */
 
-SCM_DEFINE (scm_program_p, "program?", 1, 0, 0,
-           (SCM obj),
-           "")
-#define FUNC_NAME s_scm_program_p
+SCM_DEFINE_STATIC (program_p, "program?", 1, 0, 0,
+                   (SCM obj),
+                   "")
+#define FUNC_NAME s_program_p
 {
   return scm_from_bool (SCM_PROGRAM_P (obj));
 }
 #undef FUNC_NAME
 
-SCM_DEFINE (scm_primitive_code_p, "primitive-code?", 1, 0, 0,
-           (SCM code),
-           "")
-#define FUNC_NAME s_scm_primitive_code_p
+SCM_DEFINE_STATIC (primitive_code_p, "primitive-code?", 1, 0, 0,
+                   (SCM code),
+                   "")
+#define FUNC_NAME s_primitive_code_p
 {
   const uint32_t * ptr = (const uint32_t *) scm_to_uintptr_t (code);
 
@@ -168,10 +168,10 @@ SCM_DEFINE (scm_primitive_code_p, "primitive-code?", 1, 
0, 0,
 }
 #undef FUNC_NAME
 
-SCM_DEFINE (scm_primitive_call_ip, "primitive-call-ip", 1, 0, 0,
-           (SCM prim),
-           "")
-#define FUNC_NAME s_scm_primitive_call_ip
+SCM_DEFINE_STATIC (primitive_call_ip, "primitive-call-ip", 1, 0, 0,
+                   (SCM prim),
+                   "")
+#define FUNC_NAME s_primitive_call_ip
 {
   uintptr_t ip;
 
@@ -182,10 +182,10 @@ SCM_DEFINE (scm_primitive_call_ip, "primitive-call-ip", 
1, 0, 0,
 }
 #undef FUNC_NAME
 
-SCM_DEFINE (scm_primitive_code_name, "primitive-code-name", 1, 0, 0,
-           (SCM code),
-           "")
-#define FUNC_NAME s_scm_primitive_code_name
+SCM_DEFINE_STATIC (primitive_code_name, "primitive-code-name", 1, 0, 0,
+                   (SCM code),
+                   "")
+#define FUNC_NAME s_primitive_code_name
 {
   const uint32_t * ptr = (const uint32_t *) scm_to_uintptr_t (code);
 
@@ -224,10 +224,10 @@ scm_program_address_range (SCM program)
   return scm_call_1 (scm_variable_ref (program_address_range), program);
 }
 
-SCM_DEFINE (scm_program_num_free_variables, "program-num-free-variables", 1, 
0, 0,
-           (SCM program),
-           "")
-#define FUNC_NAME s_scm_program_num_free_variables
+SCM_DEFINE_STATIC (program_num_free_variables, "program-num-free-variables",
+                   1, 0, 0, (SCM program),
+                   "")
+#define FUNC_NAME s_program_num_free_variables
 {
   SCM_VALIDATE_PROGRAM (1, program);
 
@@ -235,10 +235,10 @@ SCM_DEFINE (scm_program_num_free_variables, 
"program-num-free-variables", 1, 0,
 }
 #undef FUNC_NAME
 
-SCM_DEFINE (scm_program_free_variable_ref, "program-free-variable-ref", 2, 0, 
0,
-           (SCM program, SCM i),
-           "")
-#define FUNC_NAME s_scm_program_free_variable_ref
+SCM_DEFINE_STATIC (program_free_variable_ref, "program-free-variable-ref",
+                   2, 0, 0, (SCM program, SCM i),
+                   "")
+#define FUNC_NAME s_program_free_variable_ref
 {
   unsigned long idx;
 
@@ -250,10 +250,10 @@ SCM_DEFINE (scm_program_free_variable_ref, 
"program-free-variable-ref", 2, 0, 0,
 }
 #undef FUNC_NAME
 
-SCM_DEFINE (scm_program_free_variable_set_x, "program-free-variable-set!", 3, 
0, 0,
-           (SCM program, SCM i, SCM x),
-           "")
-#define FUNC_NAME s_scm_program_free_variable_set_x
+SCM_DEFINE_STATIC (program_free_variable_set_x, "program-free-variable-set!",
+                   3, 0, 0, (SCM program, SCM i, SCM x),
+                   "")
+#define FUNC_NAME s_program_free_variable_set_x
 {
   unsigned long idx;
 
diff --git a/libguile/programs.h b/libguile/programs.h
index fb5921362..c3f3dc1c9 100644
--- a/libguile/programs.h
+++ b/libguile/programs.h
@@ -1,4 +1,4 @@
-/* Copyright 2001,2009-2014,2018
+/* Copyright 2001,2009-2014,2018,2025
      Free Software Foundation, Inc.
 
    This file is part of Guile.
@@ -54,27 +54,21 @@ scm_i_make_program (const uint32_t *code)
 {
   return scm_cell (scm_tc7_program, (scm_t_bits)code);
 }
-#endif
-
-SCM_INTERNAL SCM scm_program_p (SCM obj);
-SCM_INTERNAL SCM scm_program_code (SCM program);
 
-SCM_INTERNAL SCM scm_primitive_code_p (SCM code);
-SCM_INTERNAL SCM scm_primitive_code_name (SCM code);
-SCM_INTERNAL SCM scm_primitive_call_ip (SCM prim);
+static inline int
+scm_is_program (SCM x)
+{
+  return SCM_PROGRAM_P (x);
+}
+#endif
 
 SCM_INTERNAL SCM scm_i_program_name (SCM program);
 SCM_INTERNAL SCM scm_i_program_documentation (SCM program);
 SCM_INTERNAL SCM scm_i_program_properties (SCM program);
 
 SCM_INTERNAL SCM scm_find_source_for_addr (SCM ip);
-
 SCM_INTERNAL SCM scm_program_address_range (SCM program);
 
-SCM_API SCM scm_program_num_free_variables (SCM program);
-SCM_API SCM scm_program_free_variable_ref (SCM program, SCM i);
-SCM_API SCM scm_program_free_variable_set_x (SCM program, SCM i, SCM x);
-
 SCM_INTERNAL int scm_i_program_arity (SCM program, int *req, int *opt, int 
*rest);
 SCM_INTERNAL void scm_i_program_print (SCM program, SCM port,
                                        scm_print_state *pstate);
diff --git a/libguile/stacks.c b/libguile/stacks.c
index 9160c0cbf..2f5273e03 100644
--- a/libguile/stacks.c
+++ b/libguile/stacks.c
@@ -122,13 +122,13 @@ narrow_stack (long len, enum scm_vm_frame_kind kind, 
struct scm_frame *frame,
   /* Resolve procedure cuts to address ranges, if possible.  If the
      debug information has been stripped, this might not be
      possible.  */
-  if (scm_is_true (scm_program_p (inner_cut)))
+  if (scm_is_program (inner_cut))
     {
       SCM addr_range = scm_program_address_range (inner_cut);
       if (scm_is_pair (addr_range))
         inner_cut = addr_range;
     }
-  if (scm_is_true (scm_program_p (outer_cut)))
+  if (scm_is_program (outer_cut))
     {
       SCM addr_range = scm_program_address_range (outer_cut);
       if (scm_is_pair (addr_range))

Reply via email to