Skip to content

Commit

Permalink
Fix stack overflow when overriding wx.CustomObject.SetData
Browse files Browse the repository at this point in the history
In the implementation of wx.CustomData.SetData, we need to check the
sipSelfWasArg variable to determine whether to call the parent class
implementation of SetData.  To do this, we switched to using addCppMethod_sip
which allows us to access the sipSelfWasArg variable.  The sip generator
stuff for CppMethod_sip needed some additions to match the behavior of
CppMethod.
  • Loading branch information
swt2c committed May 31, 2020
1 parent bda5fbe commit 5e190eb
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
4 changes: 2 additions & 2 deletions etg/dataobj.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,11 +340,11 @@ def CustomDataFormat(format):
body="return wxPyMakeBuffer(self->GetData(), self->GetSize());")

c.find('SetData').ignore()
c.addCppMethod('bool', 'SetData', '(wxPyBuffer* buf)',
c.addCppMethod_sip('bool', 'SetData', '(wxPyBuffer* buf)',
cppSignature='bool (size_t len, const void* buf)',
isVirtual=True,
doc="Copies data from the provided buffer to this data object's buffer",
body="return self->SetData(buf->m_len, buf->m_ptr);")
body="sipRes = (sipSelfWasArg ? sipCpp-> ::wxCustomDataObject::SetData(buf->m_len, buf->m_ptr) : sipCpp->SetData(buf->m_len, buf->m_ptr));")

addGetAllFormats(c)
addBaseVirtuals(c)
Expand Down
18 changes: 16 additions & 2 deletions etgtools/sip_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -908,16 +908,30 @@ def generateCppMethod_sip(self, method, stream, indent=''):
assert isinstance(method, extractors.CppMethodDef_sip)
if method.ignored:
return
_needDocstring = getattr(method, '_needDocstring', True)
cppSig = " [ %s ]" % method.cppSignature if method.cppSignature else ""
if method.isCtor:
stream.write('%s%s%s%s%s;\n' %
(indent, method.name, method.argsString, self.annotate(method), cppSig))
else:
stream.write('%s%s %s%s%s%s;\n' %
(indent, method.type, method.name, method.argsString,
virtual = "virtual " if method.isVirtual else ""
stream.write('%s%s%s %s%s%s%s;\n' %
(indent, virtual, method.type, method.name, method.argsString,
self.annotate(method), cppSig))
# write the docstring
if _needDocstring and not (method.isCtor or method.isDtor):
self.generateDocstring(method, stream, indent)
# We only write a docstring for the first overload, otherwise
# SIP appends them all together.
_needDocstring = False
stream.write('%s%%MethodCode\n' % indent)
if not (method.isCtor and method.isDtor):
stream.write('%sPyErr_Clear();\n' % (indent+' '*4))
stream.write('%sPy_BEGIN_ALLOW_THREADS\n' % (indent+' '*4))
stream.write(nci(method.body, len(indent)+4))
if not (method.isCtor and method.isDtor):
stream.write('%sPy_END_ALLOW_THREADS\n' % (indent+' '*4))
stream.write('%sif (PyErr_Occurred()) sipIsErr = 1;\n' % (indent+' '*4))
stream.write('%s%%End\n\n' % indent)


Expand Down

0 comments on commit 5e190eb

Please sign in to comment.