Fix stack overflow when overriding wx.CustomObject.SetData

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.
This commit is contained in:
Scott Talbert
2020-05-31 13:43:32 -04:00
parent bda5fbefd7
commit 5e190eb42e
2 changed files with 18 additions and 4 deletions

View File

@@ -340,11 +340,11 @@ def run():
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)

View File

@@ -908,16 +908,30 @@ from .%s import *
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)