Troubleshooting sip assignHelper != NULL assertion

Scott Talbert swt at techie.net
Thu May 28 15:58:44 BST 2020


On Thu, 28 May 2020, Phil Thompson wrote:

>> Hi,
>> 
>> I'm running into the following assertion in wxPython that I don't
>> quite understand:
>> 
>> python3: ../../../../sip/siplib/siplib.c:3444: parseResult: Assertion
>> `assign_helper != NULL' failed.
>> 
>> This is the relevant C++ class:
>> 
>> class wxPGWindowList
>> {
>> public:
>>     wxPGWindowList(wxWindow* primary, wxWindow* secondary = NULL)
>>         : m_primary(primary)
>>         , m_secondary(secondary)
>>     {
>>     }
>>
>>     void SetSecondary(wxWindow* secondary) { m_secondary = secondary; }
>>
>>     wxWindow* GetPrimary() const { return m_primary; }
>>     wxWindow* GetSecondary() const { return m_secondary; }
>>
>>     wxWindow*   m_primary;
>>     wxWindow*   m_secondary;
>> };
>
> It doesn't matter what the C++ class looks like, it's the corresponding .sip 
> that would be of interest.

My bad, here it is:
class wxPGWindowList
{
     %Docstring
         PGWindowList(primary, secondary=None)

         Contains a list of editor windows returned by CreateControls.
     %End
     %TypeHeaderCode
         #include <wx/propgrid/editors.h>
     %End

public:
     wxPGWindowList(
         wxWindow * primary,
         wxWindow * secondary = NULL
     );

     void SetSecondary(
         wxWindow * secondary
     );
     %Docstring
         SetSecondary(secondary)
     %End

     wxWindow * GetPrimary() const;
     %Docstring
         GetPrimary() -> wx.Window

         Gets window of primary editor.
     %End

     wxWindow * GetSecondary() const;
     %Docstring
         GetSecondary() -> wx.Window

         Gets window of secondary editor.
     %End

     public:


     %Property(name=Primary, get=GetPrimary)
     %Property(name=Secondary, get=GetSecondary, set=SetSecondary)
};  // end of class wxPGWindowList


>> The assertion occurs when trying to return an instance of
>> wxPGWindowList in a Python method, e.g.:
>> 
>> def foo():
>>     return wxpg.PGWindowList(a, b)
>> 
>> From what I can tell, there is no assignment helper assigned by sip
>> because there is no default constructor?  I may be missing something,
>> but I can't see why a default constructor would be needed.
>
> You don't say what version of the sip module you are using but I'm guessing 
> that that assertion is when it's parsing the Python object returned by a 
> re-implementation of a C++ virtual. That doesn't seem to be happening in the 
> above which suggests things aren't happening where you think they are.

sip module version is 4.19.19.  You are correct, I oversimplified what is 
actually happening.  This is really what is happening:

class LargeImageEditor(wxpg.PGEditor):
     def CreateControls(self, propgrid, property, pos, sz):
         ...
         return wxpg.PGWindowList(self.tc, btn)

Where CreateControls is a C++ virtual, relevant .sip snippet:

     virtual
     wxPGWindowList CreateControls(
         wxPropertyGrid * propgrid,
         wxPGProperty * property,
         const wxPoint & pos,
         const wxSize & size
     ) const = 0;
     %Docstring
         CreateControls(propgrid, property, pos, size) -> PGWindowList

         Instantiates editor controls.
     %End

Thanks,
Scott


More information about the PyQt mailing list