gobject-introspection 2.2.0-x86-mingw32 → 2.2.1-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +7 -7
  3. data/ext/gobject-introspection/rb-gi-argument.c +28 -3
  4. data/ext/gobject-introspection/rb-gi-constructor-info.c +6 -1
  5. data/ext/gobject-introspection/rb-gi-function-info.c +29 -4
  6. data/ext/gobject-introspection/rb-gi-loader.c +19 -3
  7. data/ext/gobject-introspection/rb-gi-struct-info.c +28 -16
  8. data/lib/2.0/gobject_introspection.so +0 -0
  9. data/lib/gobject-introspection/callable-info.rb +16 -7
  10. data/lib/gobject-introspection/loader.rb +47 -19
  11. data/test/test-object-info.rb +1 -1
  12. data/test/test-signal-info.rb +2 -2
  13. data/test/test-struct-info.rb +1 -1
  14. data/vendor/local/bin/g-ir-compiler.exe +0 -0
  15. data/vendor/local/bin/g-ir-generate.exe +0 -0
  16. data/vendor/local/bin/libgirepository-1.0-1.dll +0 -0
  17. data/vendor/local/include/gobject-introspection-1.0/giarginfo.h +30 -0
  18. data/vendor/local/include/gobject-introspection-1.0/gibaseinfo.h +31 -0
  19. data/vendor/local/include/gobject-introspection-1.0/gicallableinfo.h +36 -0
  20. data/vendor/local/include/gobject-introspection-1.0/giconstantinfo.h +12 -0
  21. data/vendor/local/include/gobject-introspection-1.0/gienuminfo.h +26 -0
  22. data/vendor/local/include/gobject-introspection-1.0/gifieldinfo.h +19 -0
  23. data/vendor/local/include/gobject-introspection-1.0/gifunctioninfo.h +23 -0
  24. data/vendor/local/include/gobject-introspection-1.0/giinterfaceinfo.h +38 -0
  25. data/vendor/local/include/gobject-introspection-1.0/giobjectinfo.h +72 -2
  26. data/vendor/local/include/gobject-introspection-1.0/gipropertyinfo.h +12 -0
  27. data/vendor/local/include/gobject-introspection-1.0/giregisteredtypeinfo.h +11 -0
  28. data/vendor/local/include/gobject-introspection-1.0/girepository.h +68 -8
  29. data/vendor/local/include/gobject-introspection-1.0/girffi.h +25 -1
  30. data/vendor/local/include/gobject-introspection-1.0/gisignalinfo.h +12 -0
  31. data/vendor/local/include/gobject-introspection-1.0/gistructinfo.h +24 -0
  32. data/vendor/local/include/gobject-introspection-1.0/gitypeinfo.h +31 -0
  33. data/vendor/local/include/gobject-introspection-1.0/gitypelib.h +25 -0
  34. data/vendor/local/include/gobject-introspection-1.0/gitypes.h +84 -13
  35. data/vendor/local/include/gobject-introspection-1.0/giunioninfo.h +27 -0
  36. data/vendor/local/include/gobject-introspection-1.0/giversionmacros.h +128 -0
  37. data/vendor/local/include/gobject-introspection-1.0/givfuncinfo.h +17 -0
  38. data/vendor/local/lib/girepository-1.0/GIRepository-2.0.typelib +0 -0
  39. data/vendor/local/lib/girepository-1.0/GLib-2.0.typelib +0 -0
  40. data/vendor/local/lib/girepository-1.0/GObject-2.0.typelib +0 -0
  41. data/vendor/local/lib/girepository-1.0/Gio-2.0.typelib +0 -0
  42. data/vendor/local/lib/girepository-1.0/libxml2-2.0.typelib +0 -0
  43. data/vendor/local/lib/girepository-1.0/win32-1.0.typelib +0 -0
  44. data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyc +0 -0
  45. data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyo +0 -0
  46. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.py +5 -4
  47. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyc +0 -0
  48. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyo +0 -0
  49. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.py +1865 -913
  50. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyc +0 -0
  51. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyo +0 -0
  52. data/vendor/local/lib/gobject-introspection/giscanner/ast.py +49 -16
  53. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyc +0 -0
  54. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyo +0 -0
  55. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.py +10 -4
  56. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyc +0 -0
  57. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyo +0 -0
  58. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.py +202 -0
  59. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyc +0 -0
  60. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyo +0 -0
  61. data/vendor/local/lib/gobject-introspection/giscanner/codegen.py +32 -1
  62. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyc +0 -0
  63. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyo +0 -0
  64. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.py +1 -0
  65. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyc +0 -0
  66. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyo +0 -0
  67. data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.py +305 -0
  68. data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyc +0 -0
  69. data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyo +0 -0
  70. data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyc +0 -0
  71. data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyo +0 -0
  72. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyc +0 -0
  73. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyo +0 -0
  74. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/callback.tmpl +4 -0
  75. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/field.tmpl +1 -0
  76. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/function.tmpl +8 -9
  77. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/interface.tmpl +2 -0
  78. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/callback.tmpl +27 -0
  79. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/class.tmpl +17 -5
  80. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/enum.tmpl +8 -0
  81. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/field.tmpl +9 -0
  82. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/function.tmpl +12 -13
  83. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/interface.tmpl +17 -0
  84. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/property.tmpl +3 -4
  85. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/signal.tmpl +10 -9
  86. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/vfunc.tmpl +7 -7
  87. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/callback.tmpl +27 -0
  88. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/class.tmpl +5 -4
  89. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/field.tmpl +1 -0
  90. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/function.tmpl +8 -14
  91. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/interface.tmpl +16 -0
  92. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/property.tmpl +2 -3
  93. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/signal.tmpl +6 -7
  94. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/vfunc.tmpl +7 -13
  95. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/base.tmpl +10 -19
  96. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/class.tmpl +24 -3
  97. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/namespace.tmpl +4 -7
  98. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.py +375 -61
  99. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyc +0 -0
  100. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyo +0 -0
  101. data/vendor/local/lib/gobject-introspection/giscanner/dumper.py +43 -75
  102. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyc +0 -0
  103. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyo +0 -0
  104. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.py +1 -20
  105. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyc +0 -0
  106. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyo +0 -0
  107. data/vendor/local/lib/gobject-introspection/giscanner/girparser.py +33 -15
  108. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyc +0 -0
  109. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyo +0 -0
  110. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.py +51 -22
  111. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyc +0 -0
  112. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyo +0 -0
  113. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyc +0 -0
  114. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyo +0 -0
  115. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyc +0 -0
  116. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyo +0 -0
  117. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.py +285 -254
  118. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyc +0 -0
  119. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyo +0 -0
  120. data/vendor/local/lib/gobject-introspection/giscanner/message.py +41 -25
  121. data/vendor/local/lib/gobject-introspection/giscanner/message.pyc +0 -0
  122. data/vendor/local/lib/gobject-introspection/giscanner/message.pyo +0 -0
  123. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.py +67 -15
  124. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyc +0 -0
  125. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyo +0 -0
  126. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyc +0 -0
  127. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyo +0 -0
  128. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.py +10 -6
  129. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyc +0 -0
  130. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyo +0 -0
  131. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.py +14 -8
  132. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyc +0 -0
  133. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyo +0 -0
  134. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.py +16 -2
  135. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyc +0 -0
  136. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyo +0 -0
  137. data/vendor/local/lib/gobject-introspection/giscanner/transformer.py +150 -169
  138. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyc +0 -0
  139. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyo +0 -0
  140. data/vendor/local/lib/gobject-introspection/giscanner/utils.py +64 -3
  141. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyc +0 -0
  142. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyo +0 -0
  143. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.py +5 -44
  144. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyc +0 -0
  145. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyo +0 -0
  146. data/vendor/local/lib/libgirepository-1.0.a +0 -0
  147. data/vendor/local/lib/libgirepository-1.0.dll.a +0 -0
  148. data/vendor/local/lib/libgirepository-1.0.la +1 -1
  149. data/vendor/local/lib/pkgconfig/gobject-introspection-1.0.pc +4 -4
  150. data/vendor/local/lib/pkgconfig/gobject-introspection-no-export-1.0.pc +5 -5
  151. data/vendor/local/share/gir-1.0/GIRepository-2.0.gir +352 -143
  152. data/vendor/local/share/gir-1.0/GLib-2.0.gir +6402 -3872
  153. data/vendor/local/share/gir-1.0/GModule-2.0.gir +42 -24
  154. data/vendor/local/share/gir-1.0/GObject-2.0.gir +1543 -887
  155. data/vendor/local/share/gir-1.0/Gio-2.0.gir +10859 -3705
  156. data/vendor/local/share/gobject-introspection-1.0/tests/annotation.c +10 -14
  157. data/vendor/local/share/gobject-introspection-1.0/tests/annotation.h +112 -9
  158. data/vendor/local/share/gobject-introspection-1.0/tests/drawable.c +2 -0
  159. data/vendor/local/share/gobject-introspection-1.0/tests/drawable.h +11 -0
  160. data/vendor/local/share/gobject-introspection-1.0/tests/everything.c +106 -0
  161. data/vendor/local/share/gobject-introspection-1.0/tests/everything.h +107 -0
  162. data/vendor/local/share/gobject-introspection-1.0/tests/foo.c +3 -3
  163. data/vendor/local/share/gobject-introspection-1.0/tests/foo.h +145 -0
  164. data/vendor/local/share/gobject-introspection-1.0/tests/gimarshallingtests.c +166 -10
  165. data/vendor/local/share/gobject-introspection-1.0/tests/gimarshallingtests.h +790 -0
  166. data/vendor/local/share/gobject-introspection-1.0/tests/gitestmacros.h +10 -0
  167. data/vendor/local/share/gobject-introspection-1.0/tests/regress.c +79 -28
  168. data/vendor/local/share/gobject-introspection-1.0/tests/regress.h +462 -0
  169. data/vendor/local/share/gobject-introspection-1.0/tests/utility.c +2 -0
  170. data/vendor/local/share/gobject-introspection-1.0/tests/utility.h +7 -0
  171. data/vendor/local/share/gobject-introspection-1.0/tests/warnlib.c +14 -0
  172. data/vendor/local/share/gobject-introspection-1.0/tests/warnlib.h +10 -0
  173. data/vendor/local/share/man/man1/g-ir-compiler.1 +1 -10
  174. metadata +38 -23
  175. data/lib/1.9/gobject_introspection.so +0 -0
  176. data/lib/2.1/gobject_introspection.so +0 -0
@@ -20,6 +20,7 @@
20
20
 
21
21
  import os
22
22
  import sys
23
+ import subprocess
23
24
 
24
25
  from . import ast
25
26
  from . import message
@@ -49,7 +50,7 @@ if os.name != 'nt':
49
50
  class Transformer(object):
50
51
  namespace = property(lambda self: self._namespace)
51
52
 
52
- def __init__(self, namespace, accept_unprefixed=False):
53
+ def __init__(self, namespace, accept_unprefixed=False, identifier_filter_cmd=''):
53
54
  self._cachestore = CacheStore()
54
55
  self._accept_unprefixed = accept_unprefixed
55
56
  self._namespace = namespace
@@ -58,6 +59,12 @@ class Transformer(object):
58
59
  self._parsed_includes = {} # <string namespace -> Namespace>
59
60
  self._includepaths = []
60
61
  self._passthrough_mode = False
62
+ self._identifier_filter_cmd = identifier_filter_cmd
63
+
64
+ # Cache a list of struct/unions in C's "tag namespace". This helps
65
+ # manage various orderings of typedefs and structs. See:
66
+ # https://bugzilla.gnome.org/show_bug.cgi?id=581525
67
+ self._tag_ns = {}
61
68
 
62
69
  def get_pkgconfig_packages(self):
63
70
  return self._pkg_config_packages
@@ -76,6 +83,12 @@ class Transformer(object):
76
83
  # modules will just depend on that.
77
84
  if isinstance(original, ast.Constant) and isinstance(node, ast.Constant):
78
85
  pass
86
+ elif original is node:
87
+ # Ignore attempts to add the same node to the namespace. This can
88
+ # happen when parsing typedefs and structs in particular orderings:
89
+ # typedef struct _Foo Foo;
90
+ # struct _Foo {...};
91
+ pass
79
92
  elif original:
80
93
  positions = set()
81
94
  positions.update(original.file_positions)
@@ -91,28 +104,30 @@ class Transformer(object):
91
104
  # https://bugzilla.gnome.org/show_bug.cgi?id=550616
92
105
  if symbol.ident in ['gst_g_error_get_type']:
93
106
  continue
94
- node = self._traverse_one(symbol)
95
- if node:
96
- self._append_new_node(node)
97
107
 
98
- # Now look through the namespace for things like
99
- # typedef struct _Foo Foo;
100
- # where we've never seen the struct _Foo. Just create
101
- # an empty structure for these as "disguised"
102
- # If we do have a class/interface, merge fields
103
- for typedef, compound in self._typedefs_ns.iteritems():
104
- ns_compound = self._namespace.get(compound.name)
105
- if not ns_compound:
106
- ns_compound = self._namespace.get('_' + compound.name)
107
- if (not ns_compound and isinstance(compound, (ast.Record, ast.Union))
108
- and len(compound.fields) == 0):
109
- disguised = ast.Record(compound.name, typedef, disguised=True)
110
- self._namespace.append(disguised)
111
- elif not ns_compound:
112
- self._namespace.append(compound)
113
- elif isinstance(ns_compound, (ast.Record, ast.Union)) and len(ns_compound.fields) == 0:
114
- ns_compound.fields = compound.fields
115
- self._typedefs_ns = None
108
+ try:
109
+ node = self._traverse_one(symbol)
110
+ except TransformerException as e:
111
+ message.warn_symbol(symbol, e)
112
+ continue
113
+
114
+ if node and node.name:
115
+ self._append_new_node(node)
116
+ if isinstance(node, ast.Compound) and node.tag_name and \
117
+ node.tag_name not in self._tag_ns:
118
+ self._tag_ns[node.tag_name] = node
119
+
120
+ # Run through the tag namespace looking for structs that have not been
121
+ # promoted into the main namespace. In this case we simply promote them
122
+ # with their struct tag.
123
+ for tag_name, struct in self._tag_ns.iteritems():
124
+ if not struct.name:
125
+ try:
126
+ name = self.strip_identifier(tag_name)
127
+ struct.name = name
128
+ self._append_new_node(struct)
129
+ except TransformerException as e:
130
+ message.warn_node(node, e)
116
131
 
117
132
  def set_include_paths(self, paths):
118
133
  self._includepaths = list(paths)
@@ -280,6 +295,17 @@ raise ValueError."""
280
295
  return matches[-1]
281
296
 
282
297
  def strip_identifier(self, ident):
298
+ if self._identifier_filter_cmd:
299
+ proc = subprocess.Popen(self._identifier_filter_cmd,
300
+ stdin=subprocess.PIPE,
301
+ stdout=subprocess.PIPE,
302
+ stderr=subprocess.PIPE,
303
+ shell=True)
304
+ ident, err = proc.communicate(ident)
305
+ if proc.returncode:
306
+ raise ValueError('filter: "%s" exited: %d with error: %s' %
307
+ (self._identifier_filter_cmd, proc.returncode, err))
308
+
283
309
  hidden = ident.startswith('_')
284
310
  if hidden:
285
311
  ident = ident[1:]
@@ -294,8 +320,7 @@ raise ValueError."""
294
320
  return name
295
321
  (ns, name) = matches[-1]
296
322
  raise TransformerException(
297
- "Skipping foreign identifier %r from namespace %s" % (
298
- ident, ns.name, ))
323
+ "Skipping foreign identifier %r from namespace %s" % (ident, ns.name, ))
299
324
  return None
300
325
 
301
326
  def _strip_symbol(self, symbol):
@@ -324,13 +349,13 @@ raise ValueError."""
324
349
  elif stype == CSYMBOL_TYPE_TYPEDEF:
325
350
  return self._create_typedef(symbol)
326
351
  elif stype == CSYMBOL_TYPE_STRUCT:
327
- return self._create_struct(symbol)
352
+ return self._create_tag_ns_compound(ast.Record, symbol)
328
353
  elif stype == CSYMBOL_TYPE_ENUM:
329
354
  return self._create_enum(symbol)
330
355
  elif stype == CSYMBOL_TYPE_MEMBER:
331
356
  return self._create_member(symbol, parent_symbol)
332
357
  elif stype == CSYMBOL_TYPE_UNION:
333
- return self._create_union(symbol)
358
+ return self._create_tag_ns_compound(ast.Union, symbol)
334
359
  elif stype == CSYMBOL_TYPE_CONST:
335
360
  return self._create_const(symbol)
336
361
  # Ignore variable declarations in the header
@@ -377,21 +402,13 @@ raise ValueError."""
377
402
  # Ok, the enum members don't have a consistent prefix
378
403
  # among them, so let's just remove the global namespace
379
404
  # prefix.
380
- try:
381
- name = self._strip_symbol(child)
382
- except TransformerException as e:
383
- message.warn_symbol(symbol, e)
384
- return None
405
+ name = self._strip_symbol(child)
385
406
  members.append(ast.Member(name.lower(),
386
407
  child.const_int,
387
408
  child.ident,
388
409
  None))
389
410
 
390
- try:
391
- enum_name = self.strip_identifier(symbol.ident)
392
- except TransformerException as e:
393
- message.warn_symbol(symbol, e)
394
- return None
411
+ enum_name = self.strip_identifier(symbol.ident)
395
412
  if symbol.base_type.is_bitfield:
396
413
  klass = ast.Bitfield
397
414
  else:
@@ -406,11 +423,7 @@ raise ValueError."""
406
423
  return None
407
424
  parameters = list(self._create_parameters(symbol, symbol.base_type))
408
425
  return_ = self._create_return(symbol.base_type.base_type)
409
- try:
410
- name = self._strip_symbol(symbol)
411
- except TransformerException as e:
412
- message.warn_symbol(symbol, e)
413
- return None
426
+ name = self._strip_symbol(symbol)
414
427
  func = ast.Function(name, return_, parameters, False, symbol.ident)
415
428
  func.add_symbol_reference(symbol)
416
429
  return func
@@ -506,9 +519,9 @@ raise ValueError."""
506
519
  and symbol.base_type.base_type.type == CTYPE_FUNCTION):
507
520
  node = self._create_callback(symbol, member=True)
508
521
  elif source_type.type == CTYPE_STRUCT and source_type.name is None:
509
- node = self._create_struct(symbol, anonymous=True)
522
+ node = self._create_member_compound(ast.Record, symbol)
510
523
  elif source_type.type == CTYPE_UNION and source_type.name is None:
511
- node = self._create_union(symbol, anonymous=True)
524
+ node = self._create_member_compound(ast.Union, symbol)
512
525
  else:
513
526
  # Special handling for fields; we don't have annotations on them
514
527
  # to apply later, yet.
@@ -561,22 +574,18 @@ raise ValueError."""
561
574
  if (ctype == CTYPE_POINTER and symbol.base_type.base_type.type == CTYPE_FUNCTION):
562
575
  node = self._create_typedef_callback(symbol)
563
576
  elif (ctype == CTYPE_POINTER and symbol.base_type.base_type.type == CTYPE_STRUCT):
564
- node = self._create_typedef_struct(symbol, disguised=True)
577
+ node = self._create_typedef_compound(ast.Record, symbol, disguised=True)
565
578
  elif ctype == CTYPE_STRUCT:
566
- node = self._create_typedef_struct(symbol)
579
+ node = self._create_typedef_compound(ast.Record, symbol)
567
580
  elif ctype == CTYPE_UNION:
568
- node = self._create_typedef_union(symbol)
581
+ node = self._create_typedef_compound(ast.Union, symbol)
569
582
  elif ctype == CTYPE_ENUM:
570
583
  return self._create_enum(symbol)
571
584
  elif ctype in (CTYPE_TYPEDEF,
572
585
  CTYPE_POINTER,
573
586
  CTYPE_BASIC_TYPE,
574
587
  CTYPE_VOID):
575
- try:
576
- name = self.strip_identifier(symbol.ident)
577
- except TransformerException as e:
578
- message.warn(e)
579
- return None
588
+ name = self.strip_identifier(symbol.ident)
580
589
  if symbol.base_type.name:
581
590
  complete_ctype = self._create_complete_source_type(symbol.base_type)
582
591
  target = self.create_type_from_ctype_string(symbol.base_type.name,
@@ -616,20 +625,6 @@ raise ValueError."""
616
625
 
617
626
  return canonical
618
627
 
619
- def parse_ctype(self, ctype, is_member=False):
620
- canonical = self._canonicalize_ctype(ctype)
621
-
622
- # Remove all pointers - we require standard calling
623
- # conventions. For example, an 'int' is always passed by
624
- # value (unless it's out or inout).
625
- derefed_typename = canonical.replace('*', '')
626
-
627
- # Preserve "pointerness" of struct/union members
628
- if (is_member and canonical.endswith('*') and derefed_typename in ast.basic_type_names):
629
- return 'gpointer'
630
- else:
631
- return derefed_typename
632
-
633
628
  def _create_type_from_base(self, source_type, is_parameter=False, is_return=False):
634
629
  ctype = self._create_source_type(source_type)
635
630
  complete_ctype = self._create_complete_source_type(source_type)
@@ -688,18 +683,18 @@ raise ValueError."""
688
683
 
689
684
  def _create_parameter(self, parent_symbol, index, symbol):
690
685
  if symbol.type == CSYMBOL_TYPE_ELLIPSIS:
691
- ptype = ast.Varargs()
686
+ return ast.Parameter('...', ast.Varargs())
692
687
  else:
693
688
  ptype = self._create_type_from_base(symbol.base_type, is_parameter=True)
694
689
 
695
- if symbol.ident is None:
696
- if symbol.base_type and symbol.base_type.type != CTYPE_VOID:
697
- message.warn_symbol(parent_symbol, "missing parameter name; undocumentable")
698
- ident = 'arg%d' % (index, )
699
- else:
700
- ident = symbol.ident
690
+ if symbol.ident is None:
691
+ if symbol.base_type and symbol.base_type.type != CTYPE_VOID:
692
+ message.warn_symbol(parent_symbol, "missing parameter name; undocumentable")
693
+ ident = 'arg%d' % (index, )
694
+ else:
695
+ ident = symbol.ident
701
696
 
702
- return ast.Parameter(ident, ptype)
697
+ return ast.Parameter(ident, ptype)
703
698
 
704
699
  def _create_return(self, source_type):
705
700
  typeval = self._create_type_from_base(source_type, is_return=True)
@@ -713,11 +708,7 @@ raise ValueError."""
713
708
  # http://bugzilla.gnome.org/show_bug.cgi?id=572790
714
709
  if (symbol.source_filename is None or not symbol.source_filename.endswith('.h')):
715
710
  return None
716
- try:
717
- name = self._strip_symbol(symbol)
718
- except TransformerException as e:
719
- message.warn_symbol(symbol, e)
720
- return None
711
+ name = self._strip_symbol(symbol)
721
712
  if symbol.const_string is not None:
722
713
  typeval = ast.TYPE_STRING
723
714
  value = unicode(symbol.const_string, 'utf-8')
@@ -743,6 +734,9 @@ raise ValueError."""
743
734
  value = str(symbol.const_int % 2 ** 16)
744
735
  else:
745
736
  value = str(symbol.const_int)
737
+ elif symbol.const_boolean is not None:
738
+ typeval = ast.TYPE_BOOLEAN
739
+ value = "true" if symbol.const_boolean else "false"
746
740
  elif symbol.const_double is not None:
747
741
  typeval = ast.TYPE_DOUBLE
748
742
  value = '%f' % (symbol.const_double, )
@@ -754,35 +748,88 @@ raise ValueError."""
754
748
  const.add_symbol_reference(symbol)
755
749
  return const
756
750
 
757
- def _create_typedef_struct(self, symbol, disguised=False):
758
- try:
759
- name = self.strip_identifier(symbol.ident)
760
- except TransformerException as e:
761
- message.warn_symbol(symbol, e)
762
- return None
763
- struct = ast.Record(name, symbol.ident, disguised=disguised)
764
- self._parse_fields(symbol, struct)
765
- struct.add_symbol_reference(symbol)
766
- self._typedefs_ns[symbol.ident] = struct
767
- return None
751
+ def _create_typedef_compound(self, compound_class, symbol, disguised=False):
752
+ name = self.strip_identifier(symbol.ident)
753
+ assert symbol.base_type
754
+ if symbol.base_type.name:
755
+ tag_name = symbol.base_type.name
756
+ else:
757
+ tag_name = None
758
+
759
+ # If the struct already exists in the tag namespace, use it.
760
+ if tag_name in self._tag_ns:
761
+ compound = self._tag_ns[tag_name]
762
+ if compound.name:
763
+ # If the struct name is set it means the struct has already been
764
+ # promoted from the tag namespace to the main namespace by a
765
+ # prior typedef struct. If we get here it means this is another
766
+ # typedef of that struct. Instead of creating an alias to the
767
+ # primary typedef that has been promoted, we create a new Record
768
+ # with shared fields. This handles the case where we want to
769
+ # give structs like GInitiallyUnowned its own Record:
770
+ # typedef struct _GObject GObject;
771
+ # typedef struct _GObject GInitiallyUnowned;
772
+ # See: http://bugzilla.gnome.org/show_bug.cgi?id=569408
773
+ new_compound = compound_class(name, symbol.ident, tag_name=tag_name)
774
+ new_compound.fields = compound.fields
775
+ new_compound.add_symbol_reference(symbol)
776
+ return new_compound
777
+ else:
778
+ # If the struct does not have its name set, it exists only in
779
+ # the tag namespace. Set it here and return it which will
780
+ # promote it to the main namespace. Essentially the first
781
+ # typedef for a struct clobbers its name and ctype which is what
782
+ # will be visible to GI.
783
+ compound.name = name
784
+ compound.ctype = symbol.ident
785
+ else:
786
+ # Create a new struct with a typedef name and tag name when available.
787
+ # Structs with a typedef name are promoted into the main namespace
788
+ # by it being returned to the "parse" function and are also added to
789
+ # the tag namespace if it has a tag_name set.
790
+ compound = compound_class(name, symbol.ident, disguised=disguised, tag_name=tag_name)
791
+ if tag_name:
792
+ # Force the struct as disguised for now since we do not yet know
793
+ # if it has fields that will be parsed. Note that this is using
794
+ # an erroneous definition of disguised and we should eventually
795
+ # only look at the field count when needed.
796
+ compound.disguised = True
797
+ else:
798
+ # Case where we have an anonymous struct which is typedef'd:
799
+ # typedef struct {...} Struct;
800
+ # we need to parse the fields because we never get a struct
801
+ # in the tag namespace which is normally where fields are parsed.
802
+ self._parse_fields(symbol, compound)
768
803
 
769
- def _create_typedef_union(self, symbol):
770
- try:
771
- name = self.strip_identifier(symbol.ident)
772
- except TransformerException as e:
773
- message.warn(e)
774
- return None
775
- union = ast.Union(name, symbol.ident)
776
- self._parse_fields(symbol, union)
777
- union.add_symbol_reference(symbol)
778
- self._typedefs_ns[symbol.ident] = union
779
- return None
804
+ compound.add_symbol_reference(symbol)
805
+ return compound
806
+
807
+ def _create_tag_ns_compound(self, compound_class, symbol):
808
+ # Get or create a struct from C's tag namespace
809
+ if symbol.ident in self._tag_ns:
810
+ compound = self._tag_ns[symbol.ident]
811
+ else:
812
+ compound = compound_class(None, symbol.ident, tag_name=symbol.ident)
813
+
814
+ # Make sure disguised is False as we are now about to parse the
815
+ # fields of the real struct.
816
+ compound.disguised = False
817
+ # Fields may need to be parsed in either of the above cases because the
818
+ # Record can be created with a typedef prior to the struct definition.
819
+ self._parse_fields(symbol, compound)
820
+ compound.add_symbol_reference(symbol)
821
+ return compound
822
+
823
+ def _create_member_compound(self, compound_class, symbol):
824
+ compound = compound_class(symbol.ident, symbol.ident)
825
+ self._parse_fields(symbol, compound)
826
+ compound.add_symbol_reference(symbol)
827
+ return compound
780
828
 
781
829
  def _create_typedef_callback(self, symbol):
782
830
  callback = self._create_callback(symbol)
783
831
  if not callback:
784
832
  return None
785
- self._typedefs_ns[callback.name] = callback
786
833
  return callback
787
834
 
788
835
  def _parse_fields(self, symbol, compound):
