diff --git a/CHANGES.current b/CHANGES.current index edba0d6ec..bb4e85576 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -7,6 +7,10 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.1.0 (in progress) =========================== +2022-08-26: wsfulton + [Racket] SWIG now converts a C/C++ NULL pointer into a null value by calling + scheme_make_null(), so that scheme's null? is true for a NULL C/C++ pointer value. + 2022-08-18: wsfulton [Racket] Add support for std::unique_ptr in std_unique_ptr.i. Add support for std::auto_ptr in std_auto_ptr.i. diff --git a/Examples/test-suite/guile/null_pointer_runme.scm b/Examples/test-suite/guile/null_pointer_runme.scm new file mode 100644 index 000000000..cad65e898 --- /dev/null +++ b/Examples/test-suite/guile/null_pointer_runme.scm @@ -0,0 +1,3 @@ +(dynamic-call "scm_init_null_pointer_module" (dynamic-link "./libnull_pointer")) +(load "testsuite.scm") +(load "../schemerunme/null_pointer.scm") diff --git a/Examples/test-suite/mzscheme/null_pointer_runme.scm b/Examples/test-suite/mzscheme/null_pointer_runme.scm new file mode 100644 index 000000000..c16e8a0da --- /dev/null +++ b/Examples/test-suite/mzscheme/null_pointer_runme.scm @@ -0,0 +1,3 @@ +(load-extension "null_pointer.so") + +(load "../schemerunme/null_pointer.scm") diff --git a/Examples/test-suite/schemerunme/null_pointer.scm b/Examples/test-suite/schemerunme/null_pointer.scm new file mode 100644 index 000000000..5b249ff50 --- /dev/null +++ b/Examples/test-suite/schemerunme/null_pointer.scm @@ -0,0 +1,8 @@ +(define null '()) +(unless (funk null) + (error "funk(null) does not return true")) + +(unless (null? (getnull)) + (error "NULL pointer should be null")) + +(exit 0) diff --git a/Lib/mzscheme/mzrun.swg b/Lib/mzscheme/mzrun.swg index fed660dfb..57d040812 100644 --- a/Lib/mzscheme/mzrun.swg +++ b/Lib/mzscheme/mzrun.swg @@ -144,16 +144,20 @@ mz_free_swig(void *p, void *data) { static Scheme_Object * SWIG_MzScheme_NewPointerObj(void *ptr, swig_type_info *type, int owner) { - struct swig_mz_proxy *new_proxy; - new_proxy = (struct swig_mz_proxy *) scheme_malloc(sizeof(struct swig_mz_proxy)); - new_proxy->mztype = swig_type; - new_proxy->type = type; - new_proxy->object = ptr; - new_proxy->own = owner & SWIG_POINTER_OWN; - if (new_proxy->own) { - scheme_add_finalizer(new_proxy, mz_free_swig, NULL); + if (ptr) { + struct swig_mz_proxy *new_proxy; + new_proxy = (struct swig_mz_proxy *) scheme_malloc(sizeof(struct swig_mz_proxy)); + new_proxy->mztype = swig_type; + new_proxy->type = type; + new_proxy->object = ptr; + new_proxy->own = owner & SWIG_POINTER_OWN; + if (new_proxy->own) { + scheme_add_finalizer(new_proxy, mz_free_swig, NULL); + } + return (Scheme_Object *) new_proxy; + } else { + return scheme_make_null(); } - return (Scheme_Object *) new_proxy; } static int