[C++-sig] Segfault with keyword arguments and overloads.
Alex Mohr
amohr at pixar.com
Wed Aug 7 19:06:24 CEST 2013
Thanks for your response. I've responded to your comments in-line below.
After further investigation, I believe this can be fixed by simply
checking for None when we get 'kv' from f->m_arg_names while resolving
keywords. If we encounter None, that means the overload doesn't accept
a keyword argument in that position (so not enough positional args were
passed), and we can reject the overload.
If it works, I think that's a simple, targeted fix that isn't
particularly risky. I'll try to work up a patch.
On 8/7/2013 3:21 AM, Alex Leach wrote:
> I think the signature looks incorrect here. From my understanding of
> signatures, if you define one argument name, you should define the name
> for all arguments. On class methods, this includes adding an arg for
> 'self'.
That makes sense if I was interested in the auto-docstring generation,
but I'm not: in fact we don't use it.
Reading the docs for boost::python::def, and
boost::python::class_<>::def, it seems like trailing keyword arguments
are supported:
http://www.boost.org/doc/libs/1_54_0/libs/python/doc/v2/def.html#def-spec
http://www.boost.org/doc/libs/1_54_0/libs/python/doc/v2/class.html#class_-spec
In particular, "If the longest valid prefix of A1 contains N types and
a1 holds M keywords, an initial sequence of the keywords are used for
all but the first N - M arguments of each overload."
Moreover, it would surprise me if boost.python demanded that if you want
any argument to be a keyword argument then *all* arguments must be
keyword arguments, and the code appears to be written to allow a mixture
of positional and keyword arguments.
> Also, it seems strange that you're assigning the final argument a
> default value, when the actual C++ function has none. I did add the
> corresponding default argument to the C++ function signatures, but that
> still seg faults, so I guess you've got default arguments in your actual
> code (good minimal example, though!). However, the function signature in
> the documentation - ie. from `help(kwargCrash)` - looks correct.
I could have added default args to the C++ functions, but they'd never
be used and thus seemed superfluous so I left them out.
And yes, thanks, providing keyword arguments for all arguments does
workaround the crash, but it's not a very practical option for me, since
I have at least tens of thousands of lines of boost.python wrapping code
to deal with.
It would be nice to just fix the crash bug and have this use-case work
correctly.
Alex
More information about the Cplusplus-sig
mailing list