@@ -797,41 +844,6 @@ raise ValueError."""
797
844
  anonymous_node=child_node)
798
845
  compound.fields.append(field)
799
846
 
800
- def _create_compound(self, klass, symbol, anonymous):
801
- if symbol.ident is None:
802
- # the compound is an anonymous member of another union or a struct
803
- assert anonymous
804
- compound = klass(None, None)
805
- else:
806
- compound = self._typedefs_ns.get(symbol.ident, None)
807
-
808
- if compound is None:
809
- # This is a bit of a hack; really we should try
810
- # to resolve through the typedefs to find the real
811
- # name
812
- if symbol.ident.startswith('_'):
813
- compound = self._typedefs_ns.get(symbol.ident[1:], None)
814
- if compound is None:
815
- if anonymous:
816
- name = symbol.ident
817
- else:
818
- try:
819
- name = self.strip_identifier(symbol.ident)
820
- except TransformerException as e:
821
- message.warn(e)
822
- return None
823
- compound = klass(name, symbol.ident)
824
-
825
- self._parse_fields(symbol, compound)
826
- compound.add_symbol_reference(symbol)
827
- return compound
828
-
829
- def _create_struct(self, symbol, anonymous=False):
830
- return self._create_compound(ast.Record, symbol, anonymous)
831
-
832
- def _create_union(self, symbol, anonymous=False):
833
- return self._create_compound(ast.Union, symbol, anonymous)
834
-
835
847
  def _create_callback(self, symbol, member=False):
836
848
  parameters = list(self._create_parameters(symbol, symbol.base_type.base_type))
837
849
  retval = self._create_return(symbol.base_type.base_type.base_type)
@@ -844,17 +856,9 @@ raise ValueError."""
844
856
  if member:
845
857
  name = symbol.ident
846
858
  elif symbol.ident.find('_') > 0:
847
- try:
848
- name = self._strip_symbol(symbol)
849
- except TransformerException as e:
850
- message.warn_symbol(symbol, e)
851
- return None
859
+ name = self._strip_symbol(symbol)
852
860
  else:
853
- try:
854
- name = self.strip_identifier(symbol.ident)
855
- except TransformerException as e:
856
- message.warn(e)
857
- return None
861
+ name = self.strip_identifier(symbol.ident)
858
862
  callback = ast.Callback(name, retval, parameters, False,
859
863
  ctype=symbol.ident)
860
864
  callback.add_symbol_reference(symbol)
@@ -953,29 +957,6 @@ Note that type resolution may not succeed."""
953
957
 
954
958
  return typeval.resolved
955
959
 
956
- def _typepair_to_str(self, item):
957
- nsname, item = item
958
- if nsname is None:
959
- return item.name
960
- return '%s.%s' % (nsname, item.name)
961
-
962
- def gtypename_to_giname(self, gtname, names):
963
- resolved = names.type_names.get(gtname)
964
- if resolved:
965
- return self._typepair_to_str(resolved)
966
- resolved = self._names.type_names.get(gtname)
967
- if resolved:
968
- return self._typepair_to_str(resolved)
969
- raise KeyError("Failed to resolve GType name: %r" % (gtname, ))
970
-
971
- def ctype_of(self, obj):
972
- if hasattr(obj, 'ctype'):
973
- return obj.ctype
974
- elif hasattr(obj, 'symbol'):
975
- return obj.symbol
976
- else:
977
- return None
978
-
979
960
  def resolve_aliases(self, typenode):
980
961
  """Removes all aliases from typenode, returns first non-alias
981
962
  in the typenode alias chain. Returns typenode argument if it
@@ -21,6 +21,7 @@
21
21
  import re
22
22
  import os
23
23
  import subprocess
24
+ import platform
24
25
 
25
26
 
26
27
  _debugflags = None
@@ -88,6 +89,20 @@ def _extract_dlname_field(la_file):
88
89
  return None
89
90
 
90
91
 
92
+ _libtool_libdir_pat = re.compile("libdir='([^']+)'")
93
+
94
+
95
+ def _extract_libdir_field(la_file):
96
+ f = open(la_file)
97
+ data = f.read()
98
+ f.close()
99
+ m = _libtool_libdir_pat.search(data)
100
+ if m:
101
+ return m.groups()[0]
102
+ else:
103
+ return None
104
+
105
+
91
106
  # Returns the name that we would pass to dlopen() the library
92
107
  # corresponding to this .la file
93
108
  def extract_libtool_shlib(la_file):
@@ -95,6 +110,14 @@ def extract_libtool_shlib(la_file):
95
110
  if dlname is None:
96
111
  return None
97
112
 
113
+ # Darwin uses absolute paths where possible; since the libtool files never
114
+ # contain absolute paths, use the libdir field
115
+ if platform.system() == 'Darwin':
116
+ dlbasename = os.path.basename(dlname)
117
+ libdir = _extract_libdir_field(la_file)
118
+ if libdir is None:
119
+ return dlbasename
120
+ return libdir + '/' + dlbasename
98
121
  # From the comments in extract_libtool(), older libtools had
99
122
  # a path rather than the raw dlname
100
123
  return os.path.basename(dlname)
@@ -109,7 +132,7 @@ def extract_libtool(la_file):
109
132
  # FIXME: This hackish, but I'm not sure how to do this
110
133
  # in a way which is compatible with both libtool 2.2
111
134
  # and pre-2.2. Johan 2008-10-21
112
- libname = libname.replace('.libs/.libs', '.libs')
135
+ libname = libname.replace('.libs/.libs', '.libs').replace('.libs\\.libs', '.libs')
113
136
  return libname
