Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/giscanner/glibtransformer.py
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2009-02-25 23:43:14 (GMT)
committer Colin Walters <walters@verbum.org>2009-02-26 19:07:21 (GMT)
commit4470a24e8cf3827efaddcfe240c3271cf1a0d6c0 (patch)
tree4bbcd76c1c325c403ec0408a81489ab97c5465f0 /giscanner/glibtransformer.py
parent251de52b083d3e0e42f25cb164a46865c2c2b9a9 (diff)
Bug 557383 - Virtual function support
In order to determine whether a method is virtual, by default we look at the class table to find a callback field. This should be fairly reliable, but we may also later need annotations to more finely control this in the case of a name clash with a signal.
Diffstat (limited to 'giscanner/glibtransformer.py')
-rw-r--r--giscanner/glibtransformer.py21
1 files changed, 17 insertions, 4 deletions
diff --git a/giscanner/glibtransformer.py b/giscanner/glibtransformer.py
index 5a7a96d..fc7f17c 100644
--- a/giscanner/glibtransformer.py
+++ b/giscanner/glibtransformer.py
@@ -159,6 +159,10 @@ class GLibTransformer(object):
except KeyError, e:
print "WARNING: DELETING node %s: %s" % (node.name, e)
self._remove_attribute(node.name)
+ # Another pass, since we need to have the methods parsed
+ # in order to correctly modify them after class/record
+ # pairing
+ for (ns, node) in nodes:
# associate GtkButtonClass with GtkButton
if isinstance(node, Record):
self._pair_class_record(node)
@@ -573,10 +577,19 @@ class GLibTransformer(object):
for field in maybe_class.fields:
if isinstance(field, Field):
field.writable = False
- # TODO: remove this, we should be computing vfuncs instead
- if isinstance(pair_class, GLibInterface):
- for field in maybe_class.fields[1:]:
- pair_class.fields.append(field)
+
+ # Pair up virtual methods by finding a slot in
+ # the class with the same name
+ for field in maybe_class.fields:
+ if not isinstance(field, Callback):
+ continue
+ matched = False
+ for method in pair_class.methods:
+ if (method.name == field.name and
+ len(method.parameters)+1 == len(field.parameters)):
+ method.is_virtual = True
+ break
+
gclass_struct = GLibRecord.from_record(class_struct)
self._remove_attribute(class_struct.name)
self._add_attribute(gclass_struct, True)