summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Schönfeld <kaffeetisch@gmx.de>2011-10-02 17:20:45 +0200
committerTorsten Schönfeld <kaffeetisch@gmx.de>2013-02-10 19:40:27 +0100
commit05f400942d2f3ac9a721bbfad5d58b6aa1d93cc9 (patch)
tree4aac3236bc99c762ce2885ee0e8febafd2e2fb5a
parente9939eeb1cd0a2626b968fd72387681366ecb61b (diff)
downloadgobject-introspection-05f400942d2f3ac9a721bbfad5d58b6aa1d93cc9.tar.gz
scanner: remove backcompat copies more safely
Instead of modifying the namespace while we are iterating over it, which leads to nodes not being tested, set an 'internal_skipped' property on the function and read it in the GIR writer. https://bugzilla.gnome.org/show_bug.cgi?id=660698
-rw-r--r--giscanner/ast.py1
-rw-r--r--giscanner/girwriter.py2
-rw-r--r--giscanner/introspectablepass.py8
3 files changed, 7 insertions, 4 deletions
diff --git a/giscanner/ast.py b/giscanner/ast.py
index f3639fe6..1806720e 100644
--- a/giscanner/ast.py
+++ b/giscanner/ast.py
@@ -613,6 +613,7 @@ class Function(Callable):
self.shadowed_by = None # C symbol string
self.shadows = None # C symbol string
self.moved_to = None # namespaced function name string
+ self.internal_skipped = False # if True, this func will not be written to GIR
def clone(self):
clone = copy.copy(self)
diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py
index c54a5389..90f7e1ed 100644
--- a/giscanner/girwriter.py
+++ b/giscanner/girwriter.py
@@ -173,6 +173,8 @@ and/or use gtk-doc annotations. ''')
self._write_parameters(callable)
def _write_function(self, func, tag_name='function'):
+ if func.internal_skipped:
+ return
attrs = []
if hasattr(func, 'symbol'):
attrs.append(('c:identifier', func.symbol))
diff --git a/giscanner/introspectablepass.py b/giscanner/introspectablepass.py
index b87156a8..460c8200 100644
--- a/giscanner/introspectablepass.py
+++ b/giscanner/introspectablepass.py
@@ -229,8 +229,8 @@ class IntrospectablePass(object):
def _remove_non_reachable_backcompat_copies(self, obj, stack):
if obj.skip:
return False
- if (isinstance(obj, ast.Function)
- and not obj.introspectable
- and obj.moved_to is not None):
- self._namespace.remove(obj)
+ if (isinstance(obj, ast.Function) and obj.moved_to is not None):
+ # remove functions that are not introspectable
+ if not obj.introspectable:
+ obj.internal_skipped = True
return True