114
137
 
115
138
 
@@ -127,14 +150,18 @@ def get_libtool_command(options):
127
150
  # we simply split().
128
151
  return libtool_path.split(' ')
129
152
 
153
+ libtool_cmd = 'libtool'
154
+ if platform.system() == 'Darwin':
155
+ # libtool on OS X is a completely different program written by Apple
156
+ libtool_cmd = 'glibtool'
130
157
  try:
131
- subprocess.check_call(['libtool', '--version'],
158
+ subprocess.check_call([libtool_cmd, '--version'],
132
159
  stdout=open(os.devnull))
133
160
  except (subprocess.CalledProcessError, OSError):
134
161
  # If libtool's not installed, assume we don't need it
135
162
  return None
136
163
 
137
- return ['libtool']
164
+ return [libtool_cmd]
138
165
 
139
166
 
140
167
  def files_are_identical(path1, path2):
@@ -148,3 +175,37 @@ def files_are_identical(path1, path2):
148
175
  f1.close()
149
176
  f2.close()
150
177
  return buf1 == buf2
178
+
179
+
180
+ def cflag_real_include_path(cflag):
181
+ if not cflag.startswith("-I"):
182
+ return cflag
183
+
184
+ return "-I" + os.path.realpath(cflag[2:])
185
+
186
+
187
+ def which(program):
188
+ def is_exe(fpath):
189
+ return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
190
+
191
+ def is_nt_exe(fpath):
192
+ return not fpath.lower().endswith('.exe') and \
193
+ os.path.isfile(fpath + '.exe') and \
194
+ os.access(fpath + '.exe', os.X_OK)
195
+
196
+ fpath, fname = os.path.split(program)
197
+ if fpath:
198
+ if is_exe(program):
199
+ return program
200
+ if os.name == 'nt' and is_nt_exe(program):
201
+ return program + '.exe'
202
+ else:
203
+ for path in os.environ["PATH"].split(os.pathsep):
204
+ path = path.strip('"')
205
+ exe_file = os.path.join(path, program)
206
+ if is_exe(exe_file):
207
+ return exe_file
208
+ if os.name == 'nt' and is_nt_exe(exe_file):
209
+ return exe_file + '.exe'
210
+
211
+ return None
@@ -24,48 +24,16 @@ import os
24
24
 
25
25
  from contextlib import contextmanager
26
26
  from cStringIO import StringIO
27
- from xml.sax.saxutils import escape, quoteattr
27
+ from xml.sax.saxutils import escape
28
28
 
29
29
  from .libtoolimporter import LibtoolImporter
30
30
 
31
31
 
32
- def _calc_attrs_length(attributes, indent, self_indent):
33
- if indent == -1:
34
- return -1
35
- attr_length = 0
36
- for attr, value in attributes:
37
- # FIXME: actually, if we have attributes with None as value this
38
- # should be considered a bug and raise an error. We are just
39
- # ignoring them here while we fix GIRParser to create the right
40
- # ast with the correct attributes.
41
- if value is None:
42
- continue
43
- attr_length += 2 + len(attr) + len(quoteattr(value))
44
- return attr_length + indent + self_indent
45
-
46
-
47
- def collect_attributes(tag_name, attributes, self_indent, self_indent_char, indent=-1):
48
- if not attributes:
49
- return ''
50
- if _calc_attrs_length(attributes, indent, self_indent) > 79:
51
- indent_len = self_indent + len(tag_name) + 1
32
+ with LibtoolImporter(None, None):
33
+ if 'UNINSTALLED_INTROSPECTION_SRCDIR' in os.environ:
34
+ from _giscanner import collect_attributes
52
35
  else:
53
- indent_len = 0
54
- first = True
55
- attr_value = ''
56
- for attr, value in attributes:
57
- # FIXME: actually, if we have attributes with None as value this
58
- # should be considered a bug and raise an error. We are just
59
- # ignoring them here while we fix GIRParser to create the right
60
- # ast with the correct attributes.
61
- if value is None:
62
- continue
63
- if indent_len and not first:
64
- attr_value += '\n%s' % (self_indent_char * indent_len)
65
- attr_value += ' %s=%s' % (attr, quoteattr(value))
66
- if first:
67
- first = False
68
- return attr_value
36
+ from giscanner._giscanner import collect_attributes
69
37
 
70
38
 
71
39
  def build_xml_tag(tag_name, attributes=None, data=None, self_indent=0,
@@ -87,13 +55,6 @@ def build_xml_tag(tag_name, attributes=None, data=None, self_indent=0,
87
55
  return prefix + attrs + suffix
88
56
 
89
57
 
90
- with LibtoolImporter(None, None):
91
- if 'UNINSTALLED_INTROSPECTION_SRCDIR' in os.environ:
92
- from _giscanner import collect_attributes
93
- else:
94
- from giscanner._giscanner import collect_attributes
95
-
96
-
97
58
  class XMLWriter(object):
98
59
 
99
60
  def __init__(self):
Binary file