Python fastdispatch error message improvements
When overloaded C++ methods are called, the fastdispatch mode sometimes optimises out the generation of the typecheck typemap code, resulting in the 'Possible C/C++ prototypes' information not being in the error message. Now when a TypeError is thrown, the exception message is modified to contain the 'Possible C/C++ prototypes'. See issue #1293
This commit is contained in:
parent
e0b23969d0
commit
4f7406624d
6 changed files with 79 additions and 16 deletions
|
|
@ -442,7 +442,7 @@ String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *
|
|||
|
||||
/* Loop over the functions */
|
||||
|
||||
bool emitcheck = 1;
|
||||
bool emitcheck = true;
|
||||
for (i = 0; i < nfunc; i++) {
|
||||
int fn = 0;
|
||||
Node *ni = Getitem(dispatch, i);
|
||||
|
|
@ -518,7 +518,7 @@ String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *
|
|||
if (tml)
|
||||
Replaceid(tml, Getattr(pl, "lname"), "_v");
|
||||
if (!tml || Cmp(tm, tml))
|
||||
emitcheck = 1;
|
||||
emitcheck = true;
|
||||
//printf("tmap: %s[%d] (%d) => %s\n\n",
|
||||
// Char(Getattr(nk, "sym:name")),
|
||||
// l, emitcheck, tml?Char(tml):0);
|
||||
|
|
@ -610,7 +610,7 @@ String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *
|
|||
/*
|
||||
Fast dispatch mechanism, provided by Salvador Fandi~no Garc'ia (#930586).
|
||||
*/
|
||||
String *Swig_overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *maxargs) {
|
||||
static String *overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *maxargs, const_String_or_char_ptr fmt_fastdispatch) {
|
||||
int i, j;
|
||||
|
||||
*maxargs = 1;
|
||||
|
|
@ -653,6 +653,7 @@ String *Swig_overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *
|
|||
|
||||
// printf("overload: %s coll=%d\n", Char(Getattr(n, "sym:name")), Len(coll));
|
||||
|
||||
bool emitcheck = false;
|
||||
int num_braces = 0;
|
||||
bool test = (Len(coll) > 0 && num_arguments);
|
||||
if (test) {
|
||||
|
|
@ -673,7 +674,7 @@ String *Swig_overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *
|
|||
|
||||
/* if all the wrappers have the same type check on this
|
||||
argument we can optimize it out */
|
||||
bool emitcheck = 0;
|
||||
emitcheck = false;
|
||||
for (int k = 0; k < Len(coll) && !emitcheck; k++) {
|
||||
Node *nk = Getitem(coll, k);
|
||||
Parm *pk = Getattr(nk, "wrap:parms");
|
||||
|
|
@ -695,7 +696,7 @@ String *Swig_overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *
|
|||
if (tml)
|
||||
Replaceid(tml, Getattr(pl, "lname"), "_v");
|
||||
if (!tml || Cmp(tm, tml))
|
||||
emitcheck = 1;
|
||||
emitcheck = true;
|
||||
//printf("tmap: %s[%d] (%d) => %s\n\n",
|
||||
// Char(Getattr(nk, "sym:name")),
|
||||
// l, emitcheck, tml?Char(tml):0);
|
||||
|
|
@ -752,8 +753,8 @@ String *Swig_overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *
|
|||
for ( /* empty */ ; num_braces > 0; num_braces--)
|
||||
Printf(f, "}\n");
|
||||
|
||||
|
||||
String *lfmt = ReplaceFormat(fmt, num_arguments);
|
||||
// The language module may want to generate different code for last overloaded function called (with same number of arguments)
|
||||
String *lfmt = ReplaceFormat(!emitcheck && fmt_fastdispatch ? fmt_fastdispatch : fmt, num_arguments);
|
||||
Printf(f, Char(lfmt), Getattr(ni, "wrap:name"));
|
||||
|
||||
Printf(f, "}\n"); /* braces closes "if" for this method */
|
||||
|
|
@ -770,10 +771,10 @@ String *Swig_overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *
|
|||
return f;
|
||||
}
|
||||
|
||||
String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *maxargs) {
|
||||
String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *maxargs, const_String_or_char_ptr fmt_fastdispatch) {
|
||||
|
||||
if (fast_dispatch_mode || GetFlag(n, "feature:fastdispatch")) {
|
||||
return Swig_overload_dispatch_fast(n, fmt, maxargs);
|
||||
return overload_dispatch_fast(n, fmt, maxargs, fmt_fastdispatch);
|
||||
}
|
||||
|
||||
int i, j;
|
||||
|
|
|
|||
|
|
@ -2578,13 +2578,16 @@ public:
|
|||
|
||||
String *tmp = NewString("");
|
||||
String *dispatch;
|
||||
const char *dispatch_code = funpack ? "return %s(self, argc, argv);" :
|
||||
(builtin_ctor ? "return %s(self, args, NULL);" : "return %s(self, args);");
|
||||
|
||||
const char *dispatch_call = funpack ? "%s(self, argc, argv);" : (builtin_ctor ? "%s(self, args, NULL);" : "%s(self, args);");
|
||||
String *dispatch_code = NewStringf("return %s", dispatch_call);
|
||||
|
||||
if (castmode) {
|
||||
dispatch = Swig_overload_dispatch_cast(n, dispatch_code, &maxargs);
|
||||
} else {
|
||||
dispatch = Swig_overload_dispatch(n, dispatch_code, &maxargs);
|
||||
String *fastdispatch_code = NewStringf("PyObject *retobj = %s\nif (!SWIG_Python_TypeErrorOccurred(retobj)) return retobj;\nSWIG_fail;", dispatch_call);
|
||||
dispatch = Swig_overload_dispatch(n, dispatch_code, &maxargs, fastdispatch_code);
|
||||
Delete(fastdispatch_code);
|
||||
}
|
||||
|
||||
/* Generate a dispatch wrapper for all overloaded functions */
|
||||
|
|
@ -2645,7 +2648,7 @@ public:
|
|||
Delete(fulldecl);
|
||||
} while ((sibl = Getattr(sibl, "sym:nextSibling")));
|
||||
Append(f->code, "fail:\n");
|
||||
Printf(f->code, " SWIG_SetErrorMsg(PyExc_TypeError,"
|
||||
Printf(f->code, " SWIG_Python_RaiseOrModifyTypeError("
|
||||
"\"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);
|
||||
|
|
@ -2662,6 +2665,7 @@ public:
|
|||
}
|
||||
DelWrapper(f);
|
||||
Delete(dispatch);
|
||||
Delete(dispatch_code);
|
||||
Delete(tmp);
|
||||
Delete(wname);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -375,9 +375,8 @@ void emit_mark_varargs(ParmList *l);
|
|||
String *emit_action(Node *n);
|
||||
int emit_action_code(Node *n, String *wrappercode, String *action);
|
||||
void Swig_overload_check(Node *n);
|
||||
String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *);
|
||||
String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *, const_String_or_char_ptr fmt_fastdispatch = 0);
|
||||
String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *);
|
||||
String *Swig_overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *);
|
||||
List *Swig_overload_rank(Node *n, bool script_lang_wrapping);
|
||||
SwigType *cplus_value_type(SwigType *t);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue