From 416277b3a56646c2934ca9ee542a3f36d4f9a436 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Fri, 24 Apr 2015 21:08:17 +0100 Subject: [PATCH] Python 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. Closes #256 Closes #382 --- CHANGES.current | 8 ++++ .../test-suite/python/template_classes_runme.py | 44 ++++++++++++++++++++++ Examples/test-suite/template_classes.i | 3 ++ Source/Modules/python.cxx | 14 +++---- 4 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 Examples/test-suite/python/template_classes_runme.py 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 0000000..9c04fee --- /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 ebe13bd..d357e41 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 c85e3b9..a6a81b5 100644 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -2713,14 +2713,12 @@ class PYTHON:public Language { 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) {