Troubleshooting sip assignHelper != NULL assertion
Phil Thompson
phil at riverbankcomputing.com
Thu May 28 16:11:52 BST 2020
On 28/05/2020 15:58, Scott Talbert wrote:
> 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
So SIP need to copy the wxPGWindowList from the stack to the heap.
Shouldn't CreateControls return a pointer to the wxPGWindowList?
Of course SIP should detect this when generating the code rather than
rely on a runtime assertion.
Phil
More information about the PyQt
mailing list