gobject-introspection 2.0.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
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()