Dear all, I tried to declare an external c++ class that includes an operator() function in a pxd file. When I then call a class instance, cython generates faulty c++ code. It includes a call to "operator()()", and not a call to the instance object. Here is a minimum working example:
call_operator.pxd: ---- cdef extern from "call_operator.hpp" nogil: cdef cppclass OperatorTest: int operator()() ---- test_call_operator.pyx: ---- from call_operator cimport OperatorTest def test(): cdef OperatorTest t t() ---- Running "cython --cplus test_call_operator.pyx" generates the following code for the test() function: ---- (relevant part only) /* "test_call_operator.pyx":4 * def test(): * cdef OperatorTest t * t() # <<<<<<<<<<<<<< */ operator()(); ---- As you can see, the code that is generated is a call to "operator()()" and not "t()" as it should be. >From what I've been able to work out, the problem seems to be that the call to "t()" is treated as a NameNode in ExprNodes.py and not an AttributeNode. However, I don't know enough about Cython's internals to track where exactly this decision is made. Curiously, this bug isn't always triggered in more complex situations. I had a larger pxd file with multiple external declarations where one class operator() was treated correctly, while others weren't. I haven't been able to find out why this was the case. Ulrich
_______________________________________________ cython-devel mailing list cython-devel@python.org https://mail.python.org/mailman/listinfo/cython-devel