From c173cc8a666792a6e864b5beb1c4d6903169b5cd Mon Sep 17 00:00:00 2001 From: George Barrett Date: Mon, 7 Jun 2021 04:49:58 +1000 Subject: [PATCH] guile: fix smob exports Before Guile v2.1 [1], calls to `scm_make_smob_type' implicitly added the created class to the exports list of (oop goops); v2.1+ does not implicitly create bindings in any modules. This means that the GDB manual subsection documenting exported types is not quite right when GDB is linked against Guile * guile/scm-gsmob.c (gdbscm_make_smob_type): Export registered smob type from the current module. gdb/testsuite/ChangeLog: 2021-06-07 George Barrett * gdb.guile/scm-gsmob.exp (test exports): Add tests to make sure the smob types currently listed in the GDB manual get exported from the (gdb) module. Change-Id: I7dcd791276b48dfc9edb64fc71170bbb42a6f6e7 --- gdb/guile/scm-gsmob.c | 29 ++++++++++++++++++++++++++- gdb/testsuite/gdb.guile/scm-gsmob.exp | 28 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/gdb/guile/scm-gsmob.c b/gdb/guile/scm-gsmob.c index c623b07d26c..72a96a781c1 100644 --- a/gdb/guile/scm-gsmob.c +++ b/gdb/guile/scm-gsmob.c @@ -96,7 +96,8 @@ gdbscm_is_gsmob (SCM scm) return slot != NULL; } -/* Call this to register a smob, instead of scm_make_smob_type. */ +/* Call this to register a smob, instead of scm_make_smob_type. + Exports the created smob type from the current module. */ scm_t_bits gdbscm_make_smob_type (const char *name, size_t size) @@ -104,6 +105,32 @@ gdbscm_make_smob_type (const char *name, size_t size) scm_t_bits result = scm_make_smob_type (name, size); register_gsmob (result); + +#if SCM_MAJOR_VERSION == 2 && SCM_MINOR_VERSION == 0 + /* Prior to Guile 2.1.0, smob classes were only exposed via exports + from the (oop goops) module. */ + SCM bound_name = scm_string_append (scm_list_3 (scm_from_latin1_string ("<"), + scm_from_latin1_string (name), + scm_from_latin1_string (">"))); + bound_name = scm_string_to_symbol (bound_name); + SCM smob_type = scm_public_ref (scm_list_2 (scm_from_latin1_symbol ("oop"), + scm_from_latin1_symbol ("goops")), + bound_name); +#elif SCM_MAJOR_VERSION == 2 && SCM_MINOR_VERSION == 1 && SCM_MICRO_VERSION == 0 + /* Guile 2.1.0 doesn't provide any API for looking up smob classes. + We could try allocating a fake instance and using scm_class_of, + but it's probably not worth the trouble for the sake of a single + development release. */ +# error "Unsupported Guile version" +#else + /* Guile 2.1.1 and above provides scm_smob_type_class. */ + SCM smob_type = scm_smob_type_class (result); +#endif + + SCM smob_type_name = scm_class_name (smob_type); + scm_define (smob_type_name, smob_type); + scm_module_export (scm_current_module (), scm_list_1 (smob_type_name)); + return result; } diff --git a/gdb/testsuite/gdb.guile/scm-gsmob.exp b/gdb/testsuite/gdb.guile/scm-gsmob.exp index 90c32df7dda..e309fd2888d 100644 --- a/gdb/testsuite/gdb.guile/scm-gsmob.exp +++ b/gdb/testsuite/gdb.guile/scm-gsmob.exp @@ -66,3 +66,31 @@ set prop_list [lsort $prop_list] verbose -log "prop_list: $prop_list" gdb_test "gu (print (sort (map car (object-properties arch)) (lambda (a b) (stringstring a) (symbol->string b)))))" \ "= \\($prop_list\\)" "object-properties" + +# Check that smob classes are exported properly +with_test_prefix "test exports" { + # Import (oop goops) for is-a? and + gdb_scm_test_silent_cmd "gu (use-modules (oop goops))" "import goops" + gdb_test_no_output "gu (define-syntax-rule (gdb-exports-class? x) (is-a? (@ (gdb) x) ))" + + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" + gdb_test "gu (print (gdb-exports-class? ))" "= #t" +} -- 2.30.2