diff options
author | Colin Walters <walters@verbum.org> | 2009-02-25 23:43:14 (GMT) |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2009-02-26 19:07:21 (GMT) |
commit | 4470a24e8cf3827efaddcfe240c3271cf1a0d6c0 (patch) | |
tree | 4bbcd76c1c325c403ec0408a81489ab97c5465f0 /giscanner/glibtransformer.py | |
parent | 251de52b083d3e0e42f25cb164a46865c2c2b9a9 (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.py | 21 |
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) |