gobject-introspection 2.0.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. data/Rakefile +118 -0
  2. data/ext/gobject-introspection/depend +10 -0
  3. data/ext/gobject-introspection/extconf.rb +97 -0
  4. data/ext/gobject-introspection/gobject_introspection.def +5 -0
  5. data/ext/gobject-introspection/rb-gi-arg-info.c +151 -0
  6. data/ext/gobject-introspection/rb-gi-argument.c +1015 -0
  7. data/ext/gobject-introspection/rb-gi-base-info.c +218 -0
  8. data/ext/gobject-introspection/rb-gi-boxed-info.c +48 -0
  9. data/ext/gobject-introspection/rb-gi-callable-info.c +104 -0
  10. data/ext/gobject-introspection/rb-gi-callback-info.c +48 -0
  11. data/ext/gobject-introspection/rb-gi-constant-info.c +77 -0
  12. data/ext/gobject-introspection/rb-gi-constructor-info.c +120 -0
  13. data/ext/gobject-introspection/rb-gi-conversions.h +116 -0
  14. data/ext/gobject-introspection/rb-gi-enum-info.c +145 -0
  15. data/ext/gobject-introspection/rb-gi-field-info.c +153 -0
  16. data/ext/gobject-introspection/rb-gi-flags-info.c +48 -0
  17. data/ext/gobject-introspection/rb-gi-function-info.c +658 -0
  18. data/ext/gobject-introspection/rb-gi-interface-info.c +222 -0
  19. data/ext/gobject-introspection/rb-gi-loader.c +162 -0
  20. data/ext/gobject-introspection/rb-gi-method-info.c +109 -0
  21. data/ext/gobject-introspection/rb-gi-object-info.c +345 -0
  22. data/ext/gobject-introspection/rb-gi-private.h +110 -0
  23. data/ext/gobject-introspection/rb-gi-property-info.c +77 -0
  24. data/ext/gobject-introspection/rb-gi-registered-type-info.c +86 -0
  25. data/ext/gobject-introspection/rb-gi-repository.c +164 -0
  26. data/ext/gobject-introspection/rb-gi-signal-info.c +77 -0
  27. data/ext/gobject-introspection/rb-gi-struct-info.c +190 -0
  28. data/ext/gobject-introspection/rb-gi-type-info.c +143 -0
  29. data/ext/gobject-introspection/rb-gi-type-tag.c +43 -0
  30. data/ext/gobject-introspection/rb-gi-types.h +71 -0
  31. data/ext/gobject-introspection/rb-gi-union-info.c +206 -0
  32. data/ext/gobject-introspection/rb-gi-unresolved-info.c +48 -0
  33. data/ext/gobject-introspection/rb-gi-value-info.c +57 -0
  34. data/ext/gobject-introspection/rb-gi-vfunc-info.c +91 -0
  35. data/ext/gobject-introspection/rb-gobject-introspection.c +44 -0
  36. data/ext/gobject-introspection/rb-gobject-introspection.h +57 -0
  37. data/extconf.rb +71 -0
  38. data/lib/1.9/gobject_introspection.so +0 -0
  39. data/lib/2.0/gobject_introspection.so +0 -0
  40. data/lib/gobject-introspection.rb +52 -0
  41. data/lib/gobject-introspection/callable-info.rb +91 -0
  42. data/lib/gobject-introspection/collection-reader.rb +34 -0
  43. data/lib/gobject-introspection/interface-info.rb +32 -0
  44. data/lib/gobject-introspection/loader.rb +328 -0
  45. data/lib/gobject-introspection/object-info.rb +33 -0
  46. data/lib/gobject-introspection/repository.rb +32 -0
  47. data/lib/gobject-introspection/struct-info.rb +28 -0
  48. data/lib/gobject-introspection/union-info.rb +28 -0
  49. data/test/gobject-introspection-test-utils.rb +26 -0
  50. data/test/run-test.rb +45 -0
  51. data/test/test-arg-info.rb +68 -0
  52. data/test/test-base-info.rb +31 -0
  53. data/test/test-boxed-info.rb +21 -0
  54. data/test/test-callable-info.rb +49 -0
  55. data/test/test-callback-info.rb +29 -0
  56. data/test/test-constant-info.rb +24 -0
  57. data/test/test-enum-info.rb +56 -0
  58. data/test/test-field-type.rb +42 -0
  59. data/test/test-flags-info.rb +27 -0
  60. data/test/test-function-info.rb +37 -0
  61. data/test/test-interface-info.rb +97 -0
  62. data/test/test-loader.rb +30 -0
  63. data/test/test-object-info.rb +131 -0
  64. data/test/test-property-info.rb +38 -0
  65. data/test/test-registered-type-info.rb +35 -0
  66. data/test/test-repository.rb +59 -0
  67. data/test/test-signal-info.rb +37 -0
  68. data/test/test-struct-info.rb +57 -0
  69. data/test/test-type-info.rb +62 -0
  70. data/test/test-type-tag.rb +29 -0
  71. data/test/test-union-info.rb +21 -0
  72. data/test/test-value-info.rb +28 -0
  73. data/test/test-vfunc-info.rb +42 -0
  74. data/vendor/local/bin/g-ir-compiler.exe +0 -0
  75. data/vendor/local/bin/g-ir-generate.exe +0 -0
  76. data/vendor/local/bin/libgirepository-1.0-1.dll +0 -0
  77. data/vendor/local/include/gobject-introspection-1.0/giarginfo.h +52 -0
  78. data/vendor/local/include/gobject-introspection-1.0/gibaseinfo.h +89 -0
  79. data/vendor/local/include/gobject-introspection-1.0/gicallableinfo.h +74 -0
  80. data/vendor/local/include/gobject-introspection-1.0/giconstantinfo.h +46 -0
  81. data/vendor/local/include/gobject-introspection-1.0/gienuminfo.h +56 -0
  82. data/vendor/local/include/gobject-introspection-1.0/gifieldinfo.h +52 -0
  83. data/vendor/local/include/gobject-introspection-1.0/gifunctioninfo.h +77 -0
  84. data/vendor/local/include/gobject-introspection-1.0/giinterfaceinfo.h +68 -0
  85. data/vendor/local/include/gobject-introspection-1.0/giobjectinfo.h +137 -0
  86. data/vendor/local/include/gobject-introspection-1.0/gipropertyinfo.h +44 -0
  87. data/vendor/local/include/gobject-introspection-1.0/giregisteredtypeinfo.h +53 -0
  88. data/vendor/local/include/gobject-introspection-1.0/girepository.h +179 -0
  89. data/vendor/local/include/gobject-introspection-1.0/girffi.h +80 -0
  90. data/vendor/local/include/gobject-introspection-1.0/gisignalinfo.h +45 -0
  91. data/vendor/local/include/gobject-introspection-1.0/gistructinfo.h +53 -0
  92. data/vendor/local/include/gobject-introspection-1.0/gitypeinfo.h +56 -0
  93. data/vendor/local/include/gobject-introspection-1.0/gitypelib.h +55 -0
  94. data/vendor/local/include/gobject-introspection-1.0/gitypes.h +453 -0
  95. data/vendor/local/include/gobject-introspection-1.0/giunioninfo.h +57 -0
  96. data/vendor/local/include/gobject-introspection-1.0/givfuncinfo.h +56 -0
  97. data/vendor/local/lib/girepository-1.0/DBus-1.0.typelib +0 -0
  98. data/vendor/local/lib/girepository-1.0/DBusGLib-1.0.typelib +0 -0
  99. data/vendor/local/lib/girepository-1.0/GIRepository-2.0.typelib +0 -0
  100. data/vendor/local/lib/girepository-1.0/GL-1.0.typelib +0 -0
  101. data/vendor/local/lib/girepository-1.0/GLib-2.0.typelib +0 -0
  102. data/vendor/local/lib/girepository-1.0/GModule-2.0.typelib +0 -0
  103. data/vendor/local/lib/girepository-1.0/GObject-2.0.typelib +0 -0
  104. data/vendor/local/lib/girepository-1.0/Gio-2.0.typelib +0 -0
  105. data/vendor/local/lib/girepository-1.0/cairo-1.0.typelib +0 -0
  106. data/vendor/local/lib/girepository-1.0/fontconfig-2.0.typelib +0 -0
  107. data/vendor/local/lib/girepository-1.0/freetype2-2.0.typelib +0 -0
  108. data/vendor/local/lib/girepository-1.0/libxml2-2.0.typelib +0 -0
  109. data/vendor/local/lib/girepository-1.0/xfixes-4.0.typelib +0 -0
  110. data/vendor/local/lib/girepository-1.0/xft-2.0.typelib +0 -0
  111. data/vendor/local/lib/girepository-1.0/xlib-2.0.typelib +0 -0
  112. data/vendor/local/lib/girepository-1.0/xrandr-1.3.typelib +0 -0
  113. data/vendor/local/lib/gobject-introspection/giscanner/__init__.py +24 -0
  114. data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyc +0 -0
  115. data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyo +0 -0
  116. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.py +74 -0
  117. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyc +0 -0
  118. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyo +0 -0
  119. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.py +1204 -0
  120. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyc +0 -0
  121. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyo +0 -0
  122. data/vendor/local/lib/gobject-introspection/giscanner/ast.py +1100 -0
  123. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyc +0 -0
  124. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyo +0 -0
  125. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.py +196 -0
  126. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyc +0 -0
  127. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyo +0 -0
  128. data/vendor/local/lib/gobject-introspection/giscanner/codegen.py +140 -0
  129. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyc +0 -0
  130. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyo +0 -0
  131. data/vendor/local/lib/gobject-introspection/giscanner/docmain.py +60 -0
  132. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyc +0 -0
  133. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyo +0 -0
  134. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/class.tmpl +2 -0
  135. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/constructor.tmpl +1 -0
  136. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/default.tmpl +1 -0
  137. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/enum.tmpl +2 -0
  138. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/function.tmpl +61 -0
  139. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/method.tmpl +1 -0
  140. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/namespace.tmpl +1 -0
  141. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/property.tmpl +5 -0
  142. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/record.tmpl +1 -0
  143. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/signal.tmpl +5 -0
  144. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/C/vfunc.tmpl +4 -0
  145. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/class.tmpl +18 -0
  146. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/constructor.tmpl +1 -0
  147. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/default.tmpl +1 -0
  148. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/enum.tmpl +13 -0
  149. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/function.tmpl +48 -0
  150. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/method.tmpl +1 -0
  151. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/namespace.tmpl +2 -0
  152. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/property.tmpl +10 -0
  153. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/record.tmpl +2 -0
  154. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/signal.tmpl +37 -0
  155. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Gjs/vfunc.tmpl +27 -0
  156. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/class.tmpl +17 -0
  157. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/constructor.tmpl +1 -0
  158. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/default.tmpl +1 -0
  159. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/enum.tmpl +13 -0
  160. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/function.tmpl +53 -0
  161. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/method.tmpl +1 -0
  162. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/namespace.tmpl +2 -0
  163. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/property.tmpl +10 -0
  164. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/record.tmpl +2 -0
  165. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/signal.tmpl +42 -0
  166. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/Python/vfunc.tmpl +33 -0
  167. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/base.tmpl +29 -0
  168. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/class.tmpl +40 -0
  169. data/vendor/local/lib/gobject-introspection/giscanner/doctemplates/namespace.tmpl +19 -0
  170. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.py +635 -0
  171. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyc +0 -0
  172. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyo +0 -0
  173. data/vendor/local/lib/gobject-introspection/giscanner/dumper.py +363 -0
  174. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyc +0 -0
  175. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyo +0 -0
  176. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.py +551 -0
  177. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyc +0 -0
  178. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyo +0 -0
  179. data/vendor/local/lib/gobject-introspection/giscanner/girparser.py +581 -0
  180. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyc +0 -0
  181. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyo +0 -0
  182. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.py +584 -0
  183. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyc +0 -0
  184. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyo +0 -0
  185. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.py +236 -0
  186. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyc +0 -0
  187. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyo +0 -0
  188. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.py +76 -0
  189. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyc +0 -0
  190. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyo +0 -0
  191. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.py +1337 -0
  192. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyc +0 -0
  193. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyo +0 -0
  194. data/vendor/local/lib/gobject-introspection/giscanner/message.py +185 -0
  195. data/vendor/local/lib/gobject-introspection/giscanner/message.pyc +0 -0
  196. data/vendor/local/lib/gobject-introspection/giscanner/message.pyo +0 -0
  197. data/vendor/local/lib/gobject-introspection/giscanner/odict.py +50 -0
  198. data/vendor/local/lib/gobject-introspection/giscanner/odict.pyc +0 -0
  199. data/vendor/local/lib/gobject-introspection/giscanner/odict.pyo +0 -0
  200. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.py +497 -0
  201. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyc +0 -0
  202. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyo +0 -0
  203. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.py +78 -0
  204. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyc +0 -0
  205. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyo +0 -0
  206. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.py +132 -0
  207. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyc +0 -0
  208. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyo +0 -0
  209. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.py +324 -0
  210. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyc +0 -0
  211. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyo +0 -0
  212. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.py +119 -0
  213. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyc +0 -0
  214. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyo +0 -0
  215. data/vendor/local/lib/gobject-introspection/giscanner/transformer.py +999 -0
  216. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyc +0 -0
  217. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyo +0 -0
  218. data/vendor/local/lib/gobject-introspection/giscanner/utils.py +141 -0
  219. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyc +0 -0
  220. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyo +0 -0
  221. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.py +197 -0
  222. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyc +0 -0
  223. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyo +0 -0
  224. data/vendor/local/lib/libgirepository-1.0.a +0 -0
  225. data/vendor/local/lib/libgirepository-1.0.dll.a +0 -0
  226. data/vendor/local/lib/libgirepository-1.0.la +41 -0
  227. data/vendor/local/lib/pkgconfig/gobject-introspection-1.0.pc +26 -0
  228. data/vendor/local/lib/pkgconfig/gobject-introspection-no-export-1.0.pc +23 -0
  229. data/vendor/local/share/aclocal/introspection.m4 +96 -0
  230. data/vendor/local/share/gir-1.0/DBus-1.0.gir +32 -0
  231. data/vendor/local/share/gir-1.0/DBusGLib-1.0.gir +18 -0
  232. data/vendor/local/share/gir-1.0/GIRepository-2.0.gir +3833 -0
  233. data/vendor/local/share/gir-1.0/GL-1.0.gir +31 -0
  234. data/vendor/local/share/gir-1.0/GLib-2.0.gir +44304 -0
  235. data/vendor/local/share/gir-1.0/GModule-2.0.gir +184 -0
  236. data/vendor/local/share/gir-1.0/GObject-2.0.gir +13947 -0
  237. data/vendor/local/share/gir-1.0/Gio-2.0.gir +73619 -0
  238. data/vendor/local/share/gir-1.0/cairo-1.0.gir +70 -0
  239. data/vendor/local/share/gir-1.0/fontconfig-2.0.gir +18 -0
  240. data/vendor/local/share/gir-1.0/freetype2-2.0.gir +22 -0
  241. data/vendor/local/share/gir-1.0/libxml2-2.0.gir +25 -0
  242. data/vendor/local/share/gir-1.0/xfixes-4.0.gir +10 -0
  243. data/vendor/local/share/gir-1.0/xft-2.0.gir +23 -0
  244. data/vendor/local/share/gir-1.0/xlib-2.0.gir +67 -0
  245. data/vendor/local/share/gir-1.0/xrandr-1.3.gir +16 -0
  246. data/vendor/local/share/gobject-introspection-1.0/Makefile.introspection +166 -0
  247. data/vendor/local/share/gobject-introspection-1.0/gdump.c +564 -0
  248. data/vendor/local/share/gobject-introspection-1.0/tests/annotation.c +835 -0
  249. data/vendor/local/share/gobject-introspection-1.0/tests/annotation.h +198 -0
  250. data/vendor/local/share/gobject-introspection-1.0/tests/drawable.c +55 -0
  251. data/vendor/local/share/gobject-introspection-1.0/tests/drawable.h +33 -0
  252. data/vendor/local/share/gobject-introspection-1.0/tests/everything.c +1473 -0
  253. data/vendor/local/share/gobject-introspection-1.0/tests/everything.h +428 -0
  254. data/vendor/local/share/gobject-introspection-1.0/tests/foo.c +790 -0
  255. data/vendor/local/share/gobject-introspection-1.0/tests/foo.h +437 -0
  256. data/vendor/local/share/gobject-introspection-1.0/tests/gimarshallingtests.c +5256 -0
  257. data/vendor/local/share/gobject-introspection-1.0/tests/gimarshallingtests.h +1158 -0
  258. data/vendor/local/share/gobject-introspection-1.0/tests/regress.c +4009 -0
  259. data/vendor/local/share/gobject-introspection-1.0/tests/regress.h +944 -0
  260. data/vendor/local/share/gobject-introspection-1.0/tests/utility.c +45 -0
  261. data/vendor/local/share/gobject-introspection-1.0/tests/utility.h +95 -0
  262. data/vendor/local/share/gobject-introspection-1.0/tests/warnlib.c +33 -0
  263. data/vendor/local/share/gobject-introspection-1.0/tests/warnlib.h +36 -0
  264. data/vendor/local/share/license/gobject-introspection/AUTHORS +9 -0
  265. data/vendor/local/share/license/gobject-introspection/COPYING +12 -0
  266. data/vendor/local/share/man/man1/g-ir-compiler.1 +51 -0
  267. data/vendor/local/share/man/man1/g-ir-generate.1 +29 -0
  268. metadata +343 -0
