From 509b14ac6f32a8ac6a0abbc8266cc6d274ceb9db Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 10 Feb 2019 13:31:54 +0100 Subject: [PATCH 1/2] Add Python run-time test for ignore_parameter.i This will allow to test the upcoming fix for wrongly handling "%ignore" for parameters in the test suite. --- .../python/ignore_parameter_runme.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Examples/test-suite/python/ignore_parameter_runme.py diff --git a/Examples/test-suite/python/ignore_parameter_runme.py b/Examples/test-suite/python/ignore_parameter_runme.py new file mode 100644 index 000000000..d804897e9 --- /dev/null +++ b/Examples/test-suite/python/ignore_parameter_runme.py @@ -0,0 +1,21 @@ +from ignore_parameter import * + +def check(a, b): + if a != b: + raise RuntimeError('"%s" != "%s"' % (a, b)) + +check(jaguar(200, 0), "hello") +check(lotus("foo", 1), 101) +check(tvr("bar", 2), 8.8) +check(ferrari(), 101) + +car = SportsCars() +check(car.daimler(200, 0), "hello") +check(car.astonmartin("foo", 1), 101) +check(car.bugatti("bar", 2), 8.8) +check(car.lamborghini(), 101) + +MiniCooper(200, 0) +MorrisMinor("baz", 0) +FordAnglia("quux", 200) +AustinAllegro() From 2517f5b05ed62f16d4da1a8045543cc553da732f Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 10 Feb 2019 13:40:12 +0100 Subject: [PATCH 2/2] Don't apply %ignore to parameters Fix regression introduced by 3f5c17824c5f20023bac58f7ebfc8de8532d6881 which resulted in using "$ignore" instead of the real parameter name in Python if an %ignore/%rename($ignore) for the parameter name was used (as could happen not necessarily intentionally when using wild card ignores with regex matches) by explicitly checking if we're dealing with a parameter node in apply_rename(), used by Swig_name_make(), and not renaming it to "$ignore" in this case. Extend the test suite to check for this case. Closes #1460. --- Examples/test-suite/ignore_parameter.i | 4 ++++ .../test-suite/python/ignore_parameter_runme.py | 2 ++ Source/Swig/naming.c | 13 ++++++++----- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Examples/test-suite/ignore_parameter.i b/Examples/test-suite/ignore_parameter.i index bc0892c3a..604ee3b84 100644 --- a/Examples/test-suite/ignore_parameter.i +++ b/Examples/test-suite/ignore_parameter.i @@ -8,12 +8,15 @@ %typemap(freearg) char* a ""; // ensure freearg is not generated (needed for Java at least) +%ignore unignorable; + %inline %{ // global function tests char* jaguar(char* a, int b, double c) { return a; } int lotus(char* aa, int bb, double cc) { return bb; } double tvr(char* aaa, int bbb, double ccc) { return ccc; } int ferrari(int bb) { return bb; } +int fiat(int unignorable) { return unignorable; } // member function tests struct SportsCars { @@ -21,6 +24,7 @@ struct SportsCars { int astonmartin(char* aa, int bb, double cc) { return bb; } double bugatti(char* aaa, int bbb, double ccc) { return ccc; } int lamborghini(int bb) { return bb; } + int maseratti(int unignorable) { return unignorable; } }; // constructor tests diff --git a/Examples/test-suite/python/ignore_parameter_runme.py b/Examples/test-suite/python/ignore_parameter_runme.py index d804897e9..5f1342e4a 100644 --- a/Examples/test-suite/python/ignore_parameter_runme.py +++ b/Examples/test-suite/python/ignore_parameter_runme.py @@ -8,12 +8,14 @@ check(jaguar(200, 0), "hello") check(lotus("foo", 1), 101) check(tvr("bar", 2), 8.8) check(ferrari(), 101) +check(fiat(17), 17) car = SportsCars() check(car.daimler(200, 0), "hello") check(car.astonmartin("foo", 1), 101) check(car.bugatti("bar", 2), 8.8) check(car.lamborghini(), 101) +check(car.maseratti(289), 289) MiniCooper(200, 0) MorrisMinor("baz", 0) diff --git a/Source/Swig/naming.c b/Source/Swig/naming.c index 180e54774..136df1987 100644 --- a/Source/Swig/naming.c +++ b/Source/Swig/naming.c @@ -1377,12 +1377,15 @@ void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *ne } -/* Create a name applying rename/namewarn if needed */ -static String *apply_rename(String *newname, int fullname, String *prefix, String *name) { +/* Create a name for the given node applying rename/namewarn if needed */ +static String *apply_rename(Node* n, String *newname, int fullname, String *prefix, String *name) { String *result = 0; if (newname && Len(newname)) { if (Strcmp(newname, "$ignore") == 0) { - result = Copy(newname); + /* $ignore doesn't apply to parameters and while it's rare to explicitly write %ignore directives for them they could be caught by a wildcard ignore using + regex match, just ignore the attempt to ignore them in this case */ + if (!Equal(nodeType(n), "parm")) + result = Copy(newname); } else { char *cnewname = Char(newname); if (cnewname) { @@ -1480,7 +1483,7 @@ String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, if (rn) { String *newname = Getattr(rn, "name"); int fullname = GetFlag(rn, "fullname"); - result = apply_rename(newname, fullname, prefix, name); + result = apply_rename(n, newname, fullname, prefix, name); } if (result && !Equal(result, name)) { /* operators in C++ allow aliases, we look for them */ @@ -1504,7 +1507,7 @@ String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, int fullname = GetFlag(wrn, "fullname"); if (result) Delete(result); - result = apply_rename(rename, fullname, prefix, name); + result = apply_rename(n, rename, fullname, prefix, name); if ((msg) && (Len(msg))) { if (!Getmeta(nname, "already_warned")) { if (n) {