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

commit 6ba6fbdf64bb9dba1ade6979b0b16ec5e1d03ee8
Author: Andy Wingo <wi...@pobox.com>
AuthorDate: Wed Jun 18 10:58:08 2025 +0200

    Fix GOOPS for <regexp>
    
    * module/oop/goops.scm (<regexp>):
    * libguile/goops.c: (scm_class_of): Give regexps their own class; it
    doesn't come from smobs.
---
 libguile/goops.c     |  4 ++++
 module/oop/goops.scm | 10 ++--------
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/libguile/goops.c b/libguile/goops.c
index 5825c3732..80e0b3040 100644
--- a/libguile/goops.c
+++ b/libguile/goops.c
@@ -144,6 +144,7 @@ static SCM class_continuation;
 static SCM class_directory;
 static SCM class_macro;
 static SCM class_random_state;
+static SCM class_regexp;
 
 static struct scm_ephemeron_table *vtable_class_map;
 static SCM pre_goops_vtables = SCM_EOL;
@@ -357,6 +358,8 @@ SCM_DEFINE (scm_class_of, "class-of", 1, 0, 0,
                 return class_macro;
               case scm_tc16_random_state:
                 return class_random_state;
+              case scm_tc16_regexp:
+                return class_regexp;
               default:
                 abort ();
               }
@@ -998,6 +1001,7 @@ SCM_DEFINE (scm_sys_goops_early_init, "%goops-early-init", 
0, 0, 0,
   class_directory = scm_variable_ref (scm_c_lookup ("<directory>"));
   class_macro = scm_variable_ref (scm_c_lookup ("<macro>"));
   class_random_state = scm_variable_ref (scm_c_lookup ("<random-state>"));
+  class_regexp = scm_variable_ref (scm_c_lookup ("<regexp>"));
 
   create_smob_classes ();
   create_struct_classes ();
diff --git a/module/oop/goops.scm b/module/oop/goops.scm
index 89cc69da1..6a18b9691 100644
--- a/module/oop/goops.scm
+++ b/module/oop/goops.scm
@@ -72,7 +72,7 @@
             <keyword> <syntax> <atomic-box> <thread> <bitvector>
             <finalizer> <ephemeron> <ephemeron-table> <character-set>
             <mutex> <condition-variable> <continuation> <directory>
-            <array> <random-state>
+            <array> <random-state> <regexp>
 
             ;; Numbers.
             <number> <complex> <real> <integer> <fraction>
@@ -84,7 +84,6 @@
             ;; have corresponding classes, which may be obtained via
             ;; class-of, once you have an instance.  Perhaps FIXME to
             ;; provide a smob-type-name->class procedure.
-            <regexp>
             <dynamic-object> 
 
             ;; Modules.
@@ -1089,6 +1088,7 @@ slots as we go."
 (define-standard-class <directory> (<top>))
 (define-standard-class <macro> (<top>))
 (define-standard-class <random-state> (<top>))
+(define-standard-class <regexp> (<top>))
 (define-standard-class <thread> (<top>))
 (define-standard-class <number> (<top>))
 (define-standard-class <complex> (<number>))
@@ -3532,12 +3532,6 @@ var{initargs}."
 
 
 
-;;;
-;;; {SMOB and port classes}
-;;;
-
-(define <regexp> (find-subclass <top> '<regexp>))
-
 ;; <dynamic-object> used to be a SMOB type, albeit not exported even to
 ;; C.  However now it's a record type, though still private.  Cross our
 ;; fingers that nobody is using it in anger!

Reply via email to