summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlly Betts <olly@survex.com>2020-12-09 09:48:55 +1300
committerOlly Betts <olly@survex.com>2021-03-18 10:58:44 +1300
commit2e7da86b2ced479e48741cc8713479dee426be61 (patch)
tree91481c686a633d1fb7bcc1a420e9923d4eac00f3
parent57cb95318a93ec9e09c4445aaaccd6fb80ab2cf9 (diff)
downloadswig-2e7da86b2ced479e48741cc8713479dee426be61.tar.gz
php: Fix overloaded directed methods with non-void return
We were treating such methods like constructors and assigning to the internal _cPtr, which just seems bizarrely wrong. Fixes #1900
-rw-r--r--CHANGES.current4
-rw-r--r--Examples/test-suite/director_overload.i11
-rw-r--r--Examples/test-suite/php/director_overload_runme.php18
-rw-r--r--Source/Modules/php.cxx4
4 files changed, 34 insertions, 3 deletions
diff --git a/CHANGES.current b/CHANGES.current
index acaea3aea..58fd05a56 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)
===========================
+2021-03-18: olly
+ #1900, #1905 [PHP] Fix wrapping of overloaded directed methods with
+ non-void return.
+
2021-03-11: murillo128
#1498 [Javascript] Support type conversion.
diff --git a/Examples/test-suite/director_overload.i b/Examples/test-suite/director_overload.i
index 604ffe5ca..d6feb122b 100644
--- a/Examples/test-suite/director_overload.i
+++ b/Examples/test-suite/director_overload.i
@@ -47,5 +47,14 @@ public:
virtual void notover(int *p) const {}
};
-%}
+class OverloadedGetSet
+{
+ int v;
+public:
+ OverloadedGetSet() : v(42) { }
+ virtual ~OverloadedGetSet() { }
+ virtual int rw() const { return v; }
+ virtual void rw(int new_v) { v = new_v; }
+};
+%}
diff --git a/Examples/test-suite/php/director_overload_runme.php b/Examples/test-suite/php/director_overload_runme.php
new file mode 100644
index 000000000..f5fc56b65
--- /dev/null
+++ b/Examples/test-suite/php/director_overload_runme.php
@@ -0,0 +1,18 @@
+
+<?php
+
+require "tests.php";
+require "director_overload.php";
+
+check::functions(array('new_overloadedClass','new_overloadedPointers','new_overloadedGetSet','overloadedclass_method1','overloadedclass_method3','overloadedclass_method2','overloadedpointers_method','overloadedpointers_notover','overloadedgetset_rw'));
+
+check::classes(array('OverloadedClass','OverloadedPointers','OverloadedGetSet'));
+check::globals(array());
+
+$o = new OverloadedGetSet;
+check::equal($o->rw(), 42, "get_set() initial value not 42");
+check::equal($o->rw(7), null, "get_set() failed to set");
+check::equal($o->rw(), 7, "get_set() didn't return back set value");
+
+check::done();
+?>
diff --git a/Source/Modules/php.cxx b/Source/Modules/php.cxx
index 1edbd874c..eaae32d63 100644
--- a/Source/Modules/php.cxx
+++ b/Source/Modules/php.cxx
@@ -1566,7 +1566,7 @@ public:
Printf(prepare, "case %d: ", ++last_handled_i);
}
if (non_void_return) {
- if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) {
+ if (!constructor) {
Append(prepare, "$r=");
} else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) {
Append(prepare, "$r=");
@@ -1590,7 +1590,7 @@ public:
if (had_a_case)
Printf(prepare, "default: ");
if (non_void_return) {
- if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) {
+ if (!constructor) {
Append(prepare, "$r=");
} else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) {
Append(prepare, "$r=");