Don't use __Pyx_PyObject_CallMethO on cyfunctions #1728
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This code
is confusing bound and unbound methods. In particular, it can happen that
func
is a cyfunction (which is like an unbound method) but that__Pyx_PyObject_CallMethO(func, arg);
is called which assumes thatfunc
is a bound method.In particular, the following Cython code is buggy when compiled with
binding=True
:The expected result of
call_meth(TestMethodOneArg())
is aTypeError
becausemeth()
is called withoutarg
. The actual result is thatmeth()
is called withself=TestMethodOneArg.meth.__func__
andarg=x
.It's not entirely clear what should be fixed (maybe it's already a bug that the unbound method
func
has theMETH_O
flag set?), but simply dropping the check for cyfunctions in the C code above fixes the problem for me.