Merge pull request #1655 from swt2c/fix_customobj_setdata

Fix stack overflow when overriding wx.CustomObject.SetData
This commit is contained in:
Robin Dunn
2020-06-16 16:43:59 -07:00
committed by GitHub
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)