diff options
author | Olly Betts <olly@survex.com> | 2022-03-07 13:24:37 +1300 |
---|---|---|
committer | Olly Betts <ojwbetts@gmail.com> | 2022-03-07 14:17:52 +1300 |
commit | 8dbcd710ff15aee3897043630f64f50c710c04f2 (patch) | |
tree | ec726fb457e5cb74317cf6267d8c43f3677ecdec | |
parent | 314df0f71e35dcfa5ea91cd2f0abcb6355858ab9 (diff) | |
download | swig-8dbcd710ff15aee3897043630f64f50c710c04f2.tar.gz |
[Javascript] Fix handling of functions which take void*
Fixes #682
-rw-r--r-- | CHANGES.current | 3 | ||||
-rw-r--r-- | Examples/test-suite/javascript/voidtest_runme.js | 28 | ||||
-rw-r--r-- | Examples/test-suite/voidtest.i | 3 | ||||
-rw-r--r-- | Lib/javascript/jsc/javascriptrun.swg | 2 | ||||
-rw-r--r-- | Lib/javascript/v8/javascriptrun.swg | 2 |
5 files changed, 36 insertions, 2 deletions
diff --git a/CHANGES.current b/CHANGES.current index 90dcbcb94..68061002b 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -7,6 +7,9 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.1.0 (in progress) =========================== +2022-03-07: olly + [Javascript] #682 Fix handling of functions which take void*. + 2022-03-06: olly SWIG should now reliably exit with status 0 if the run was successful and status 1 if there was an error (or a warning and diff --git a/Examples/test-suite/javascript/voidtest_runme.js b/Examples/test-suite/javascript/voidtest_runme.js new file mode 100644 index 000000000..8ff0c0ba9 --- /dev/null +++ b/Examples/test-suite/javascript/voidtest_runme.js @@ -0,0 +1,28 @@ +var voidtest = require("voidtest"); + +voidtest.globalfunc(); +var f = new voidtest.Foo(); +f.memberfunc(); + +voidtest.Foo.staticmemberfunc(); + +if (f.memberfunc() !== (function(){}())) { + throw new Error("f.memberfunc() didn't return same result as pure Javascript equivalent"); +} + +v1 = voidtest.vfunc1(f); +v2 = voidtest.vfunc2(f); +if (!voidtest.test_pointers_equal(v1, v2)) { + throw new Error("!voidtest.test_pointers_equal(v1, v2)"); +} + +v3 = voidtest.vfunc3(v1); +if (!voidtest.test_pointers_equal(v3.get_this(), f.get_this())) { + throw new Error("!voidtest.test_pointers_equal(v3.get_this(), f.get_this())"); +} +v4 = voidtest.vfunc1(f); +if (!voidtest.test_pointers_equal(v4, v1)) { + throw new Error("!voidtest.test_pointers_equal(v4, v1)"); +} + +v3.memberfunc(); diff --git a/Examples/test-suite/voidtest.i b/Examples/test-suite/voidtest.i index f0e649373..d792f4151 100644 --- a/Examples/test-suite/voidtest.i +++ b/Examples/test-suite/voidtest.i @@ -9,6 +9,7 @@ class Foo { public: Foo(void) { } void memberfunc(void) { } + void* get_this() { return this; } static void staticmemberfunc(void) { } }; @@ -18,4 +19,6 @@ void *vfunc2(Foo *f) { return f; } Foo *vfunc3(void *f) { return (Foo *) f; } Foo *vfunc4(Foo *f) { return f; } +bool test_pointers_equal(void *a, void *b) { return a == b; } + %} diff --git a/Lib/javascript/jsc/javascriptrun.swg b/Lib/javascript/jsc/javascriptrun.swg index d092ea4ab..20e747872 100644 --- a/Lib/javascript/jsc/javascriptrun.swg +++ b/Lib/javascript/jsc/javascriptrun.swg @@ -122,7 +122,7 @@ SWIGRUNTIME int SWIG_JSC_ConvertInstancePtr(JSContextRef context, JSObjectRef ob } assert(ptr); *ptr = NULL; - if (cdata->info == info) { + if (!info || cdata->info == info) { *ptr = cdata->swigCObject; } else { swig_cast_info *tc = SWIG_TypeCheckStruct(cdata->info, info); diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg index 518b19a8f..7e50a8b84 100644 --- a/Lib/javascript/v8/javascriptrun.swg +++ b/Lib/javascript/v8/javascriptrun.swg @@ -178,7 +178,7 @@ SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(SWIGV8_OBJECT objRef, void **ptr, swi if(cdata == NULL) { return SWIG_ERROR; } - if(cdata->info != info) { + if(info && cdata->info != info) { swig_cast_info *tc = SWIG_TypeCheckStruct(cdata->info, info); if (!tc && cdata->info->name) { tc = SWIG_TypeCheck(cdata->info->name, info); |