diff --git a/CHANGES.current b/CHANGES.current index 4fc30370a..60023a0c6 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -5,6 +5,14 @@ See the RELEASENOTES file for a summary of changes in each release. Version 3.0.6 (in progress) =========================== +2015-04-24: wsfulton + [Python] Fix #256. Code generated with '-builtin -modernargs' segfaults for any + method taking zero arguments. + + Also fixes: "SystemError: error return without exception set" during error checking + when using just -builtin and the incorrect number of arguments is passed to a class + method expecting zero arguments. + 2015-04-23: wsfulton [Java] Bug #386 - Memory leak fix in (char *STRING, size_t LENGTH) typemaps. diff --git a/Examples/test-suite/python/template_classes_runme.py b/Examples/test-suite/python/template_classes_runme.py new file mode 100644 index 000000000..9c04fee95 --- /dev/null +++ b/Examples/test-suite/python/template_classes_runme.py @@ -0,0 +1,44 @@ +from template_classes import * + +# This test is just testing incorrect number of arguments/parameters checking + +point = PointInt() + +rectangle = RectangleInt() +rectangle.setPoint(point) +rectangle.getPoint() +RectangleInt.static_noargs() +RectangleInt.static_onearg(1) + +fail = True +try: + rectangle.setPoint() +except TypeError, e: + fail = False +if fail: + raise RuntimeError("argument count check failed") + + +fail = True +try: + rectangle.getPoint(0) +except TypeError, e: + fail = False +if fail: + raise RuntimeError("argument count check failed") + +fail = True +try: + RectangleInt.static_noargs(0) +except TypeError, e: + fail = False +if fail: + raise RuntimeError("argument count check failed") + +fail = True +try: + RectangleInt.static_onearg() +except TypeError, e: + fail = False +if fail: + raise RuntimeError("argument count check failed") diff --git a/Examples/test-suite/template_classes.i b/Examples/test-suite/template_classes.i index ebe13bd9f..d357e418e 100644 --- a/Examples/test-suite/template_classes.i +++ b/Examples/test-suite/template_classes.i @@ -18,6 +18,9 @@ class RectangleTest { public: Point& getPoint() {return point;} void setPoint(Point& value) {point = value;} + + static int static_noargs() { return 0; } + static int static_onearg(int i) { return i; } private: Point point; diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx index c85e3b9cd..a6a81b514 100644 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -2713,14 +2713,12 @@ public: Printv(f->locals, " char * kwnames[] = ", kwargs, ";\n", NIL); } - if (use_parse || allow_kwargs || !modernargs) { - if (builtin && in_class && tuple_arguments == 0) { - Printf(parse_args, " if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;\n"); - } else { - Printf(parse_args, ":%s\"", iname); - Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); - funpack = 0; - } + if (builtin && in_class && tuple_arguments == 0) { + Printf(parse_args, " if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_exception_fail(SWIG_TypeError, \"%s takes no arguments\");\n", iname); + } else if (use_parse || allow_kwargs || !modernargs) { + Printf(parse_args, ":%s\"", iname); + Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); + funpack = 0; } else { Clear(parse_args); if (funpack) {