On 10/14/20 14:29 PM, Cristián Maureira-Fredes wrote:

>On 10/14/20 5:21 PM, Stephen Morris wrote:

>> On 10/14/20 12:45 PM, Cristián Maureira-Fredes wrote:

>>

>>> On 10/14/20 1:35 PM, Stephen Morris wrote:

>>>

>>>> On 10/14/20 12:05 PM, Cristián Maureira-Fredes wrote:

>>

>>> >>On 10/12/20 1:14 PM, Stephen Morris wrote:

> [snip]

>

[snip]

>

>> Thank you. I've rebuilt PySide using libclang.so.10 and now I get a 
>> different error message; I count this as progress, and I'll do a bit more 
>> investigation of my own before asking any further questions.

>>



>Thank you Stephen,

>hopefully you can solve the issue soon.



>Feel free to use a service like pastebin to share the full log, so we don't 
>miss any detail.



I was too optimistic; the 'different error message' was just the linker failing 
to find libclang.so.10 because I'd failed to add its path to my LD_LIBRARY_PATH.



Once I'd done that, it was straight back to the old error; same line number and 
everything:



<myproject>_wrapper.cpp: In function ‘int 
Sbk_icp_RenderWindow_setattro(PyObject*, PyObject*, PyObject*)’:

<myproject>_wrapper.cpp:1984:66: error: ‘PySide::Property’ has not been declared

     Shiboken::AutoDecRef pp(reinterpret_cast<PyObject 
*>(PySide::Property::getObject(self, name)));

                                                                  ^~~~~~~~

<myproject>_wrapper.cpp:1986:24: error: ‘PySide::Property’ has not been declared

         return PySide::Property::setValue(reinterpret_cast<PySideProperty 
*>(pp.object()), self, value);

                        ^~~~~~~~

<myproject>_wrapper.cpp:1986:60: error: ‘PySideProperty’ does not name a type; 
did you mean ‘QMetaProperty’?

         return PySide::Property::setValue(reinterpret_cast<PySideProperty 
*>(pp.object()), self, value);

                                                            ^~~~~~~~~~~~~~

                                                           QMetaProperty

<myproject>_wrapper.cpp:1986:75: error: expected ‘>’ before ‘*’ token

         return PySide::Property::setValue(reinterpret_cast<PySideProperty 
*>(pp.object()), self, value);

                                                                           ^

<myproject>_wrapper.cpp:1986:75: error: expected ‘(’ before ‘*’ token

         return PySide::Property::setValue(reinterpret_cast<PySideProperty 
*>(pp.object()), self, value);

                                                                           
<myproject>

                                                                           (

<myproject>_wrapper.cpp:1986:76: error: expected primary-expression before ‘>’ 
token

         return PySide::Property::setValue(reinterpret_cast<PySideProperty 
*>(pp.object()), self, value);



Again, manually editing the wrapper file at this point and adding ‘#include 
“pysideproperty.h”’ near the beginning is all I need to do to get the build to 
complete successfully.



I’ve done a direct comparison between the wrapper file generated by version 
5.15.1 and version 5.12.5. The problem originates in a new function that 
appears in the 5.15.1 version, and that has no counterpart in the 5.12.5 
version. It’s short, so I can paste it here in full:



static int Sbk_icp_RenderWindow_setattro(PyObject *self, PyObject *name, 
PyObject *value)

{

    if (value && PyCallable_Check(value)) {

        auto plain_inst = reinterpret_cast< ::icp::RenderWindow 
*>(Shiboken::Conversions::cppPointer(SbkRenderCellViewTypes[SBK_ICP_RENDERWINDOW_IDX],
 reinterpret_cast<SbkObject *>(self)));

        auto inst = dynamic_cast<RenderWindowWrapper *>(plain_inst);

        if (inst)

            inst->resetPyMethodCache();

    }

    Shiboken::AutoDecRef pp(reinterpret_cast<PyObject 
*>(PySide::Property::getObject(self, name)));        <- THE PROBLEM IS IN THIS 
LINE

    if (!pp.isNull())

        return PySide::Property::setValue(reinterpret_cast<PySideProperty 
*>(pp.object()), self, value);   <- AND THIS ONE

    return PyObject_GenericSetAttr(self, name, value);

}



This function is used to populate a table of slots later in the file: comparing 
the two versions,



5.12.5 version:



static PyType_Slot Sbk_icp_RenderWindow_slots[] = {

    {Py_tp_base,        nullptr}, // inserted by introduceWrapperType

    {Py_tp_dealloc,     reinterpret_cast<void *>(&SbkDeallocWrapper)},

    {Py_tp_repr,        nullptr},

    {Py_tp_hash,        nullptr},

    {Py_tp_call,        nullptr},

    {Py_tp_str,         nullptr},

    {Py_tp_getattro,    nullptr},

    {Py_tp_setattro,    nullptr},                                               
     <- * NOTHING DEFINED HERE *

    {Py_tp_traverse,    reinterpret_cast<void 
*>(Sbk_icp_RenderWindow_traverse)},

    {Py_tp_clear,       reinterpret_cast<void *>(Sbk_icp_RenderWindow_clear)},

    {Py_tp_richcompare, nullptr},

    {Py_tp_iter,        nullptr},

    {Py_tp_iternext,    nullptr},

    {Py_tp_methods,     reinterpret_cast<void *>(Sbk_icp_RenderWindow_methods)},

    {Py_tp_getset,      nullptr},

    {Py_tp_init,        reinterpret_cast<void *>(Sbk_icp_RenderWindow_Init)},

    {Py_tp_new,         reinterpret_cast<void *>(SbkObjectTpNew)},

    {0, nullptr}

};



5.15.1 version:



static PyType_Slot Sbk_icp_RenderWindow_slots[] = {

    {Py_tp_base,        nullptr}, // inserted by introduceWrapperType

    {Py_tp_dealloc,     reinterpret_cast<void *>(&SbkDeallocWrapper)},

    {Py_tp_repr,        nullptr},

    {Py_tp_hash,        nullptr},

    {Py_tp_call,        nullptr},

    {Py_tp_str,         nullptr},

    {Py_tp_getattro,    nullptr},

    {Py_tp_setattro,    reinterpret_cast<void 
*>(Sbk_icp_RenderWindow_setattro)},  <- * NEW FUNCTION REFERENCED HERE *

    {Py_tp_traverse,    reinterpret_cast<void 
*>(Sbk_icp_RenderWindow_traverse)},

    {Py_tp_clear,       reinterpret_cast<void *>(Sbk_icp_RenderWindow_clear)},

    {Py_tp_richcompare, nullptr},

    {Py_tp_iter,        nullptr},

    {Py_tp_iternext,    nullptr},

    {Py_tp_methods,     reinterpret_cast<void *>(Sbk_icp_RenderWindow_methods)},

    {Py_tp_getset,      nullptr},

    {Py_tp_init,        reinterpret_cast<void *>(Sbk_icp_RenderWindow_Init)},

    {Py_tp_new,         reinterpret_cast<void *>(SbkObjectTpNew)},

    {0, nullptr}

};



Does this shed any light on things?



I know that the usual outcome of these things involves writing a minimal 
example that reproduces the problem. That would be challenging this case, since 
it’s a fairly large library written by someone else. But if the above offers 
any clues, then great.



I’d be satisfied if I could just find a programmatic way of injecting the 
missing #include at the beginning of the file.  Having to wait until my build 
breaks before intervening by manually editing an auto-generated file feels all 
wrong.



Thanks,

Stephen.


_______________________________________________
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside

Reply via email to