2 # GObject-Introspection - a framework for introspecting GObject libraries
3 # Copyright (C) 2008 Johan Dahlin
4 # Copyright (C) 2008, 2009 Red Hat, Inc.
6 # This library is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU Lesser General Public
8 # License as published by the Free Software Foundation; either
9 # version 2 of the License, or (at your option) any later version.
11 # This library is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # Lesser General Public License for more details.
16 # You should have received a copy of the GNU Lesser General Public
17 # License along with this library; if not, write to the
18 # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 # Boston, MA 02111-1307, USA.
24 from .message import Position
25 from .odict import odict
26 from .utils import to_underscores
29 """A Type can be either:
30 * A reference to a node (target_giname)
31 * A reference to a "fundamental" type like 'utf8'
32 * A "foreign" type - this can be any string."
33 If none are specified, then it's in an "unresolved" state. An
34 unresolved type can have two data sources; a "ctype" which comes
35 from a C type string, or a gtype_name (from g_type_name()).
41 target_fundamental=None,
44 _target_unknown=False,
48 self.gtype_name = gtype_name
49 self.origin_symbol = origin_symbol
51 assert isinstance(self, TypeUnknown)
52 elif target_fundamental:
53 assert target_giname is None
54 assert target_foreign is None
56 assert '.' in target_giname
57 assert target_fundamental is None
58 assert target_foreign is None
60 assert ctype is not None
61 assert target_giname is None
62 assert target_fundamental is None
64 assert (ctype is not None) or (gtype_name is not None)
65 self.target_fundamental = target_fundamental
66 self.target_giname = target_giname
67 self.target_foreign = target_foreign
68 self.is_const = is_const
72 return (self.target_fundamental or
77 def unresolved_string(self):
81 return self.gtype_name
86 def create_from_gtype_name(cls, gtype_name):
87 """Parse a GType name (as from g_type_name()), and return a
88 Type instance. Note that this function performs namespace lookup,
89 in contrast to the other create_type() functions."""
90 # First, is it a fundamental?
91 fundamental = type_names.get(gtype_name)
92 if fundamental is not None:
93 return cls(target_fundamental=fundamental.target_fundamental)
94 if gtype_name == 'GHashTable':
95 return Map(TYPE_ANY, TYPE_ANY, gtype_name=gtype_name)
96 elif gtype_name in ('GArray', 'GPtrArray', 'GByteArray'):
97 return Array('GLib.' + gtype_name[1:], TYPE_ANY,
98 gtype_name=gtype_name)
99 elif gtype_name == 'GStrv':
100 bare_utf8 = TYPE_STRING.clone()
101 bare_utf8.ctype = None
102 return Array(None, bare_utf8, ctype=None, gtype_name=gtype_name,
105 # Workaround for Gdk.Rectangle being boxed alias for
106 # cairo.RectangleInt. G-I does not support boxing of aliases.
107 # See https://bugzilla.gnome.org/show_bug.cgi?id=655423
108 if gtype_name == 'GdkRectangle':
109 gtype_name = 'CairoRectangleInt'
111 return cls(gtype_name=gtype_name)
113 def get_giname(self):
114 assert self.target_giname is not None
115 return self.target_giname.split('.')[1]
117 def __cmp__(self, other):
118 if self.target_fundamental:
119 return cmp(self.target_fundamental, other.target_fundamental)
120 if self.target_giname:
121 return cmp(self.target_giname, other.target_giname)
122 if self.target_foreign:
123 return cmp(self.target_foreign, other.target_foreign)
124 return cmp(self.ctype, other.ctype)
126 def is_equiv(self, typeval):
127 """Return True if the specified types are compatible at
128 an introspection level, disregarding their C types.
129 A sequence may be given for typeval, in which case
130 this function returns True if the type is compatible with
132 if isinstance(typeval, (list, tuple)):
134 if self.is_equiv(val):
137 return self == typeval
140 return Type(target_fundamental=self.target_fundamental,
141 target_giname=self.target_giname,
142 target_foreign=self.target_foreign,
144 is_const=self.is_const)
147 if self.target_fundamental:
148 return self.target_fundamental
149 elif self.target_giname:
150 return self.target_giname
151 elif self.target_foreign:
152 return self.target_foreign
155 if self.target_fundamental:
156 data = 'target_fundamental=%s, ' % (self.target_fundamental, )
157 elif self.target_giname:
158 data = 'target_giname=%s, ' % (self.target_giname, )
159 elif self.target_foreign:
160 data = 'target_foreign=%s, ' % (self.target_foreign, )
163 return '%s(%sctype=%s)' % (self.__class__.__name__, data, self.ctype)
165 class TypeUnknown(Type):
167 Type.__init__(self, _target_unknown=True)
173 TYPE_NONE = Type(target_fundamental='none', ctype='void')
174 TYPE_ANY = Type(target_fundamental='gpointer', ctype='gpointer')
176 TYPE_BOOLEAN = Type(target_fundamental='gboolean', ctype='gboolean')
177 TYPE_INT8 = Type(target_fundamental='gint8', ctype='gint8')
178 TYPE_UINT8 = Type(target_fundamental='guint8', ctype='guint8')
179 TYPE_INT16 = Type(target_fundamental='gint16', ctype='gint16')
180 TYPE_UINT16 = Type(target_fundamental='guint16', ctype='guint16')
181 TYPE_INT32 = Type(target_fundamental='gint32', ctype='gint32')
182 TYPE_UINT32 = Type(target_fundamental='guint32', ctype='guint32')
183 TYPE_INT64 = Type(target_fundamental='gint64', ctype='gint64')
184 TYPE_UINT64 = Type(target_fundamental='guint64', ctype='guint64')
185 TYPE_CHAR = Type(target_fundamental='gchar', ctype='gchar')
186 TYPE_SHORT = Type(target_fundamental='gshort', ctype='gshort')
187 TYPE_USHORT = Type(target_fundamental='gushort', ctype='gushort')
188 TYPE_INT = Type(target_fundamental='gint', ctype='gint')
189 TYPE_UINT = Type(target_fundamental='guint', ctype='guint')
190 TYPE_LONG = Type(target_fundamental='glong', ctype='glong')
191 TYPE_ULONG = Type(target_fundamental='gulong', ctype='gulong')
192 TYPE_SIZE = Type(target_fundamental='gsize', ctype='gsize')
193 TYPE_SSIZE = Type(target_fundamental='gssize', ctype='gssize')
194 TYPE_INTPTR = Type(target_fundamental='gintptr', ctype='gintptr')
195 TYPE_UINTPTR = Type(target_fundamental='guintptr', ctype='guintptr')
197 TYPE_LONG_LONG = Type(target_fundamental='long long', ctype='long long')
198 TYPE_LONG_ULONG = Type(target_fundamental='unsigned long long',
199 ctype='unsigned long long')
200 TYPE_FLOAT = Type(target_fundamental='gfloat', ctype='gfloat')
201 TYPE_DOUBLE = Type(target_fundamental='gdouble', ctype='gdouble')
203 TYPE_LONG_DOUBLE = Type(target_fundamental='long double',
205 TYPE_UNICHAR = Type(target_fundamental='gunichar', ctype='gunichar')
207 # C types with semantics overlaid
208 TYPE_GTYPE = Type(target_fundamental='GType', ctype='GType')
209 TYPE_STRING = Type(target_fundamental='utf8', ctype='gchar*')
210 TYPE_FILENAME = Type(target_fundamental='filename', ctype='gchar*')
212 TYPE_VALIST = Type(target_fundamental='va_list', ctype='va_list')
214 BASIC_GIR_TYPES = [TYPE_BOOLEAN, TYPE_INT8, TYPE_UINT8, TYPE_INT16,
215 TYPE_UINT16, TYPE_INT32, TYPE_UINT32, TYPE_INT64,
216 TYPE_UINT64, TYPE_CHAR, TYPE_SHORT, TYPE_USHORT, TYPE_INT,
217 TYPE_UINT, TYPE_LONG, TYPE_ULONG, TYPE_SIZE, TYPE_SSIZE,
218 TYPE_LONG_LONG, TYPE_LONG_ULONG, TYPE_INTPTR, TYPE_UINTPTR,
219 TYPE_FLOAT, TYPE_DOUBLE,
220 TYPE_LONG_DOUBLE, TYPE_UNICHAR, TYPE_GTYPE]
221 GIR_TYPES = [TYPE_NONE, TYPE_ANY]
222 GIR_TYPES.extend(BASIC_GIR_TYPES)
223 GIR_TYPES.extend([TYPE_STRING, TYPE_FILENAME, TYPE_VALIST])
225 # These are the only basic types that are guaranteed to
226 # be as big as a pointer (and thus are allowed in GPtrArray)
227 POINTER_TYPES = [TYPE_ANY, TYPE_INTPTR, TYPE_UINTPTR]
229 INTROSPECTABLE_BASIC = list(GIR_TYPES)
230 for v in [TYPE_NONE, TYPE_ANY,
231 TYPE_LONG_LONG, TYPE_LONG_ULONG,
232 TYPE_LONG_DOUBLE, TYPE_VALIST]:
233 INTROSPECTABLE_BASIC.remove(v)
236 for typeval in GIR_TYPES:
237 type_names[typeval.target_fundamental] = typeval
238 basic_type_names = {}
239 for typeval in BASIC_GIR_TYPES:
240 basic_type_names[typeval.target_fundamental] = typeval
243 type_names['char'] = TYPE_CHAR
244 type_names['signed char'] = TYPE_INT8
245 type_names['unsigned char'] = TYPE_UINT8
246 type_names['short'] = TYPE_SHORT
247 type_names['signed short'] = TYPE_SHORT
248 type_names['unsigned short'] = TYPE_USHORT
249 type_names['int'] = TYPE_INT
250 type_names['signed int'] = TYPE_INT
251 type_names['unsigned short int'] = TYPE_USHORT
252 type_names['signed'] = TYPE_INT
253 type_names['unsigned int'] = TYPE_UINT
254 type_names['unsigned'] = TYPE_UINT
255 type_names['long'] = TYPE_LONG
256 type_names['signed long'] = TYPE_LONG
257 type_names['unsigned long'] = TYPE_ULONG
258 type_names['unsigned long int'] = TYPE_ULONG
259 type_names['float'] = TYPE_FLOAT
260 type_names['double'] = TYPE_DOUBLE
261 type_names['char*'] = TYPE_STRING
262 type_names['void*'] = TYPE_ANY
263 type_names['void'] = TYPE_NONE
264 # Also alias the signed one here
265 type_names['signed long long'] = TYPE_LONG_LONG
267 # A few additional GLib type aliases
268 type_names['guchar'] = TYPE_UINT8
269 type_names['gchararray'] = TYPE_STRING
270 type_names['gchar*'] = TYPE_STRING
271 type_names['goffset'] = TYPE_INT64
272 type_names['gunichar2'] = TYPE_UINT16
273 type_names['gsize'] = TYPE_SIZE
274 type_names['gssize'] = TYPE_SSIZE
275 type_names['gintptr'] = TYPE_INTPTR
276 type_names['guintptr'] = TYPE_UINTPTR
277 type_names['gconstpointer'] = TYPE_ANY
279 # We used to support these; continue to do so
280 type_names['any'] = TYPE_ANY
281 type_names['boolean'] = TYPE_BOOLEAN
282 type_names['uint'] = TYPE_UINT
283 type_names['ulong'] = TYPE_ULONG
285 # C stdio, used in GLib public headers; squash this for now here
286 # until we move scanning into GLib and can (skip)
287 type_names['FILE*'] = TYPE_ANY
289 # One off C unix type definitions; note some of these may be GNU Libc
290 # specific. If someone is actually bitten by this, feel free to do
291 # the required configure goop to determine their size and replace
294 # We don't want to encourage people to use these in their APIs because
295 # they compromise the platform-independence that GLib gives you.
296 # These are here mostly to avoid blowing when random platform-specific
297 # methods are added under #ifdefs inside GLib itself. We could just (skip)
298 # the relevant methods, but on the other hand, since these types are just
299 # integers it's easy enough to expand them.
300 type_names['size_t'] = type_names['gsize']
301 type_names['time_t'] = TYPE_LONG
302 type_names['off_t'] = type_names['gsize']
303 type_names['pid_t'] = TYPE_INT
304 type_names['uid_t'] = TYPE_UINT
305 type_names['gid_t'] = TYPE_UINT
306 type_names['dev_t'] = TYPE_INT
307 type_names['socklen_t'] = TYPE_INT32
308 type_names['size_t'] = TYPE_ULONG
309 type_names['ssize_t'] = TYPE_LONG
312 type_names['id'] = TYPE_ANY
318 PARAM_DIRECTION_IN = 'in'
319 PARAM_DIRECTION_OUT = 'out'
320 PARAM_DIRECTION_INOUT = 'inout'
322 PARAM_SCOPE_CALL = 'call'
323 PARAM_SCOPE_ASYNC = 'async'
324 PARAM_SCOPE_NOTIFIED = 'notified'
326 PARAM_TRANSFER_NONE = 'none'
327 PARAM_TRANSFER_CONTAINER = 'container'
328 PARAM_TRANSFER_FULL = 'full'
330 SIGNAL_FIRST = 'first'
332 SIGNAL_CLEANUP = 'cleanup'
333 SIGNAL_MUST_COLLECT = 'must-collect'
336 class Namespace(object):
337 def __init__(self, name, version,
338 identifier_prefixes=None,
339 symbol_prefixes=None):
341 self.version = version
342 if identifier_prefixes is not None:
343 self.identifier_prefixes = identifier_prefixes
345 self.identifier_prefixes = [name]
346 if symbol_prefixes is not None:
347 self.symbol_prefixes = symbol_prefixes
349 ps = self.identifier_prefixes
350 self.symbol_prefixes = [to_underscores(p).lower() for p in ps]
351 # cache upper-cased versions
352 self._ucase_symbol_prefixes = [p.upper() for p in self.symbol_prefixes]
353 self._names = odict() # Maps from GIName -> node
354 self._aliases = {} # Maps from GIName -> GIName
355 self._type_names = {} # Maps from GTName -> node
356 self._ctypes = {} # Maps from CType -> node
357 self._symbols = {} # Maps from function symbols -> Function
368 def type_names(self):
369 return self._type_names
375 def type_from_name(self, name, ctype=None):
376 """Backwards compatibility method for older .gir files, which
377 only use the 'name' attribute. If name refers to a fundamental type,
378 create a Type object referncing it. If name is already a
379 fully-qualified GIName like 'Foo.Bar', returns a Type targeting it .
380 Otherwise a Type targeting name qualififed with the namespace name is
382 if name in type_names:
383 return Type(target_fundamental=name, ctype=ctype)
387 target = '%s.%s' % (self.name, name)
388 return Type(target_giname=target, ctype=ctype)
390 def append(self, node, replace=False):
391 previous = self._names.get(node.name)
392 if previous is not None:
394 raise ValueError("Namespace conflict: %r" % (node, ))
395 self.remove(previous)
396 # A layering violation...but oh well.
397 if isinstance(node, Alias):
398 self._aliases[node.name] = node
399 elif isinstance(node, Registered) and node.gtype_name is not None:
400 self._type_names[node.gtype_name] = node
401 elif isinstance(node, Function):
402 self._symbols[node.symbol] = node
403 assert isinstance(node, Node)
404 assert node.namespace is None
405 node.namespace = self
406 self._names[node.name] = node
407 if hasattr(node, 'ctype'):
408 self._ctypes[node.ctype] = node
409 if hasattr(node, 'symbol'):
410 self._ctypes[node.symbol] = node
412 def remove(self, node):
413 if isinstance(node, Alias):
414 del self._aliases[node.name]
415 elif isinstance(node, Registered) and node.gtype_name is not None:
416 del self._type_names[node.gtype_name]
417 del self._names[node.name]
418 node.namespace = None
419 if hasattr(node, 'ctype'):
420 del self._ctypes[node.ctype]
421 if isinstance(node, Function):
422 del self._symbols[node.symbol]
424 def float(self, node):
425 """Like remove(), but doesn't unset the node's namespace
426 back-reference, and it's still possible to look up
427 functions via get_by_symbol()."""
428 if isinstance(node, Function):
431 self._symbols[symbol] = node
432 node.namespace = self
435 return iter(self._names)
438 return self._names.iteritems()
440 def itervalues(self):
441 return self._names.itervalues()
444 return self._names.get(name)
446 def get_by_ctype(self, ctype):
447 return self._ctypes.get(ctype)
449 def get_by_symbol(self, symbol):
450 return self._symbols.get(symbol)
452 def walk(self, callback):
453 for node in self.itervalues():
454 node.walk(callback, [])
456 class Include(object):
458 def __init__(self, name, version):
460 self.version = version
463 def from_string(cls, string):
464 return cls(*string.split('-', 1))
466 def __cmp__(self, other):
467 namecmp = cmp(self.name, other.name)
470 return cmp(self.version, other.version)
473 return hash(str(self))
476 return '%s-%s' % (self.name, self.version)
478 class Annotated(object):
479 """An object which has a few generic metadata
484 self.introspectable = True
485 self.attributes = [] # (key, value)*
486 self.deprecated = None
487 self.deprecated_version = None
490 class Node(Annotated):
491 """A node is a type of object which is uniquely identified by its
492 (namespace, name) pair. When combined with a ., this is called a
493 GIName. It's possible for nodes to contain or point to other nodes."""
495 c_name = property(lambda self: self.namespace.name + self.name)
496 gi_name = property(lambda self: '%s.%s' % (self.namespace.name, self.name))
498 def __init__(self, name=None):
499 Annotated.__init__(self)
500 self.namespace = None # Should be set later by Namespace.append()
503 self.file_positions = set()
505 def create_type(self):
506 """Create a Type object referencing this node."""
507 assert self.namespace is not None
508 return Type(target_giname=('%s.%s' % (self.namespace.name, self.name)))
510 def __cmp__(self, other):
511 nscmp = cmp(self.namespace, other.namespace)
514 return cmp(self.name, other.name)
517 return '%s(%r)' % (self.__class__.__name__, self.name)
519 def inherit_file_positions(self, node):
520 self.file_positions.update(node.file_positions)
522 def add_file_position(self, position):
523 self.file_positions.add(position)
525 def add_symbol_reference(self, symbol):
526 if symbol.source_filename:
527 self.add_file_position(Position(symbol.source_filename, symbol.line))
529 def walk(self, callback, chain):
530 res = callback(self, chain)
531 assert res in (True, False), "Walk function must return boolean, not %r" % (res, )
535 self._walk(callback, chain)
538 def _walk(self, callback, chain):
543 """A node that (possibly) has gtype_name and get_type."""
544 def __init__(self, gtype_name, get_type):
545 assert (gtype_name is None and get_type is None) or \
546 (gtype_name is not None and get_type is not None)
547 self.gtype_name = gtype_name
548 self.get_type = get_type
551 class Callable(Node):
553 def __init__(self, name, retval, parameters, throws):
554 Node.__init__(self, name)
556 self.parameters = parameters
557 self.throws = not not throws
558 self.instance_parameter = None # Parameter
560 def get_parameter_index(self, name):
561 for i, parameter in enumerate(self.parameters):
562 if parameter.argname == name:
564 raise ValueError("Unknown argument %s" % (name, ))
566 def get_parameter(self, name):
567 for parameter in self.parameters:
568 if parameter.argname == name:
570 raise ValueError("Unknown argument %s" % (name, ))
573 class Function(Callable):
575 def __init__(self, name, retval, parameters, throws, symbol):
576 Callable.__init__(self, name, retval, parameters, throws)
578 self.is_method = False
579 self.is_constructor = False
580 self.shadowed_by = None # C symbol string
581 self.shadows = None # C symbol string
582 self.moved_to = None # namespaced function name string
585 clone = copy.copy(self)
586 # copy the parameters array so a change to self.parameters does not
587 # influence clone.parameters.
588 clone.parameters = self.parameters[:]
592 class ErrorQuarkFunction(Function):
594 def __init__(self, name, retval, parameters, throws, symbol, error_domain):
595 Function.__init__(self, name, retval, parameters, throws, symbol)
596 self.error_domain = error_domain
599 class VFunction(Callable):
601 def __init__(self, name, retval, parameters, throws):
602 Callable.__init__(self, name, retval, parameters, throws)
606 def from_callback(cls, cb):
607 obj = cls(cb.name, cb.retval, cb.parameters[1:],
616 Type.__init__(self, '<varargs>', target_fundamental='<varargs>')
621 GLIB_ARRAY = 'GLib.Array'
622 GLIB_BYTEARRAY = 'GLib.ByteArray'
623 GLIB_PTRARRAY = 'GLib.PtrArray'
625 def __init__(self, array_type, element_type, **kwargs):
626 Type.__init__(self, target_fundamental='<array>',
628 if (array_type is None or array_type == self.C):
629 self.array_type = self.C
631 assert array_type in (self.GLIB_ARRAY,
633 self.GLIB_PTRARRAY), array_type
634 self.array_type = array_type
635 assert isinstance(element_type, Type)
636 self.element_type = element_type
637 self.zeroterminated = True
638 self.length_param_name = None
642 arr = Array(self.array_type, self.element_type)
643 arr.zeroterminated = self.zeroterminated
644 arr.length_param_name = self.length_param_name
650 def __init__(self, name, element_type, **kwargs):
651 Type.__init__(self, target_fundamental='<list>',
654 assert isinstance(element_type, Type)
655 self.element_type = element_type
658 l = List(self.name, self.element_type)
659 l.zeroterminated = self.zeroterminated
660 l.length_param_name = self.length_param_name
666 def __init__(self, key_type, value_type, **kwargs):
667 Type.__init__(self, target_fundamental='<map>', **kwargs)
668 assert isinstance(key_type, Type)
669 self.key_type = key_type
670 assert isinstance(value_type, Type)
671 self.value_type = value_type
674 return Map(self.key_type, self.value_type)
678 def __init__(self, name, target, ctype=None):
679 Node.__init__(self, name)
684 class TypeContainer(Annotated):
685 """A fundamental base class for Return and Parameter."""
687 def __init__(self, typenode, transfer):
688 Annotated.__init__(self)
690 if transfer is not None:
691 self.transfer = transfer
692 elif typenode.is_const:
693 self.transfer = PARAM_TRANSFER_NONE
698 class Parameter(TypeContainer):
699 """An argument to a function."""
701 def __init__(self, argname, typenode, direction=None,
702 transfer=None, allow_none=False, scope=None,
703 caller_allocates=False):
704 TypeContainer.__init__(self, typenode, transfer)
705 self.argname = argname
706 self.direction = direction
707 self.allow_none = allow_none
709 self.caller_allocates = caller_allocates
710 self.closure_name = None
711 self.destroy_name = None
714 class Return(TypeContainer):
715 """A return value from a function."""
717 def __init__(self, rtype, transfer=None):
718 TypeContainer.__init__(self, rtype, transfer)
719 self.direction = PARAM_DIRECTION_OUT
722 class Enum(Node, Registered):
724 def __init__(self, name, ctype,
727 c_symbol_prefix=None,
729 Node.__init__(self, name)
730 Registered.__init__(self, gtype_name, get_type)
731 self.c_symbol_prefix = c_symbol_prefix
733 self.members = members
734 # Associated error domain name
735 self.error_domain = None
736 self.static_methods = []
738 def _walk(self, callback, chain):
739 for meth in self.static_methods:
740 meth.walk(callback, chain)
743 class Bitfield(Node, Registered):
745 def __init__(self, name, ctype,
747 c_symbol_prefix=None,
750 Node.__init__(self, name)
751 Registered.__init__(self, gtype_name, get_type)
753 self.c_symbol_prefix = c_symbol_prefix
754 self.members = members
755 self.static_methods = []
757 def _walk(self, callback, chain):
758 for meth in self.static_methods:
759 meth.walk(callback, chain)
762 class Member(Annotated):
764 def __init__(self, name, value, symbol, nick):
765 Annotated.__init__(self)
771 def __cmp__(self, other):
772 return cmp(self.name, other.name)
776 class Compound(Node, Registered):
777 def __init__(self, name,
781 c_symbol_prefix=None,
783 Node.__init__(self, name)
784 Registered.__init__(self, gtype_name, get_type)
787 self.static_methods = []
789 self.constructors = []
790 self.disguised = disguised
791 self.gtype_name = gtype_name
792 self.get_type = get_type
793 self.c_symbol_prefix = c_symbol_prefix
795 def add_gtype(self, gtype_name, get_type):
796 self.gtype_name = gtype_name
797 self.get_type = get_type
799 def _walk(self, callback, chain):
800 for ctor in self.constructors:
801 ctor.walk(callback, chain)
802 for func in self.methods:
803 func.walk(callback, chain)
804 for func in self.static_methods:
805 func.walk(callback, chain)
806 for field in self.fields:
807 if field.anonymous_node is not None:
808 field.anonymous_node.walk(callback, chain)
810 class Field(Annotated):
812 def __init__(self, name, typenode, readable, writable, bits=None,
813 anonymous_node=None):
814 Annotated.__init__(self)
815 assert (typenode or anonymous_node)
818 self.readable = readable
819 self.writable = writable
821 self.anonymous_node = anonymous_node
824 def __cmp__(self, other):
825 return cmp(self.name, other.name)
828 class Record(Compound):
830 def __init__(self, name,
834 c_symbol_prefix=None,
836 Compound.__init__(self, name,
838 gtype_name=gtype_name,
840 c_symbol_prefix=c_symbol_prefix,
842 # If non-None, this record defines the FooClass C structure
843 # for some Foo GObject (or similar for GInterface)
844 self.is_gtype_struct_for = None
847 class Union(Compound):
849 def __init__(self, name,
853 c_symbol_prefix=None,
855 Compound.__init__(self, name,
857 gtype_name=gtype_name,
859 c_symbol_prefix=c_symbol_prefix,
863 class Boxed(Node, Registered):
864 """A boxed type with no known associated structure/union."""
865 def __init__(self, name,
868 c_symbol_prefix=None):
869 assert gtype_name is not None
870 assert get_type is not None
871 Node.__init__(self, name)
872 Registered.__init__(self, gtype_name, get_type)
873 if get_type is not None:
874 assert c_symbol_prefix is not None
875 self.c_symbol_prefix = c_symbol_prefix
876 self.constructors = []
878 self.static_methods = []
880 def _walk(self, callback, chain):
881 for ctor in self.constructors:
882 ctor.walk(callback, chain)
883 for meth in self.methods:
884 meth.walk(callback, chain)
885 for meth in self.static_methods:
886 meth.walk(callback, chain)
889 class Signal(Callable):
891 def __init__(self, name, retval, parameters, when=None,
892 no_recurse=False, detailed=False, action=False,
894 Callable.__init__(self, name, retval, parameters, False)
896 self.no_recurse = no_recurse
897 self.detailed = detailed
899 self.no_hooks = no_hooks
902 class Class(Node, Registered):
904 def __init__(self, name, parent,
908 c_symbol_prefix=None,
910 Node.__init__(self, name)
911 Registered.__init__(self, gtype_name, get_type)
913 self.c_symbol_prefix = c_symbol_prefix
915 self.fundamental = False
916 self.unref_func = None
918 self.set_value_func = None
919 self.get_value_func = None
920 # When we're in the scanner, we keep around a list
921 # of parents so that we can transparently fall back
922 # if there are 'hidden' parents
923 self.parent_chain = []
924 self.glib_type_struct = None
925 self.is_abstract = is_abstract
927 self.virtual_methods = []
928 self.static_methods = []
930 self.constructors = []
935 def _walk(self, callback, chain):
936 for meth in self.methods:
937 meth.walk(callback, chain)
938 for meth in self.virtual_methods:
939 meth.walk(callback, chain)
940 for meth in self.static_methods:
941 meth.walk(callback, chain)
942 for ctor in self.constructors:
943 ctor.walk(callback, chain)
944 for field in self.fields:
945 if field.anonymous_node:
946 field.anonymous_node.walk(callback, chain)
947 for sig in self.signals:
948 sig.walk(callback, chain)
951 class Interface(Node, Registered):
953 def __init__(self, name, parent,
957 c_symbol_prefix=None):
958 Node.__init__(self, name)
959 Registered.__init__(self, gtype_name, get_type)
961 self.c_symbol_prefix = c_symbol_prefix
963 self.parent_chain = []
966 self.static_methods = []
967 self.virtual_methods = []
968 self.glib_type_struct = None
971 self.prerequisites = []
973 def _walk(self, callback, chain):
974 for meth in self.methods:
975 meth.walk(callback, chain)
976 for meth in self.static_methods:
977 meth.walk(callback, chain)
978 for meth in self.virtual_methods:
979 meth.walk(callback, chain)
980 for field in self.fields:
981 if field.anonymous_node:
982 field.anonymous_node.walk(callback, chain)
983 for sig in self.signals:
984 sig.walk(callback, chain)
987 class Constant(Node):
989 def __init__(self, name, value_type, value, ctype):
990 Node.__init__(self, name)
991 self.value_type = value_type
996 class Property(Node):
998 def __init__(self, name, typeobj, readable, writable,
999 construct, construct_only, transfer=None):
1000 Node.__init__(self, name)
1002 self.readable = readable
1003 self.writable = writable
1004 self.construct = construct
1005 self.construct_only = construct_only
1006 if transfer is None:
1007 self.transfer = PARAM_TRANSFER_NONE
1009 self.transfer = transfer
1012 class Callback(Callable):
1014 def __init__(self, name, retval, parameters, throws, ctype=None):
1015 Callable.__init__(self, name, retval, parameters, throws)