From 25a28bf6cc547d5ee02d4aeeb527acbbcd9319e9 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Sun, 18 Sep 2011 04:52:28 +0000 Subject: [PATCH] * Enable the use of the KeepReference annotation * Use keepReference=True for the dc and buffer args in the buffered DCs to ensure that the target DC and the buffer are not GC's before the buffered DC is. * Change #defines to output a "const int NAME" instead of an enum. It looks lots better, and is closer to the truth. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxPython/Phoenix/trunk@69139 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- etg/dcbuffer.py | 19 +++++++++++++------ etgtools/extractors.py | 8 ++++++-- etgtools/sip_generator.py | 6 +++++- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/etg/dcbuffer.py b/etg/dcbuffer.py index 0b1ca78d..7abc971e 100644 --- a/etg/dcbuffer.py +++ b/etg/dcbuffer.py @@ -18,8 +18,8 @@ DOCSTRING = "" # The classes and/or the basename of the Doxygen XML files to be processed by # this script. ITEMS = [ 'wxBufferedDC', - 'wxAutoBufferedPaintDC', 'wxBufferedPaintDC', + 'wxAutoBufferedPaintDC', ] #--------------------------------------------------------------------------- @@ -33,17 +33,24 @@ def run(): # Tweak the parsed meta objects in the module object as needed for # customizing the generated code and docstrings. - + module.addHeaderCode("#include ") + c = module.find('wxBufferedDC') c.addPrivateCopyCtor() + for m in c.find('wxBufferedDC').all() + c.find('Init').all(): + if m.findItem('dc'): + m.findItem('dc').keepReference = True + if m.findItem('buffer'): + m.findItem('buffer').keepReference = True + + + c = module.find('wxBufferedPaintDC') + c.addPrivateCopyCtor() + c.find('wxBufferedPaintDC').findOverload('wxBitmap').find('buffer').keepReference = True c = module.find('wxAutoBufferedPaintDC') c.addPrivateCopyCtor() - c = module.find('wxBufferedPaintDC') - c.addPrivateCopyCtor() - - #----------------------------------------------------------------- tools.doCommonTweaks(module) diff --git a/etgtools/extractors.py b/etgtools/extractors.py index b683a06a..856f0386 100644 --- a/etgtools/extractors.py +++ b/etgtools/extractors.py @@ -410,6 +410,7 @@ class ParamDef(BaseDef): self.transfer = False # transfer ownership of arg to C++? self.transferBack = False # transfer ownership of arg from C++ to Python? self.transferThis = False # ownership of 'this' pointer transfered to this arg + self.keepReference = False # an extra reference to the arg is held self.__dict__.update(kw) if element is not None: self.extract(element) @@ -767,7 +768,7 @@ class DefineDef(BaseDef): def __init__(self, element, **kw): super(DefineDef, self).__init__() self.name = element.find('name').text - self.value = element.find('initializer').text + self.value = flattenNode(element.find('initializer')) self.__dict__.update(kw) @@ -972,10 +973,13 @@ class ModuleDef(BaseDef): elif kind == 'define': # if it doesn't have a value, it must be a macro. - value = element.findtext("initializer") + value = flattenNode(element.find("initializer")) if not value: skippingMsg(kind, element) else: + # NOTE: This assumes that the #defines are numeric values. + # There will have to be some tweaking done for items that are + # not numeric... extractingMsg(kind, element) item = DefineDef(element) self.items.append(item) diff --git a/etgtools/sip_generator.py b/etgtools/sip_generator.py index ef1bf35d..5b437449 100644 --- a/etgtools/sip_generator.py +++ b/etgtools/sip_generator.py @@ -231,7 +231,9 @@ from %s import * assert isinstance(define, extractors.DefineDef) if define.ignored: return - stream.write('enum { %s };\n' % define.name) + # We're assuming that the #define is an integer value, tell sip that it is + #stream.write('enum { %s };\n' % define.name) + stream.write('const int %s;\n' % define.name) #----------------------------------------------------------------------- @@ -603,6 +605,8 @@ from %s import * annotations.append('Array') if item.arraySize: annotations.append('ArraySize') + if item.keepReference: + annotations.append('KeepReference') if isinstance(item, (extractors.ParamDef, extractors.FunctionDef)): if item.transfer: