summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlly Betts <olly@survex.com>2022-03-07 13:24:37 +1300
committerOlly Betts <ojwbetts@gmail.com>2022-03-07 14:17:52 +1300
commit8dbcd710ff15aee3897043630f64f50c710c04f2 (patch)
treeec726fb457e5cb74317cf6267d8c43f3677ecdec
parent314df0f71e35dcfa5ea91cd2f0abcb6355858ab9 (diff)
downloadswig-8dbcd710ff15aee3897043630f64f50c710c04f2.tar.gz
[Javascript] Fix handling of functions which take void*
Fixes #682
-rw-r--r--CHANGES.current3
-rw-r--r--Examples/test-suite/javascript/voidtest_runme.js28
-rw-r--r--Examples/test-suite/voidtest.i3
-rw-r--r--Lib/javascript/jsc/javascriptrun.swg2
-rw-r--r--Lib/javascript/v8/javascriptrun.swg2
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);