Overloaded C++ function Python wrappers now raise a TypeError instead of NotImplementedError
Occurs when the types passed are incorrect. This change means there is now consistency with non-overloaded function wrappers which have always raised TypeError when the incorrect types are passed. See issue #1293
This commit is contained in:
parent
8f224694e7
commit
fd651ff4e2
6 changed files with 32 additions and 14 deletions
|
|
@ -7,6 +7,27 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
|||
Version 4.0.0 (in progress)
|
||||
===========================
|
||||
|
||||
2018-07-31: wsfulton
|
||||
[Python] #1293 Overloaded C++ function wrappers now raise a TypeError instead
|
||||
of NotImplementedError when the types passed are incorrect. This change means
|
||||
there is now consistency with non-overloaded function wrappers which have always
|
||||
raised TypeError when the incorrect types are passed. The error message remains
|
||||
the same and is for example now:
|
||||
|
||||
TypeError: Wrong number or type of arguments for overloaded function 'f'.
|
||||
Possible C/C++ prototypes are:
|
||||
f(int)
|
||||
f(char const *)
|
||||
|
||||
instead of:
|
||||
|
||||
NotImplementedError: Wrong number or type of arguments for overloaded function 'f'.
|
||||
Possible C/C++ prototypes are:
|
||||
f(int)
|
||||
f(char const *)
|
||||
|
||||
*** POTENTIAL INCOMPATIBILITY ***
|
||||
|
||||
2018-06-23: wsfulton
|
||||
[Python] #718 Fix pythonnondynamic feature for modern classes
|
||||
|
||||
|
|
|
|||
|
|
@ -4894,7 +4894,7 @@ If you don't you'll get an error message along the lines of:
|
|||
Traceback (most recent call last):
|
||||
File "runme.py", line 3, in >module<
|
||||
example.foo(["foo", "bar", "spam", "1"])
|
||||
NotImplementedError: Wrong number or type of arguments for overloaded function 'foo'.
|
||||
TypeError: Wrong number or type of arguments for overloaded function 'foo'.
|
||||
Possible C/C++ prototypes are:
|
||||
foo(int, char **)
|
||||
foo()
|
||||
|
|
|
|||
|
|
@ -95,14 +95,18 @@ if li_std_string_extra.test_value_basic_overload(123) != "int":
|
|||
|
||||
try:
|
||||
li_std_string_extra.test_value_basic_overload([x])
|
||||
raise RuntimeError, "should throw NotImplementedError"
|
||||
except NotImplementedError:
|
||||
raise RuntimeError, "should throw TypeError"
|
||||
except TypeError as e:
|
||||
if str(e).find("Possible C/C++ prototypes are:") == -1:
|
||||
raise RuntimeError("Incorrect error message text:\n{}".format(e))
|
||||
pass
|
||||
|
||||
try:
|
||||
li_std_string_extra.test_value_basic_overload([123])
|
||||
raise RuntimeError, "should throw NotImplementedError"
|
||||
except NotImplementedError:
|
||||
raise RuntimeError, "should throw TypeError"
|
||||
except TypeError as e:
|
||||
if str(e).find("Possible C/C++ prototypes are:") == -1:
|
||||
raise RuntimeError("Incorrect error message text:\n{}".format(e))
|
||||
pass
|
||||
|
||||
# Global variables
|
||||
|
|
|
|||
|
|
@ -549,14 +549,9 @@ def checkOverload(t, name, val, delta, prevval, limit):
|
|||
if t.ovr_str(val + delta) == name:
|
||||
raise RuntimeError, "bad " + name + " typemap"
|
||||
if val == limit:
|
||||
# Should raise NotImplementedError here since this is the largest integral type
|
||||
raise RuntimeError, "bad " + name + " typemap"
|
||||
except NotImplementedError:
|
||||
# NotImplementedError is expected only if this is the most extreme type
|
||||
if val != limit:
|
||||
# Should raise TypeError here since this is the largest integral type
|
||||
raise RuntimeError, "bad " + name + " typemap"
|
||||
except TypeError:
|
||||
# TypeError is raised instead if swig is run with -O or -fastdispatch
|
||||
if val != limit:
|
||||
raise RuntimeError, "bad " + name + " typemap"
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,5 @@ if varargs.test_plenty("Hello", 1, 2) != "Hello":
|
|||
try:
|
||||
varargs.test_plenty("Hello", 1, 2, 3)
|
||||
raise RuntimeError
|
||||
except NotImplementedError:
|
||||
pass
|
||||
except TypeError:
|
||||
pass
|
||||
|
|
|
|||
|
|
@ -2645,7 +2645,7 @@ public:
|
|||
Delete(fulldecl);
|
||||
} while ((sibl = Getattr(sibl, "sym:nextSibling")));
|
||||
Append(f->code, "fail:\n");
|
||||
Printf(f->code, " SWIG_SetErrorMsg(PyExc_NotImplementedError,"
|
||||
Printf(f->code, " SWIG_SetErrorMsg(PyExc_TypeError,"
|
||||
"\"Wrong number or type of arguments for overloaded function '%s'.\\n\"" "\n\" Possible C/C++ prototypes are:\\n\"%s);\n", symname, protoTypes);
|
||||
Printf(f->code, "return %s;\n", builtin_ctor ? "-1" : "0");
|
||||
Delete(protoTypes);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue