diff options
author | Olly Betts <olly@survex.com> | 2020-12-09 09:48:55 +1300 |
---|---|---|
committer | Olly Betts <olly@survex.com> | 2021-03-18 10:58:44 +1300 |
commit | 2e7da86b2ced479e48741cc8713479dee426be61 (patch) | |
tree | 91481c686a633d1fb7bcc1a420e9923d4eac00f3 | |
parent | 57cb95318a93ec9e09c4445aaaccd6fb80ab2cf9 (diff) | |
download | swig-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.current | 4 | ||||
-rw-r--r-- | Examples/test-suite/director_overload.i | 11 | ||||
-rw-r--r-- | Examples/test-suite/php/director_overload_runme.php | 18 | ||||
-rw-r--r-- | Source/Modules/php.cxx | 4 |
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="); |