@@ -0,0 +1,363 @@
1
+ # -*- Mode: Python -*-
2
+ # GObject-Introspection - a framework for introspecting GObject libraries
3
+ # Copyright (C) 2008 Colin Walters
4
+ # Copyright (C) 2008 Johan Dahlin
5
+ #
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.
10
+ #
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.
15
+ #
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.
20
+ #
21
+
22
+ import os
23
+ import sys
24
+ import subprocess
25
+ import shutil
26
+ import tempfile
27
+
28
+ from .gdumpparser import IntrospectionBinary
29
+ from . import utils
30
+
31
+ # bugzilla.gnome.org/558436
32
+ # Compile a binary program which is then linked to a library
33
+ # we want to introspect, in order to call its get_type functions.
34
+
35
+ _PROGRAM_TEMPLATE = """/* This file is generated, do not edit */
36
+ #include <glib.h>
37
+ #include <string.h>
38
+ #include <stdlib.h>
39
+
40
+ %(gdump_include)s
41
+
42
+ int
43
+ main(int argc, char **argv)
44
+ {
45
+ GError *error = NULL;
46
+ const char *introspect_dump_prefix = "--introspect-dump=";
47
+
48
+ #if !GLIB_CHECK_VERSION(2,35,0)
49
+ g_type_init ();
50
+ #endif
51
+
52
+ %(init_sections)s
53
+
54
+ if (argc != 2 || !g_str_has_prefix (argv[1], introspect_dump_prefix))
55
+ {
56
+ g_printerr ("Usage: %%s --introspect-dump=input,output", argv[0]);
57
+ exit (1);
58
+ }
59
+
60
+ if (!dump_irepository (argv[1] + strlen(introspect_dump_prefix), &error))
61
+ {
62
+ g_printerr ("%%s\\n", error->message);
63
+ exit (1);
64
+ }
65
+ exit (0);
66
+ }
67
+ """
68
+
69
+
70
+ class CompilerError(Exception):
71
+ pass
72
+
73
+
74
+ class LinkerError(Exception):
75
+ pass
76
+
77
+
78
+ class DumpCompiler(object):
79
+
80
+ def __init__(self, options, get_type_functions, error_quark_functions):
81
+ self._options = options
82
+ self._get_type_functions = get_type_functions
83
+ self._error_quark_functions = error_quark_functions
84
+
85
+ self._compiler_cmd = os.environ.get('CC', 'gcc')
86
+ self._linker_cmd = os.environ.get('CC', self._compiler_cmd)
87
+ self._pkgconfig_cmd = os.environ.get('PKG_CONFIG', 'pkg-config')
88
+ self._pkgconfig_msvc_flags = ''
89
+ # Enable the --msvc-syntax pkg-config flag when
90
+ # the Microsoft compiler is used
91
+ # (This is the other way to check whether Visual C++ is used subsequently)
92
+ if 'cl' in self._compiler_cmd:
93
+ self._pkgconfig_msvc_flags = '--msvc-syntax'
94
+ self._uninst_srcdir = os.environ.get(
95
+ 'UNINSTALLED_INTROSPECTION_SRCDIR')
96
+ self._packages = ['gio-2.0 gmodule-2.0']
97
+ self._packages.extend(options.packages)
98
+
99
+ # Public API
100
+
101
+ def run(self):
102
+ # We have to use the current directory to work around Unix
103
+ # sysadmins who mount /tmp noexec
104
+ tmpdir = tempfile.mkdtemp('', 'tmp-introspect', dir=os.getcwd())
105
+
106
+ tpl_args = {}
107
+ if self._uninst_srcdir is not None:
108
+ gdump_path = os.path.join(self._uninst_srcdir, 'girepository', 'gdump.c')
109
+ else:
110
+ gdump_path = os.path.join(os.path.join(DATADIR), 'gobject-introspection-1.0',
111
+ 'gdump.c')
112
+ if not os.path.isfile(gdump_path):
113
+ raise SystemExit("Couldn't find %r" % (gdump_path, ))
114
+ gdump_file = open(gdump_path)
115
+ gdump_contents = gdump_file.read()
116
+ gdump_file.close()
117
+ tpl_args['gdump_include'] = gdump_contents
118
+ tpl_args['init_sections'] = "\n".join(self._options.init_sections)
119
+
120
+ c_path = self._generate_tempfile(tmpdir, '.c')
121
+ f = open(c_path, 'w')
122
+ f.write(_PROGRAM_TEMPLATE % tpl_args)
123
+
124
+ # We need to reference our get_type and error_quark functions
125
+ # to make sure they are pulled in at the linking stage if the
126
+ # library is a static library rather than a shared library.
127
+ if len(self._get_type_functions) > 0:
128
+ for func in self._get_type_functions:
129
+ f.write("extern GType " + func + "(void);\n")
130
+ f.write("GType (*GI_GET_TYPE_FUNCS_[])(void) = {\n")
131
+ first = True
132
+ for func in self._get_type_functions:
133
+ if first:
134
+ first = False
135
+ else:
136
+ f.write(",\n")
137
+ f.write(" " + func)
138
+ f.write("\n};\n")
139
+ if len(self._error_quark_functions) > 0:
140
+ for func in self._error_quark_functions:
141
+ f.write("extern GQuark " + func + "(void);\n")
142
+ f.write("GQuark (*GI_ERROR_QUARK_FUNCS_[])(void) = {\n")
143
+ first = True
144
+ for func in self._error_quark_functions:
145
+ if first:
146
+ first = False
147
+ else:
148
+ f.write(",\n")
149
+ f.write(" " + func)
150
+ f.write("\n};\n")
151
+ f.close()
152
+
153
+ # Microsoft compilers generate intermediate .obj files
154
+ # during compilation, unlike .o files like GCC and others
155
+ if self._pkgconfig_msvc_flags:
156
+ o_path = self._generate_tempfile(tmpdir, '.obj')
157
+ else:
158
+ o_path = self._generate_tempfile(tmpdir, '.o')
159
+
160
+ if os.name == 'nt':
161
+ ext = 'exe'
162
+ else:
163
+ ext = ''
164
+
165
+ bin_path = self._generate_tempfile(tmpdir, ext)
166
+
167
+ try:
168
+ self._compile(o_path, c_path)
169
+ except CompilerError, e:
170
+ if not utils.have_debug_flag('save-temps'):
171
+ shutil.rmtree(tmpdir)
172
+ raise SystemExit('compilation of temporary binary failed:' + str(e))
173
+
174
+ try:
175
+ self._link(bin_path, o_path)
176
+ except LinkerError, e:
177
+ if not utils.have_debug_flag('save-temps'):
178
+ shutil.rmtree(tmpdir)
179
+ raise SystemExit('linking of temporary binary failed: ' + str(e))
180
+
181
+ return IntrospectionBinary([bin_path], tmpdir)
182
+
183
+ # Private API
184
+
185
+ def _generate_tempfile(self, tmpdir, suffix=''):
186
+ tmpl = '%s-%s%s' % (self._options.namespace_name,
187
+ self._options.namespace_version, suffix)
188
+ return os.path.join(tmpdir, tmpl)
189
+
190
+ def _run_pkgconfig(self, flag):
191
+ # Enable the --msvc-syntax pkg-config flag when
192
+ # the Microsoft compiler is used
193
+ if self._pkgconfig_msvc_flags:
194
+ cmd = [self._pkgconfig_cmd, self._pkgconfig_msvc_flags, flag]
195
+ else:
196
+ cmd = [self._pkgconfig_cmd, flag]
197
+ proc = subprocess.Popen(
198
+ cmd + self._packages,
199
+ stdout=subprocess.PIPE)
200
+ return proc.communicate()[0].split()
201
+
202
+ def _compile(self, output, *sources):
203
+ # Not strictly speaking correct, but easier than parsing shell
204
+ args = self._compiler_cmd.split()
205
+ # Do not add -Wall when using init code as we do not include any
206
+ # header of the library being introspected
207
+ if self._compiler_cmd == 'gcc' and not self._options.init_sections:
208
+ args.append('-Wall')
209
+ # The Microsoft compiler uses different option flags for
210
+ # silencing warnings on deprecated function usage
211
+ if self._pkgconfig_msvc_flags:
212
+ args.append("-wd4996")
213
+ else:
214
+ args.append("-Wno-deprecated-declarations")
215
+ pkgconfig_flags = self._run_pkgconfig('--cflags')
216
+ args.extend(pkgconfig_flags)
217
+ cflags = os.environ.get('CFLAGS', '')
218
+ for cflag in cflags.split():
219
+ args.append(cflag)
220
+ for include in self._options.cpp_includes:
221
+ args.append('-I' + include)
222
+ # The Microsoft compiler uses different option flags for
223
+ # compilation result output
224
+ if self._pkgconfig_msvc_flags:
225
+ args.extend(['-c', '-Fe'+output, '-Fo'+output])
226
+ else:
227
+ args.extend(['-c', '-o', output])
228
+ for source in sources:
229
+ if not os.path.exists(source):
230
+ raise CompilerError(
231
+ "Could not find c source file: %s" % (source, ))
232
+ args.extend(list(sources))
233
+ if not self._options.quiet:
234
+ print "g-ir-scanner: compile: %s" % (
235
+ subprocess.list2cmdline(args), )
236
+ sys.stdout.flush()
237
+ try:
238
+ subprocess.check_call(args)
239
+ except subprocess.CalledProcessError, e:
240
+ raise CompilerError(e)
241
+
242
+ def _link(self, output, *sources):
243
+ args = []
244
+ libtool = utils.get_libtool_command(self._options)
245
+ if libtool:
246
+ args.extend(libtool)
247
+ args.append('--mode=link')
248
+ args.append('--tag=CC')
249
+ if self._options.quiet:
250
+ args.append('--silent')
251
+
252
+ args.extend(self._linker_cmd.split())
253
+ # We can use -o for the Microsoft compiler/linker,
254
+ # but it is considered deprecated usage with that
255
+ if self._pkgconfig_msvc_flags:
256
+ args.extend(['-Fe'+output])
257
+ else:
258
+ args.extend(['-o', output])
259
+ if libtool:
260
+ if os.name == 'nt':
261
+ args.append('-export-all-symbols')
262
+ else:
263
+ args.append('-export-dynamic')
264
+
265
+ cflags = os.environ.get('CFLAGS', '')
266
+ for cflag in cflags.split():
267
+ args.append(cflag)
268
+ ldflags = os.environ.get('LDFLAGS', '')
269
+ for ldflag in ldflags.split():
270
+ args.append(ldflag)
271
+
272
+ # Make sure to list the library to be introspected first since it's
273
+ # likely to be uninstalled yet and we want the uninstalled RPATHs have
274
+ # priority (or we might run with installed library that is older)
275
+
276
+ for source in sources:
277
+ if not os.path.exists(source):
278
+ raise CompilerError(
279
+ "Could not find object file: %s" % (source, ))
280
+ args.extend(list(sources))
281
+
282
+ if not self._options.external_library:
283
+ self._add_link_internal_args(args, libtool)
284
+ else:
285
+ self._add_link_external_args(args)
286
+
287
+ if not self._options.quiet:
288
+ print "g-ir-scanner: link: %s" % (
289
+ subprocess.list2cmdline(args), )
290
+ sys.stdout.flush()
291
+ try:
292
+ subprocess.check_call(args)
293
+ except subprocess.CalledProcessError, e:
294
+ raise LinkerError(e)
295
+
296
+ def _add_link_internal_args(self, args, libtool):
297
+ # An "internal" link is where the library to be introspected
298
+ # is being built in the current directory.
299
+
300
+ # Search the current directory first
301
+ # (This flag is not supported nor needed for Visual C++)
302
+ if self._pkgconfig_msvc_flags == '':
303
+ args.append('-L.')
304
+
305
+ # https://bugzilla.gnome.org/show_bug.cgi?id=625195
306
+ if not libtool:
307
+ # We don't have -Wl,-rpath for Visual C++, and that's
308
+ # going to cause a problem. Instead, link to internal
309
+ # libraries by deducing the .lib file name using
310
+ # the namespace name and version
311
+ if self._pkgconfig_msvc_flags:
312
+ if self._options.namespace_version:
313
+ args.append(str.lower(self._options.namespace_name) +
314
+ '-' +
315
+ self._options.namespace_version+'.lib')
316
+ else:
317
+ args.append(str.lower(self._options.namespace_name)+'.lib')
318
+ else:
319
+ args.append('-Wl,-rpath=.')
320
+
321
+ for library in self._options.libraries:
322
+ # Visual C++: We have the needed .lib files now, and we need to link
323
+ # to .lib files, not the .dll as the --library option specifies the
324
+ # .dll(s) the .gir file refers to
325
+ if self._pkgconfig_msvc_flags == '':
326
+ if library.endswith(".la"): # explicitly specified libtool library
327
+ args.append(library)
328
+ else:
329
+ args.append('-l' + library)
330
+
331
+ for library_path in self._options.library_paths:
332
+ # Not used/needed on Visual C++, and -Wl,-rpath options
333
+ # will cause grief
334
+ if self._pkgconfig_msvc_flags == '':
335
+ args.append('-L' + library_path)
336
+ if os.path.isabs(library_path):
337
+ if libtool:
338
+ args.append('-rpath')
339
+ args.append(library_path)
340
+ else:
341
+ args.append('-Wl,-rpath=' + library_path)
342
+
343
+ args.extend(self._run_pkgconfig('--libs'))
344
+
345
+ def _add_link_external_args(self, args):
346
+ # An "external" link is where the library to be introspected
347
+ # is installed on the system; this case is used for the scanning
348
+ # of GLib in gobject-introspection itself.
349
+
350
+ args.extend(self._run_pkgconfig('--libs'))
351
+ for library in self._options.libraries:
352
+ # The --library option on Windows pass in the .dll file(s) the
353
+ # .gir files refer to, so don't link to them on Visual C++
354
+ if self._pkgconfig_msvc_flags == '':
355
+ if library.endswith(".la"): # explicitly specified libtool library
356
+ args.append(library)
357
+ else:
358
+ args.append('-l' + library)
359
+
360
+ def compile_introspection_binary(options, get_type_functions,
361
+ error_quark_functions):
362
+ dc = DumpCompiler(options, get_type_functions, error_quark_functions)
363
+ return dc.run()
@@ -0,0 +1,551 @@
1
+ # -*- Mode: Python -*-
2
+ # GObject-Introspection - a framework for introspecting GObject libraries
3
+ # Copyright (C) 2008 Johan Dahlin
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the
17
+ # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18
+ # Boston, MA 02111-1307, USA.
19
+ #
20
+
21
+ import os
22
+ import sys
23
+ import tempfile
24
+ import shutil
25
+ import subprocess
26
+ from xml.etree.cElementTree import parse
27
+
28
+ from . import ast
29
+ from . import message
30
+ from . import utils
31
+ from .transformer import TransformerException
32
+ from .utils import to_underscores
33
+
34
+ # GParamFlags
35
+ G_PARAM_READABLE = 1 << 0
36
+ G_PARAM_WRITABLE = 1 << 1
37
+ G_PARAM_CONSTRUCT = 1 << 2
38
+ G_PARAM_CONSTRUCT_ONLY = 1 << 3
39
+ G_PARAM_LAX_VALIDATION = 1 << 4
40
+ G_PARAM_STATIC_NAME = 1 << 5
41
+ G_PARAM_STATIC_NICK = 1 << 6
42
+ G_PARAM_STATIC_BLURB = 1 << 7
43
+
44
+
45
+ class IntrospectionBinary(object):
46
+
47
+ def __init__(self, args, tmpdir=None):
48
+ self.args = args
49
+ if tmpdir is None:
50
+ self.tmpdir = tempfile.mkdtemp('', 'tmp-introspect')
51
+ else:
52
+ self.tmpdir = tmpdir
53
+
54
+
55
+ class Unresolved(object):
56
+
57
+ def __init__(self, target):
58
+ self.target = target
59
+
60
+
61
+ class UnknownTypeError(Exception):
62
+ pass
63
+
64
+
65
+ class GDumpParser(object):
66
+
67
+ def __init__(self, transformer):
68
+ self._transformer = transformer
69
+ self._namespace = transformer.namespace
70
+ self._binary = None
71
+ self._get_type_functions = []
72
+ self._error_quark_functions = []
73
+ self._error_domains = {}
74
+ self._boxed_types = {}
75
+ self._private_internal_types = {}
76
+
77
+ # Public API
78
+
79
+ def init_parse(self):
80
+ """Do parsing steps that don't involve the introspection binary
81
+
82
+ This does enough work that get_type_functions() can be called.
83
+
84
+ """
85
+
86
+ # First pass: parsing
87
+ for node in self._namespace.itervalues():
88
+ if isinstance(node, ast.Function):
89
+ self._initparse_function(node)
90
+
91
+ if self._namespace.name == 'GObject' or self._namespace.name == 'GLib':
92
+ for node in self._namespace.itervalues():
93
+ if isinstance(node, ast.Record):
94
+ self._initparse_gobject_record(node)
95
+
96
+ def get_get_type_functions(self):
97
+ return self._get_type_functions
98
+
99
+ def get_error_quark_functions(self):
100
+ return self._error_quark_functions
101
+
102
+ def set_introspection_binary(self, binary):
103
+ self._binary = binary
104
+
105
+ def parse(self):
106
+ """Do remaining parsing steps requiring introspection binary"""
107
+
108
+ # Get all the GObject data by passing our list of get_type
109
+ # functions to the compiled binary, returning an XML blob.
110
+ tree = self._execute_binary_get_tree()
111
+ root = tree.getroot()
112
+ for child in root:
113
+ if child.tag == 'error-quark':
114
+ self._introspect_error_quark(child)
115
+ else:
116
+ self._introspect_type(child)
117
+
118
+ # Pair up boxed types and class records
119
+ for name, boxed in self._boxed_types.iteritems():
120
+ self._pair_boxed_type(boxed)
121
+ for node in self._namespace.itervalues():
122
+ if isinstance(node, (ast.Class, ast.Interface)):
123
+ self._find_class_record(node)
124
+
125
+ # Clear the _get_type functions out of the namespace;
126
+ # Anyone who wants them can get them from the ast.Class/Interface/Boxed
127
+ to_remove = []
128
+ for name, node in self._namespace.iteritems():
129
+ if isinstance(node, ast.Registered) and node.get_type is not None:
130
+ get_type_name = node.get_type
131
+ if get_type_name == 'intern':
132
+ continue
133
+ assert get_type_name, node
134
+ (ns, name) = self._transformer.split_csymbol(get_type_name)
135
+ assert ns is self._namespace
136
+ get_type_func = self._namespace.get(name)
137
+ assert get_type_func, name
138
+ to_remove.append(get_type_func)
139
+ for node in to_remove:
140
+ self._namespace.remove(node)
141
+
142
+ # Helper functions
143
+
144
+ def _execute_binary_get_tree(self):
145
+ """Load the library (or executable), returning an XML
146
+ blob containing data gleaned from GObject's primitive introspection."""
147
+ in_path = os.path.join(self._binary.tmpdir, 'functions.txt')
148
+ f = open(in_path, 'w')
149
+ for func in self._get_type_functions:
150
+ f.write('get-type:')
151
+ f.write(func)
152
+ f.write('\n')
153
+ for func in self._error_quark_functions:
154
+ f.write('error-quark:')
155
+ f.write(func)
156
+ f.write('\n')
157
+ f.close()
158
+ out_path = os.path.join(self._binary.tmpdir, 'dump.xml')
159
+
160
+ args = []
161
+ args.extend(self._binary.args)
162
+ args.append('--introspect-dump=%s,%s' % (in_path, out_path))
163
+
164
+ # Invoke the binary, having written our get_type functions to types.txt
165
+ try:
166
+ try:
167
+ subprocess.check_call(args, stdout=sys.stdout, stderr=sys.stderr)
168
+ except subprocess.CalledProcessError, e:
169
+ # Clean up temporaries
170
+ raise SystemExit(e)
171
+ return parse(out_path)
172
+ finally:
173
+ if not utils.have_debug_flag('save-temps'):
174
+ shutil.rmtree(self._binary.tmpdir)
175
+
176
+ # Parser
177
+
178
+ def _initparse_function(self, func):
179
+ symbol = func.symbol
180
+ if symbol.startswith('_'):
181
+ return
182
+ elif (symbol.endswith('_get_type') or symbol.endswith('_get_gtype')):
183
+ self._initparse_get_type_function(func)
184
+ elif symbol.endswith('_error_quark'):
185
+ self._initparse_error_quark_function(func)
186
+
187
+ def _initparse_get_type_function(self, func):
188
+ if func.symbol == 'g_variant_get_gtype':
189
+ # We handle variants internally, see _initparse_gobject_record
190
+ return True
191
+
192
+ if func.is_type_meta_function():
193
+ self._get_type_functions.append(func.symbol)
194
+ return True
195
+
196
+ return False
197
+
198
+ def _initparse_error_quark_function(self, func):
199
+ if (func.retval.type.ctype != 'GQuark'):
200
+ return False
201
+ self._error_quark_functions.append(func.symbol)
202
+ return True
203
+
204
+ def _initparse_gobject_record(self, record):
205
+ if (record.name.startswith('ParamSpec')
206
+ and not record.name in ('ParamSpecPool', 'ParamSpecClass',
207
+ 'ParamSpecTypeInfo')):
208
+ parent = None
209
+ if record.name != 'ParamSpec':
210
+ parent = ast.Type(target_giname='GObject.ParamSpec')
211
+ prefix = to_underscores(record.name).lower()
212
+ node = ast.Class(record.name, parent,
213
+ ctype=record.ctype,
214
+ # GParamSpecXxx has g_type_name 'GParamXxx'
215
+ gtype_name=record.ctype.replace('Spec', ''),
216
+ get_type='intern',
217
+ c_symbol_prefix=prefix)
218
+ node.fundamental = True
219
+ if record.name == 'ParamSpec':
220
+ node.is_abstract = True
221
+ self._add_record_fields(node)
222
+ self._namespace.append(node, replace=True)
223
+ elif record.name == 'Variant':
224
+ self._boxed_types['GVariant'] = ast.Boxed('Variant',
225
+ gtype_name='GVariant',
226
+ get_type='intern',
227
+ c_symbol_prefix='variant')
228
+ elif record.name == 'InitiallyUnownedClass':
229
+ record.fields = self._namespace.get('ObjectClass').fields
230
+ record.disguised = False
231
+
232
+ # Introspection over the data we get from the dynamic
233
+ # GObject/GType system out of the binary
234
+
235
+ def _introspect_type(self, xmlnode):
236
+ if xmlnode.tag in ('enum', 'flags'):
237
+ self._introspect_enum(xmlnode)
238
+ elif xmlnode.tag == 'class':
239
+ self._introspect_object(xmlnode)
240
+ elif xmlnode.tag == 'interface':
241
+ self._introspect_interface(xmlnode)
242
+ elif xmlnode.tag == 'boxed':
243
+ self._introspect_boxed(xmlnode)
244
+ elif xmlnode.tag == 'fundamental':
245
+ self._introspect_fundamental(xmlnode)
246
+ else:
247
+ raise ValueError("Unhandled introspection XML tag %s", xmlnode.tag)
248
+
249
+ def _introspect_enum(self, xmlnode):
250
+ type_name = xmlnode.attrib['name']
251
+ (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode)
252
+ try:
253
+ enum_name = self._transformer.strip_identifier(type_name)
254
+ except TransformerException, e:
255
+ message.fatal(e)
256
+
257
+ # The scanned member values are more accurate than the values that the
258
+ # we dumped from GEnumValue.value because GEnumValue.value has the
259
+ # values as a 32-bit signed integer, even if they were unsigned
260
+ # in the source code.
261
+ previous_values = {}
262
+ previous = self._namespace.get(enum_name)
263
+ if isinstance(previous, (ast.Enum, ast.Bitfield)):
264
+ for member in previous.members:
265
+ previous_values[member.name] = member.value
266
+
267
+ members = []
268
+ for member in xmlnode.findall('member'):
269
+ # Keep the name closer to what we'd take from C by default;
270
+ # see http://bugzilla.gnome.org/show_bug.cgi?id=575613
271
+ name = member.attrib['nick'].replace('-', '_')
272
+
273
+ if name in previous_values:
274
+ value = previous_values[name]
275
+ else:
276
+ value = member.attrib['value']
277
+
278
+ members.append(ast.Member(name,
279
+ value,
280
+ member.attrib['name'],
281
+ member.attrib['nick']))
282
+
283
+
284
+ if xmlnode.tag == 'flags':
285
+ klass = ast.Bitfield
286
+ else:
287
+ klass = ast.Enum
288
+
289
+ node = klass(enum_name, type_name,
290
+ gtype_name=type_name,
291
+ c_symbol_prefix=c_symbol_prefix,
292
+ members=members,
293
+ get_type=xmlnode.attrib['get-type'])
294
+ self._namespace.append(node, replace=True)
295
+
296
+ def _split_type_and_symbol_prefix(self, xmlnode):
297
+ """Infer the C symbol prefix from the _get_type function."""
298
+ get_type = xmlnode.attrib['get-type']
299
+ (ns, name) = self._transformer.split_csymbol(get_type)
300
+ assert ns is self._namespace
301
+ if name in ('get_type', '_get_gtype'):
302
+ message.fatal("""The GObject name %r isn't compatibile
303
+ with the configured identifier prefixes:
304
+ %r
305
+ The class would have no name. Most likely you want to specify a
306
+ different --identifier-prefix.""" % (xmlnode.attrib['name'], self._namespace.identifier_prefixes))
307
+ if name.endswith('_get_type'):
308
+ type_suffix = '_get_type'
309
+ else:
310
+ type_suffix = '_get_gtype'
311
+ return (get_type, name[:-len(type_suffix)])
312
+
313
+ def _introspect_object(self, xmlnode):
314
+ type_name = xmlnode.attrib['name']
315
+ is_abstract = bool(xmlnode.attrib.get('abstract', False))
316
+ (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode)
317
+ try:
318
+ object_name = self._transformer.strip_identifier(type_name)
319
+ except TransformerException, e:
320
+ message.fatal(e)
321
+ node = ast.Class(object_name, None,
322
+ gtype_name=type_name,
323
+ get_type=get_type,
324
+ c_symbol_prefix=c_symbol_prefix,
325
+ is_abstract=is_abstract)
326
+ self._parse_parents(xmlnode, node)
327
+ self._introspect_properties(node, xmlnode)
328
+ self._introspect_signals(node, xmlnode)
329
+ self._introspect_implemented_interfaces(node, xmlnode)
330
+ self._add_record_fields(node)
331
+
332
+ if node.name == 'InitiallyUnowned':
333
+ # http://bugzilla.gnome.org/show_bug.cgi?id=569408
334
+ # GInitiallyUnowned is actually a typedef for GObject, but
335
+ # that's not reflected in the GIR, where it appears as a
336
+ # subclass (as it appears in the GType hierarchy). So
337
+ # what we do here is copy all of the GObject fields into
338
+ # GInitiallyUnowned so that struct offset computation
339
+ # works correctly.
340
+ node.fields = self._namespace.get('Object').fields
341
+
342
+ self._namespace.append(node, replace=True)
343
+
344
+ def _introspect_interface(self, xmlnode):
345
+ type_name = xmlnode.attrib['name']
346
+ (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode)
347
+ try:
348
+ interface_name = self._transformer.strip_identifier(type_name)
349
+ except TransformerException, e:
350
+ message.fatal(e)
351
+ node = ast.Interface(interface_name, None,
352
+ gtype_name=type_name,
353
+ get_type=get_type,
354
+ c_symbol_prefix=c_symbol_prefix)
355
+ self._introspect_properties(node, xmlnode)
356
+ self._introspect_signals(node, xmlnode)
357
+ for child in xmlnode.findall('prerequisite'):
358
+ name = child.attrib['name']
359
+ prereq = ast.Type.create_from_gtype_name(name)
360
+ node.prerequisites.append(prereq)
361
+
362
+ record = self._namespace.get(node.name)
363
+ if isinstance(record, ast.Record):
364
+ node.ctype = record.ctype
365
+ else:
366
+ message.warn_node(node, "Couldn't find associated structure for '%r'" % (node.name, ))
367
+
368
+ # GtkFileChooserEmbed is an example of a private interface, we
369
+ # just filter them out
370
+ if xmlnode.attrib['get-type'].startswith('_'):
371
+ self._private_internal_types[type_name] = node
372
+ else:
373
+ self._namespace.append(node, replace=True)
374
+
375
+ ## WORKAROUND ##
376
+ # https://bugzilla.gnome.org/show_bug.cgi?id=550616
377
+ def _introspect_boxed_gstreamer_workaround(self, xmlnode):
378
+ node = ast.Boxed('ParamSpecMiniObject', gtype_name='GParamSpecMiniObject',
379
+ get_type='gst_param_spec_mini_object_get_type',
380
+ c_symbol_prefix='param_spec_mini_object')
381
+ self._boxed_types[node.gtype_name] = node
382
+
383
+ def _introspect_boxed(self, xmlnode):
384
+ type_name = xmlnode.attrib['name']
385
+
386
+ # Work around GStreamer legacy naming issue
387
+ # https://bugzilla.gnome.org/show_bug.cgi?id=550616
388
+ if type_name == 'GParamSpecMiniObject':
389
+ self._introspect_boxed_gstreamer_workaround(xmlnode)
390
+ return
391
+
392
+ try:
393
+ name = self._transformer.strip_identifier(type_name)
394
+ except TransformerException, e:
395
+ message.fatal(e)
396
+ # This one doesn't go in the main namespace; we associate it with
397
+ # the struct or union
398
+ (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode)
399
+ node = ast.Boxed(name, gtype_name=type_name,
400
+ get_type=get_type,
401
+ c_symbol_prefix=c_symbol_prefix)
402
+ self._boxed_types[node.gtype_name] = node
403
+
404
+ def _introspect_implemented_interfaces(self, node, xmlnode):
405
+ gt_interfaces = []
406
+ for interface in xmlnode.findall('implements'):
407
+ gitype = ast.Type.create_from_gtype_name(interface.attrib['name'])
408
+ gt_interfaces.append(gitype)
409
+ node.interfaces = gt_interfaces
410
+
411
+ def _introspect_properties(self, node, xmlnode):
412
+ for pspec in xmlnode.findall('property'):
413
+ ctype = pspec.attrib['type']
414
+ flags = int(pspec.attrib['flags'])
415
+ readable = (flags & G_PARAM_READABLE) != 0
416
+ writable = (flags & G_PARAM_WRITABLE) != 0
417
+ construct = (flags & G_PARAM_CONSTRUCT) != 0
418
+ construct_only = (flags & G_PARAM_CONSTRUCT_ONLY) != 0
419
+ node.properties.append(ast.Property(
420
+ pspec.attrib['name'],
421
+ ast.Type.create_from_gtype_name(ctype),
422
+ readable, writable, construct, construct_only))
423
+ node.properties = node.properties
424
+
425
+ def _introspect_signals(self, node, xmlnode):
426
+ for signal_info in xmlnode.findall('signal'):
427
+ rctype = signal_info.attrib['return']
428
+ rtype = ast.Type.create_from_gtype_name(rctype)
429
+ return_ = ast.Return(rtype)
430
+ parameters = []
431
+ when = signal_info.attrib.get('when')
432
+ no_recurse = signal_info.attrib.get('no-recurse', '0') == '1'
433
+ detailed = signal_info.attrib.get('detailed', '0') == '1'
434
+ action = signal_info.attrib.get('action', '0') == '1'
435
+ no_hooks = signal_info.attrib.get('no-hooks', '0') == '1'
436
+ for i, parameter in enumerate(signal_info.findall('param')):
437
+ if i == 0:
438
+ argname = 'object'
439
+ else:
440
+ argname = 'p%s' % (i-1, )
441
+ pctype = parameter.attrib['type']
442
+ ptype = ast.Type.create_from_gtype_name(pctype)
443
+ param = ast.Parameter(argname, ptype)
444
+ param.transfer = ast.PARAM_TRANSFER_NONE
445
+ parameters.append(param)
446
+ signal = ast.Signal(signal_info.attrib['name'], return_, parameters,
447
+ when=when, no_recurse=no_recurse, detailed=detailed,
448
+ action=action, no_hooks=no_hooks)
449
+ node.signals.append(signal)
450
+ node.signals = node.signals
451
+
452
+ def _parse_parents(self, xmlnode, node):
453
+ parents_str = xmlnode.attrib.get('parents', '')
454
+ if parents_str != '':
455
+ parent_types = map(lambda s: ast.Type.create_from_gtype_name(s),
456
+ parents_str.split(','))
457
+ else:
458
+ parent_types = []
459
+ node.parent_chain = parent_types
460
+
461
+ def _introspect_fundamental(self, xmlnode):
462
+ type_name = xmlnode.attrib['name']
463
+
464
+ is_abstract = bool(xmlnode.attrib.get('abstract', False))
465
+ (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode)
466
+ try:
467
+ fundamental_name = self._transformer.strip_identifier(type_name)
468
+ except TransformerException, e:
469
+ message.warn(e)
470
+ return
471
+
472
+ node = ast.Class(fundamental_name, None,
473
+ gtype_name=type_name,
474
+ get_type=get_type,
475
+ c_symbol_prefix=c_symbol_prefix,
476
+ is_abstract=is_abstract)
477
+ self._parse_parents(xmlnode, node)
478
+ node.fundamental = True
479
+ self._introspect_implemented_interfaces(node, xmlnode)
480
+
481
+ self._add_record_fields(node)
482
+ self._namespace.append(node, replace=True)
483
+
484
+ def _add_record_fields(self, node):
485
+ # add record fields
486
+ record = self._namespace.get(node.name)
487
+ if not isinstance(record, ast.Record):
488
+ return
489
+ node.ctype = record.ctype
490
+ node.fields = record.fields
491
+ for field in node.fields:
492
+ if isinstance(field, ast.Field):
493
+ # Object instance fields are assumed to be read-only
494
+ # (see also _find_class_record and transformer.py)
495
+ field.writable = False
496
+
497
+ def _introspect_error_quark(self, xmlnode):
498
+ symbol = xmlnode.attrib['function']
499
+ error_domain = xmlnode.attrib['domain']
500
+ function = self._namespace.get_by_symbol(symbol)
501
+ if function is None:
502
+ return
503
+
504
+ node = ast.ErrorQuarkFunction(function.name, function.retval,
505
+ function.parameters, function.throws,
506
+ function.symbol, error_domain)
507
+ self._namespace.append(node, replace=True)
508
+
509
+ def _pair_boxed_type(self, boxed):
510
+ try:
511
+ name = self._transformer.strip_identifier(boxed.gtype_name)
512
+ except TransformerException, e:
513
+ message.fatal(e)
514
+ pair_node = self._namespace.get(name)
515
+ if not pair_node:
516
+ # Keep the "bare" boxed instance
517
+ self._namespace.append(boxed)
518
+ elif isinstance(pair_node, (ast.Record, ast.Union)):
519
+ pair_node.add_gtype(boxed.gtype_name, boxed.get_type)
520
+ assert boxed.c_symbol_prefix is not None
521
+ pair_node.c_symbol_prefix = boxed.c_symbol_prefix
522
+ # Quick hack - reset the disguised flag; we're setting it
523
+ # incorrectly in the scanner
524
+ pair_node.disguised = False
525
+ else:
526
+ return False
527
+
528
+ def _strip_class_suffix(self, name):
529
+ if (name.endswith('Class') or
530
+ name.endswith('Iface')):
531
+ return name[:-5]
532
+ elif name.endswith('Interface'):
533
+ return name[:-9]
534
+ else:
535
+ return None
536
+
537
+ def _find_class_record(self, cls):
538
+ pair_record = None
539
+ if isinstance(cls, ast.Class):
540
+ pair_record = self._namespace.get(cls.name + 'Class')
541
+ else:
542
+ for suffix in ('Iface', 'Interface'):
543
+ pair_record = self._namespace.get(cls.name + suffix)
544
+ if pair_record:
545
+ break
546
+ if not (pair_record and isinstance(pair_record, ast.Record)):
547
+ return
548
+
549
+ cls.glib_type_struct = pair_record.create_type()
550
+ cls.inherit_file_positions(pair_record)
551
+ pair_record.is_gtype_struct_for = cls.create_type()