From 29daa0fe343585637e5f8fd74cbee386b8820af0 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Mon, 28 Jul 2025 22:39:05 +0100 Subject: [PATCH] Guile STRING LENGTH typemap fixes Fix leak in (char *STRING, size_t LENGTH) family of typemaps. Add (size_t LENGTH, const char *STRING) family of typemaps. --- Examples/test-suite/guile/Makefile.in | 4 ---- .../guile/char_binary_rev_len_runme.scm | 6 ++++++ .../schemerunme/char_binary_rev_len.scm | 9 +++++++++ Lib/guile/typemaps.i | 19 ++++++++++++++++++- 4 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 Examples/test-suite/guile/char_binary_rev_len_runme.scm create mode 100644 Examples/test-suite/schemerunme/char_binary_rev_len.scm diff --git a/Examples/test-suite/guile/Makefile.in b/Examples/test-suite/guile/Makefile.in index 736004b13..bfa25acef 100644 --- a/Examples/test-suite/guile/Makefile.in +++ b/Examples/test-suite/guile/Makefile.in @@ -19,10 +19,6 @@ top_builddir = @top_builddir@ GUILE = @GUILE@ GUILE_RUNTIME= -FAILING_CPP_TESTS = \ -char_binary_rev_len \ -director_binary_string_rev_len \ - C_TEST_CASES = long_long \ list_vector \ multivalue \ diff --git a/Examples/test-suite/guile/char_binary_rev_len_runme.scm b/Examples/test-suite/guile/char_binary_rev_len_runme.scm new file mode 100644 index 000000000..550bb77d8 --- /dev/null +++ b/Examples/test-suite/guile/char_binary_rev_len_runme.scm @@ -0,0 +1,6 @@ +;; The SWIG modules have "passive" Linkage, i.e., they don't generate +;; Guile modules (namespaces) but simply put all the bindings into the +;; current module. That's enough for such a simple test. +(dynamic-call "scm_init_char_binary_rev_len_module" (dynamic-link "./libchar_binary_rev_len")) +(load "testsuite.scm") +(load "../schemerunme/char_binary_rev_len.scm") diff --git a/Examples/test-suite/schemerunme/char_binary_rev_len.scm b/Examples/test-suite/schemerunme/char_binary_rev_len.scm new file mode 100644 index 000000000..853cdbcdf --- /dev/null +++ b/Examples/test-suite/schemerunme/char_binary_rev_len.scm @@ -0,0 +1,9 @@ +(define t (new-Test)) + +(if (not (= (Test-strlen t "hile") 4)) + (error "bad multi-arg typemap")) + +(if (not (= (Test-strlen t "hil\x00") 4)) + (error "bad multi-arg typemap")) + +(exit 0) diff --git a/Lib/guile/typemaps.i b/Lib/guile/typemaps.i index a75c5592b..65e87d5da 100644 --- a/Lib/guile/typemaps.i +++ b/Lib/guile/typemaps.i @@ -382,15 +382,32 @@ typedef unsigned long SCM; * String & length * ------------------------------------------------------------ */ -%typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { +%typemap(in) (const char *STRING, size_t LENGTH)(int must_free = 0) { size_t temp; $1 = ($1_ltype) SWIG_Guile_scm2newstr($input, &temp); $2 = ($2_ltype) temp; + must_free = 1; } +%typemap(freearg) (const char *STRING, size_t LENGTH) "if (must_free$argnum) SWIG_free($1);" + %apply (const char *STRING, size_t LENGTH) { (const char *STRING, int LENGTH) } %apply (const char *STRING, size_t LENGTH) { (char *STRING, size_t LENGTH) } %apply (char *STRING, size_t LENGTH) { (char *STRING, int LENGTH) } +/* Length & string reverse order typemap */ + +%typemap(in) (size_t LENGTH, const char *STRING)(int must_free = 0) { + size_t temp; + $2 = ($2_ltype) SWIG_Guile_scm2newstr($input, &temp); + $1 = ($1_ltype) temp; + must_free = 1; +} +%typemap(freearg) (size_t LENGTH, const char *STRING) "if (must_free$argnum) SWIG_free($2);" + +%apply (size_t LENGTH, const char *STRING) { (int LENGTH, const char *STRING) } +%apply (size_t LENGTH, const char *STRING) { (size_t LENGTH, char *STRING) } +%apply (size_t LENGTH, char *STRING) { (int LENGTH, char *STRING) } + /* ------------------------------------------------------------ * CLASS::* (member function pointer) typemaps * taken from typemaps/swigtype.swg