Skip to content

Commit

Permalink
Python code generated with '-builtin -modernargs' segfaults for any m…
Browse files Browse the repository at this point in the history
…ethod 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 swig#256
Closes swig#382
  • Loading branch information
wsfulton committed Apr 24, 2015
1 parent e4d02d2 commit 416277b
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 8 deletions.
8 changes: 8 additions & 0 deletions CHANGES.current
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
44 changes: 44 additions & 0 deletions Examples/test-suite/python/template_classes_runme.py
Original file line number Diff line number Diff line change
@@ -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")
3 changes: 3 additions & 0 deletions Examples/test-suite/template_classes.i
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ class RectangleTest {
public:
Point<T>& getPoint() {return point;}
void setPoint(Point<T>& value) {point = value;}

static int static_noargs() { return 0; }
static int static_onearg(int i) { return i; }
private:
Point<T> point;

Expand Down
14 changes: 6 additions & 8 deletions Source/Modules/python.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 416277b

Please sign in to comment.