johnson 1.2.0 → 2.0.0.pre0

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 (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,1487 @@
1
+ #!/usr/bin/env/python
2
+ # qsgen.py - Generate XPConnect quick stubs.
3
+ #
4
+ # ***** BEGIN LICENSE BLOCK *****
5
+ # Version: MPL 1.1/GPL 2.0/LGPL 2.1
6
+ #
7
+ # The contents of this file are subject to the Mozilla Public License Version
8
+ # 1.1 (the "License"); you may not use this file except in compliance with
9
+ # the License. You may obtain a copy of the License at
10
+ # http://www.mozilla.org/MPL/
11
+ #
12
+ # Software distributed under the License is distributed on an "AS IS" basis,
13
+ # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14
+ # for the specific language governing rights and limitations under the
15
+ # License.
16
+ #
17
+ # The Original Code is mozilla.org code.
18
+ #
19
+ # The Initial Developer of the Original Code is
20
+ # Mozilla Foundation.
21
+ # Portions created by the Initial Developer are Copyright (C) 2008
22
+ # the Initial Developer. All Rights Reserved.
23
+ #
24
+ # Contributor(s):
25
+ # Jason Orendorff <jorendorff@mozilla.com>
26
+ #
27
+ # Alternatively, the contents of this file may be used under the terms of
28
+ # either of the GNU General Public License Version 2 or later (the "GPL"),
29
+ # or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30
+ # in which case the provisions of the GPL or the LGPL are applicable instead
31
+ # of those above. If you wish to allow use of your version of this file only
32
+ # under the terms of either the GPL or the LGPL, and not to allow others to
33
+ # use your version of this file under the terms of the MPL, indicate your
34
+ # decision by deleting the provisions above and replace them with the notice
35
+ # and other provisions required by the GPL or the LGPL. If you do not delete
36
+ # the provisions above, a recipient may use your version of this file under
37
+ # the terms of any one of the MPL, the GPL or the LGPL.
38
+ #
39
+ # ***** END LICENSE BLOCK *****
40
+
41
+ # =About quick stubs=
42
+ # qsgen.py generates "quick stubs", custom SpiderMonkey getters, setters, and
43
+ # methods for specified XPCOM interface members. These quick stubs serve at
44
+ # runtime as replacements for the XPConnect functions XPC_WN_GetterSetter and
45
+ # XPC_WN_CallMethod, which are the extremely generic (and slow) SpiderMonkey
46
+ # getter/setter/methods otherwise used for all XPCOM member accesses from JS.
47
+ #
48
+ # There are two ways quick stubs win:
49
+ # 1. Pure, transparent optimization by partial evaluation.
50
+ # 2. Cutting corners.
51
+ #
52
+ # == Partial evaluation ==
53
+ # Partial evaluation is when you execute part of a program early (before or at
54
+ # compile time) so that you don't have to execute it at run time. In this
55
+ # case, everything that involves interpreting xptcall data (for example, the
56
+ # big methodInfo loops in XPCWrappedNative::CallMethod and the switch statement
57
+ # in XPCConert::JSData2Native) might as well happen at build time, since all
58
+ # the type information for any given member is already known. That's what this
59
+ # script does. It gets the information from IDL instead of XPT files. Apart
60
+ # from that, the code in this script is very similar to what you'll find in
61
+ # XPConnect itself. The advantage is that it runs once, at build time, not in
62
+ # tight loops at run time.
63
+ #
64
+ # == Cutting corners ==
65
+ # The XPConnect versions have to be slow because they do tons of work that's
66
+ # only necessary in a few cases. The quick stubs skip a lot of that work. So
67
+ # quick stubs necessarily differ from XPConnect in potentially observable ways.
68
+ # For many specific interface members, the differences are not observable from
69
+ # scripts or don't matter enough to worry about; but you do have to be careful
70
+ # which members you decide to generate quick stubs for.
71
+ #
72
+ # The complete list of known differences, as of this writing, after an
73
+ # assiduous search:
74
+ #
75
+ # - Quick stubs affect the handling of naming conflicts--that is, which C++
76
+ # method gets called when a script uses an XPCOM feature that is declared in
77
+ # more than one of the interfaces the object implements. Without quick
78
+ # stubs, XPConnect just walks the interfaces in the order they're listed by
79
+ # nsClassInfo. You get the first interface that implements a feature with
80
+ # that name. With quick stubs, it's the same except that non-quick-stubbed
81
+ # features are shadowed.
82
+ #
83
+ # - Quick stub methods are JSFastNative, which means that when a quick stub
84
+ # method is called, no JS stack frame is created. This doesn't affect
85
+ # Mozilla security checks because they look for scripted JSStackFrames, not
86
+ # native ones.
87
+ #
88
+ # It does affect the 'stack' property of JavaScript exceptions, though: the
89
+ # stubbed member will not appear. (Note that if the stubbed member itself
90
+ # fails, the member name will appear in the 'message' property.)
91
+ #
92
+ # - Many quick stubs don't create an XPCCallContext. In those cases, no entry
93
+ # is added to the XPCCallContext stack. So native implementations of
94
+ # quick-stubbed methods must avoid nsXPConnect::GetCurrentNativeCallContext.
95
+ #
96
+ # (Even when a quick stub does have an XPCCallContext, it never pushes it all
97
+ # the way to READY_TO_CALL state, so a lot of its members are garbage. But
98
+ # this doesn't endanger native implementations of non-quick-stubbed methods
99
+ # that use GetCurrentNativeCallContext and are called indirectly from
100
+ # quick-stubbed methods, because only the current top XPCCallContext is
101
+ # exposed--nsAXPCNativeCallContext does not expose
102
+ # XPCCallContext::GetPrevCallContext.)
103
+ #
104
+ # - There are a few differences in how the "this" JSObject is unwrapped.
105
+ # Ordinarily, XPConnect searches the prototype chain of the "this" JSObject
106
+ # for an XPCOM object of the desired "proto". For details, see the parts of
107
+ # XPCWrappedNative::GetWrappedNativeOfJSObject that use "proto". Some quick
108
+ # stubs (methods, not getters or setters, that have XPCCallContexts) do this,
109
+ # but most instead look for an XPCOM object that supports the desired
110
+ # *interface*. This is more lenient. The difference is observable in some
111
+ # cases where a getter/setter/method is taken from one object and applied to
112
+ # another object.
113
+ #
114
+ # - Quick stubs never suspend the JS request. So they are only suitable for
115
+ # main-thread-only interfaces.
116
+ #
117
+ # - Quick stubs don't call XPCContext::SetLastResult. This is visible on the
118
+ # Components object.
119
+ #
120
+ # - Quick stubs skip a security check that XPConnect does in
121
+ # XPCWrappedNative::CallMethod. This means the security manager doesn't have
122
+ # an opportunity to veto accesses to members for which quick stubs exist.
123
+ #
124
+ # - There are many features of IDL that XPConnect supports but qsgen does not,
125
+ # including dependent types, arrays, and out parameters.
126
+ #
127
+ # - Since quick stubs are JSPropertyOps, we have to do additional work to make
128
+ # __lookup[GS]etter__ work on them.
129
+
130
+
131
+ import xpidl
132
+ import header
133
+ import os, re
134
+ import sys
135
+ import sets
136
+
137
+ # === Preliminaries
138
+
139
+ # --makedepend-output support.
140
+ make_dependencies = []
141
+ make_targets = []
142
+
143
+ def warn(msg):
144
+ sys.stderr.write(msg + '\n')
145
+
146
+ def unaliasType(t):
147
+ while t.kind == 'typedef':
148
+ t = t.realtype
149
+ assert t is not None
150
+ return t
151
+
152
+ def isVoidType(type):
153
+ """ Return True if the given xpidl type is void. """
154
+ return type.kind == 'builtin' and type.name == 'void'
155
+
156
+ def isInterfaceType(t):
157
+ t = unaliasType(t)
158
+ assert t.kind in ('builtin', 'native', 'interface', 'forward')
159
+ return t.kind in ('interface', 'forward')
160
+
161
+ def isSpecificInterfaceType(t, name):
162
+ """ True if `t` is an interface type with the given name, or a forward
163
+ declaration or typedef aliasing it.
164
+
165
+ `name` must not be the name of a typedef but the actual name of the
166
+ interface.
167
+ """
168
+ t = unaliasType(t)
169
+ return t.kind in ('interface', 'forward') and t.name == name
170
+
171
+ def getBuiltinOrNativeTypeName(t):
172
+ t = unaliasType(t)
173
+ if t.kind == 'builtin':
174
+ return t.name
175
+ elif t.kind == 'native':
176
+ assert t.specialtype is not None
177
+ return '[%s]' % t.specialtype
178
+ else:
179
+ return None
180
+
181
+
182
+ # === Reading the file
183
+
184
+ class UserError(Exception):
185
+ pass
186
+
187
+ def findIDL(includePath, irregularFilenames, interfaceName):
188
+ filename = irregularFilenames.get(interfaceName, interfaceName) + '.idl'
189
+ for d in includePath:
190
+ # Not os.path.join: we need a forward slash even on Windows because
191
+ # this filename ends up in makedepend output.
192
+ path = d + '/' + filename
193
+ if os.path.exists(path):
194
+ return path
195
+ raise UserError("No IDL file found for interface %s "
196
+ "in include path %r"
197
+ % (interfaceName, includePath))
198
+
199
+ def loadIDL(parser, includePath, filename):
200
+ make_dependencies.append(filename)
201
+ text = open(filename, 'r').read()
202
+ idl = parser.parse(text, filename=filename)
203
+ idl.resolve(includePath, parser)
204
+ return idl
205
+
206
+ def addStubMember(memberId, member, traceable):
207
+ # Check that the member is ok.
208
+ mayTrace = False
209
+ if member.kind not in ('method', 'attribute'):
210
+ raise UserError("Member %s is %r, not a method or attribute."
211
+ % (memberId, member.kind))
212
+ if member.noscript:
213
+ raise UserError("%s %s is noscript."
214
+ % (member.kind.capitalize(), memberId))
215
+ if member.notxpcom:
216
+ raise UserError(
217
+ "%s %s: notxpcom methods are not supported."
218
+ % (member.kind.capitalize(), memberId))
219
+
220
+ if (member.kind == 'attribute'
221
+ and not member.readonly
222
+ and isSpecificInterfaceType(member.realtype, 'nsIVariant')):
223
+ raise UserError(
224
+ "Attribute %s: Non-readonly attributes of type nsIVariant "
225
+ "are not supported."
226
+ % memberId)
227
+
228
+ # Check for unknown properties.
229
+ for attrname, value in vars(member).items():
230
+ if value is True and attrname not in ('readonly',):
231
+ raise UserError("%s %s: unrecognized property %r"
232
+ % (member.kind.capitalize(), memberId,
233
+ attrname))
234
+ if member.kind == 'method':
235
+ for param in member.params:
236
+ for attrname, value in vars(param).items():
237
+ if value is True and attrname not in ('optional',):
238
+ raise UserError("Method %s, parameter %s: "
239
+ "unrecognized property %r"
240
+ % (memberId, param.name, attrname))
241
+ if len(member.params) <= 3:
242
+ mayTrace = True
243
+
244
+ member.traceable = traceable and mayTrace
245
+
246
+ # Add this member to the list.
247
+ member.iface.stubMembers.append(member)
248
+
249
+ def parseMemberId(memberId):
250
+ """ Split the geven member id into its parts. """
251
+ pieces = memberId.split('.')
252
+ if len(pieces) < 2:
253
+ raise UserError("Member %r: Missing dot." % memberId)
254
+ if len(pieces) > 2:
255
+ raise UserError("Member %r: Dots out of control." % memberId)
256
+ return tuple(pieces)
257
+
258
+ class Configuration:
259
+ def __init__(self, filename, includePath):
260
+ self.includePath = includePath
261
+ config = {}
262
+ execfile(filename, config)
263
+ # required settings
264
+ for name in ('name', 'members'):
265
+ if name not in config:
266
+ raise UserError(filename + ": `%s` was not defined." % name)
267
+ setattr(self, name, config[name])
268
+ # optional settings
269
+ self.irregularFilenames = config.get('irregularFilenames', {})
270
+ self.customIncludes = config.get('customIncludes', [])
271
+ self.customMethodCalls = config.get('customMethodCalls', {})
272
+
273
+ def readConfigFile(filename, includePath, cachedir, traceable):
274
+ # Read the config file.
275
+ conf = Configuration(filename, includePath)
276
+
277
+ # Now read IDL files to connect the information in the config file to
278
+ # actual XPCOM interfaces, methods, and attributes.
279
+ interfaces = []
280
+ interfacesByName = {}
281
+ parser = xpidl.IDLParser(cachedir)
282
+
283
+ def getInterface(interfaceName, errorLoc):
284
+ iface = interfacesByName.get(interfaceName)
285
+ if iface is None:
286
+ idlFile = findIDL(conf.includePath, conf.irregularFilenames,
287
+ interfaceName)
288
+ idl = loadIDL(parser, conf.includePath, idlFile)
289
+ if not idl.hasName(interfaceName):
290
+ raise UserError("The interface %s was not found "
291
+ "in the idl file %r."
292
+ % (interfaceName, idlFile))
293
+ iface = idl.getName(interfaceName, errorLoc)
294
+ iface.stubMembers = []
295
+ interfaces.append(iface)
296
+ interfacesByName[interfaceName] = iface
297
+ return iface
298
+
299
+ for memberId in conf.members:
300
+ interfaceName, memberName = parseMemberId(memberId)
301
+ iface = getInterface(interfaceName, errorLoc='looking for %r' % memberId)
302
+
303
+ if not iface.attributes.scriptable:
304
+ raise UserError("Interface %s is not scriptable. "
305
+ "IDL file: %r." % (interfaceName, idlFile))
306
+
307
+ if memberName == '*':
308
+ # Stub all scriptable members of this interface.
309
+ for member in iface.members:
310
+ if member.kind in ('method', 'attribute') and not member.noscript:
311
+ addStubMember(iface.name + '.' + member.name, member,
312
+ traceable)
313
+ else:
314
+ # Look up a member by name.
315
+ if memberName not in iface.namemap:
316
+ idlFile = iface.idl.parser.lexer.filename
317
+ raise UserError("Interface %s has no member %r. "
318
+ "(See IDL file %r.)"
319
+ % (interfaceName, memberName, idlFile))
320
+ member = iface.namemap.get(memberName, None)
321
+ if member in iface.stubMembers:
322
+ raise UserError("Member %s is specified more than once."
323
+ % memberId)
324
+ addStubMember(memberId, member, traceable)
325
+
326
+ return conf, interfaces
327
+
328
+
329
+ # === Generating the header file
330
+
331
+ def writeHeaderFile(filename, name):
332
+ print "Creating header file", filename
333
+ make_targets.append(filename)
334
+
335
+ headerMacro = '__gen_%s__' % filename.replace('.', '_')
336
+ f = open(filename, 'w')
337
+ try:
338
+ f.write("/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */\n"
339
+ "#ifndef " + headerMacro + "\n"
340
+ "#define " + headerMacro + "\n\n"
341
+ "JSBool " + name + "_DefineQuickStubs("
342
+ "JSContext *cx, JSObject *proto, uintN flags, "
343
+ "PRUint32 count, const nsID **iids);\n\n"
344
+ "void " + name + "_MarkInterfaces();\n\n"
345
+ "void " + name + "_ClearInterfaces();\n\n"
346
+ "inline void " + name + "_InitInterfaces()\n"
347
+ "{\n"
348
+ " " + name + "_ClearInterfaces();\n"
349
+ "}\n\n"
350
+ "#endif\n")
351
+ finally:
352
+ f.close()
353
+
354
+ # === Generating the source file
355
+
356
+ def substitute(template, vals):
357
+ """ Simple replacement for string.Template, which isn't in Python 2.3. """
358
+ def replacement(match):
359
+ return vals[match.group(1)]
360
+ return re.sub(r'\${(\w+)}', replacement, template)
361
+
362
+ # From JSData2Native.
363
+ argumentUnboxingTemplates = {
364
+ 'short':
365
+ " int32 ${name}_i32;\n"
366
+ " if (!JS_ValueToECMAInt32(cx, ${argVal}, &${name}_i32))\n"
367
+ " return JS_FALSE;\n"
368
+ " int16 ${name} = (int16) ${name}_i32;\n",
369
+
370
+ 'unsigned short':
371
+ " uint32 ${name}_u32;\n"
372
+ " if (!JS_ValueToECMAUint32(cx, ${argVal}, &${name}_u32))\n"
373
+ " return JS_FALSE;\n"
374
+ " uint16 ${name} = (uint16) ${name}_u32;\n",
375
+
376
+ 'long':
377
+ " int32 ${name};\n"
378
+ " if (!JS_ValueToECMAInt32(cx, ${argVal}, &${name}))\n"
379
+ " return JS_FALSE;\n",
380
+
381
+ 'unsigned long':
382
+ " uint32 ${name};\n"
383
+ " if (!JS_ValueToECMAUint32(cx, ${argVal}, &${name}))\n"
384
+ " return JS_FALSE;\n",
385
+
386
+ 'float':
387
+ " jsdouble ${name}_dbl;\n"
388
+ " if (!JS_ValueToNumber(cx, ${argVal}, &${name}_dbl))\n"
389
+ " return JS_FALSE;\n"
390
+ " float ${name} = (float) ${name}_dbl;\n",
391
+
392
+ 'double':
393
+ " jsdouble ${name};\n"
394
+ " if (!JS_ValueToNumber(cx, ${argVal}, &${name}))\n"
395
+ " return JS_FALSE;\n",
396
+
397
+ 'boolean':
398
+ " PRBool ${name};\n"
399
+ " if (!JS_ValueToBoolean(cx, ${argVal}, &${name}))\n"
400
+ " return JS_FALSE;\n",
401
+
402
+ '[astring]':
403
+ " xpc_qsAString ${name}(cx, ${argPtr});\n"
404
+ " if (!${name}.IsValid())\n"
405
+ " return JS_FALSE;\n",
406
+
407
+ '[domstring]':
408
+ " xpc_qsDOMString ${name}(cx, ${argPtr});\n"
409
+ " if (!${name}.IsValid())\n"
410
+ " return JS_FALSE;\n",
411
+
412
+ 'string':
413
+ " char *${name};\n"
414
+ " if (!xpc_qsJsvalToCharStr(cx, ${argPtr}, &${name}))\n"
415
+ " return JS_FALSE;\n",
416
+
417
+ 'wstring':
418
+ " PRUnichar *${name};\n"
419
+ " if (!xpc_qsJsvalToWcharStr(cx, ${argPtr}, &${name}))\n"
420
+ " return JS_FALSE;\n",
421
+
422
+ '[cstring]':
423
+ " xpc_qsACString ${name}(cx, ${argPtr});\n"
424
+ " if (!${name}.IsValid())\n"
425
+ " return JS_FALSE;\n"
426
+ }
427
+
428
+ # From JSData2Native.
429
+ #
430
+ # Omitted optional arguments are treated as though the caller had passed JS
431
+ # `null`; this behavior is from XPCWrappedNative::CallMethod.
432
+ #
433
+ def writeArgumentUnboxing(f, i, name, type, haveCcx, optional, rvdeclared):
434
+ # f - file to write to
435
+ # i - int or None - Indicates the source jsval. If i is an int, the source
436
+ # jsval is argv[i]; otherwise it is *vp. But if Python i >= C++ argc,
437
+ # which can only happen if optional is True, the argument is missing;
438
+ # use JSVAL_NULL as the source jsval instead.
439
+ # name - str - name of the native C++ variable to create.
440
+ # type - xpidl.{Interface,Native,Builtin} - IDL type of argument
441
+ # optional - bool - True if the parameter is optional.
442
+ # rvdeclared - bool - False if no |nsresult rv| has been declared earlier.
443
+
444
+ isSetter = (i is None)
445
+
446
+ if isSetter:
447
+ argPtr = "vp"
448
+ argVal = "*vp"
449
+ elif optional:
450
+ argPtr = '! /* TODO - optional parameter of this type not supported */'
451
+ argVal = "(%d < argc ? argv[%d] : JSVAL_NULL)" % (i, i)
452
+ else:
453
+ argVal = "argv[%d]" % i
454
+ argPtr = "&" + argVal
455
+
456
+ params = {
457
+ 'name': name,
458
+ 'argVal': argVal,
459
+ 'argPtr': argPtr
460
+ }
461
+
462
+ typeName = getBuiltinOrNativeTypeName(type)
463
+ if typeName is not None:
464
+ template = argumentUnboxingTemplates.get(typeName)
465
+ if template is not None:
466
+ if optional and ("${argPtr}" in template):
467
+ warn("Optional parameters of type %s are not supported."
468
+ % type.name)
469
+ f.write(substitute(template, params))
470
+ return rvdeclared
471
+ # else fall through; the type isn't supported yet.
472
+ elif isInterfaceType(type):
473
+ if type.name == 'nsIVariant':
474
+ # Totally custom.
475
+ assert haveCcx
476
+ template = (
477
+ " nsCOMPtr<nsIVariant> ${name}(already_AddRefed<nsIVariant>("
478
+ "XPCVariant::newVariant(ccx, ${argVal})));\n"
479
+ " if (!${name})\n"
480
+ " return JS_FALSE;\n")
481
+ f.write(substitute(template, params))
482
+ return rvdeclared
483
+ elif type.name == 'nsIAtom':
484
+ # Should have special atomizing behavior. Fall through.
485
+ pass
486
+ else:
487
+ if not rvdeclared:
488
+ f.write(" nsresult rv;\n");
489
+ f.write(" nsCOMPtr<%s> %s;\n" % (type.name, name))
490
+ f.write(" rv = xpc_qsUnwrapArg<%s>("
491
+ "cx, %s, getter_AddRefs(%s));\n"
492
+ % (type.name, argVal, name))
493
+ f.write(" if (NS_FAILED(rv)) {\n")
494
+ if isSetter:
495
+ f.write(" xpc_qsThrowBadSetterValue("
496
+ "cx, rv, JSVAL_TO_OBJECT(*tvr.addr()), id);\n")
497
+ elif haveCcx:
498
+ f.write(" xpc_qsThrowBadArgWithCcx(ccx, rv, %d);\n" % i)
499
+ else:
500
+ f.write(" xpc_qsThrowBadArg(cx, rv, vp, %d);\n" % i)
501
+ f.write(" return JS_FALSE;\n"
502
+ " }\n")
503
+ return True
504
+
505
+ warn("Unable to unbox argument of type %s" % type.name)
506
+ if i is None:
507
+ src = '*vp'
508
+ else:
509
+ src = 'argv[%d]' % i
510
+ f.write(" !; // TODO - Unbox argument %s = %s\n" % (name, src))
511
+ return rvdeclared
512
+
513
+ def writeResultDecl(f, type, varname):
514
+ if isVoidType(type):
515
+ return # nothing to declare
516
+
517
+ t = unaliasType(type)
518
+ if t.kind == 'builtin':
519
+ if not t.nativename.endswith('*'):
520
+ if type.kind == 'typedef':
521
+ typeName = type.name # use it
522
+ else:
523
+ typeName = t.nativename
524
+ f.write(" %s %s;\n" % (typeName, varname))
525
+ return
526
+ elif t.kind == 'native':
527
+ name = getBuiltinOrNativeTypeName(t)
528
+ if name in ('[domstring]', '[astring]'):
529
+ f.write(" nsString %s;\n" % varname)
530
+ return
531
+ elif t.kind in ('interface', 'forward'):
532
+ f.write(" nsCOMPtr<%s> %s;\n" % (type.name, varname))
533
+ return
534
+
535
+ warn("Unable to declare result of type %s" % type.name)
536
+ f.write(" !; // TODO - Declare out parameter `%s`.\n" % varname)
537
+
538
+ def outParamForm(name, type):
539
+ type = unaliasType(type)
540
+ if type.kind == 'builtin':
541
+ return '&' + name
542
+ elif type.kind == 'native':
543
+ if type.modifier == 'ref':
544
+ return name
545
+ else:
546
+ return '&' + name
547
+ else:
548
+ return 'getter_AddRefs(%s)' % name
549
+
550
+ # From NativeData2JS.
551
+ resultConvTemplates = {
552
+ 'void':
553
+ " ${jsvalRef} = JSVAL_VOID;\n"
554
+ " return JS_TRUE;\n",
555
+
556
+ 'short':
557
+ " ${jsvalRef} = INT_TO_JSVAL((int32) result);\n"
558
+ " return JS_TRUE;\n",
559
+
560
+ 'long':
561
+ " return xpc_qsInt32ToJsval(cx, result, ${jsvalPtr});\n",
562
+
563
+ 'long long':
564
+ " return xpc_qsInt64ToJsval(cx, result, ${jsvalPtr};\n",
565
+
566
+ 'unsigned short':
567
+ " ${jsvalRef} = INT_TO_JSVAL((int32) result);\n"
568
+ " return JS_TRUE;\n",
569
+
570
+ 'unsigned long':
571
+ " return xpc_qsUint32ToJsval(cx, result, ${jsvalPtr});\n",
572
+
573
+ 'unsigned long long':
574
+ " return xpc_qsUint64ToJsval(cx, result, ${jsvalPtr});\n",
575
+
576
+ 'float':
577
+ " return JS_NewNumberValue(cx, result, ${jsvalPtr});\n",
578
+
579
+ 'double':
580
+ " return JS_NewNumberValue(cx, result, ${jsvalPtr});\n",
581
+
582
+ 'boolean':
583
+ " ${jsvalRef} = (result ? JSVAL_TRUE : JSVAL_FALSE);\n"
584
+ " return JS_TRUE;\n",
585
+
586
+ '[astring]':
587
+ " return xpc_qsStringToJsval(cx, result, ${jsvalPtr});\n",
588
+
589
+ '[domstring]':
590
+ " return xpc_qsStringToJsval(cx, result, ${jsvalPtr});\n"
591
+ }
592
+
593
+ def isVariantType(t):
594
+ return isSpecificInterfaceType(t, 'nsIVariant')
595
+
596
+ def writeResultConv(f, type, paramNum, jsvalPtr, jsvalRef):
597
+ """ Emit code to convert the C++ variable `result` to a jsval.
598
+
599
+ The emitted code contains a return statement; it returns JS_TRUE on
600
+ success, JS_FALSE on error.
601
+ """
602
+ # From NativeData2JS.
603
+ typeName = getBuiltinOrNativeTypeName(type)
604
+ if typeName is not None:
605
+ template = resultConvTemplates.get(typeName)
606
+ if template is not None:
607
+ values = {'jsvalRef': jsvalRef,
608
+ 'jsvalPtr': jsvalPtr}
609
+ f.write(substitute(template, values))
610
+ return
611
+ # else fall through; this type isn't supported yet
612
+ elif isInterfaceType(type):
613
+ if isVariantType(type):
614
+ f.write(" return xpc_qsVariantToJsval(ccx, result, %d, %s);\n"
615
+ % (paramNum, jsvalPtr))
616
+ return
617
+ else:
618
+ f.write(" AutoMarkingNativeInterfacePtr resultiface(ccx, "
619
+ "%s_Interface(ccx));\n" % type.name)
620
+ f.write(" return xpc_qsXPCOMObjectToJsval(ccx, result, "
621
+ "xpc_qsGetWrapperCache(result), resultiface, %s);\n"
622
+ % jsvalPtr)
623
+ return
624
+
625
+ warn("Unable to convert result of type %s" % type.name)
626
+ f.write(" !; // TODO - Convert `result` to jsval, store in `%s`.\n"
627
+ % jsvalRef)
628
+ f.write(" return xpc_qsThrow(cx, NS_ERROR_UNEXPECTED); // FIXME\n")
629
+
630
+ def anyParamRequiresCcx(member):
631
+ for p in member.params:
632
+ if isVariantType(p.realtype):
633
+ return True
634
+ return False
635
+
636
+ def validateParam(member, param):
637
+ def pfail(msg):
638
+ raise UserError(
639
+ member.iface.name + '.' + member.name + ": "
640
+ "parameter " + param.name + ": " + msg)
641
+
642
+ if param.iid_is is not None:
643
+ pfail("iid_is parameters are not supported.")
644
+ if param.size_is is not None:
645
+ pfail("size_is parameters are not supported.")
646
+ if param.retval:
647
+ pfail("Unexpected retval parameter!")
648
+ if param.paramtype in ('out', 'inout'):
649
+ pfail("Out parameters are not supported.")
650
+ if param.const or param.array or param.shared:
651
+ pfail("I am a simple caveman.")
652
+
653
+ def writeQuickStub(f, customMethodCalls, member, stubName, isSetter=False):
654
+ """ Write a single quick stub (a custom SpiderMonkey getter/setter/method)
655
+ for the specified XPCOM interface-member.
656
+ """
657
+ isAttr = (member.kind == 'attribute')
658
+ isMethod = (member.kind == 'method')
659
+ assert isAttr or isMethod
660
+ isGetter = isAttr and not isSetter
661
+
662
+ customMethodCall = customMethodCalls.get(stubName, None)
663
+
664
+ # Function prolog.
665
+ f.write("static JSBool\n")
666
+ if isAttr:
667
+ # JSPropertyOp signature.
668
+ f.write(stubName + "(JSContext *cx, JSObject *obj, jsval id, "
669
+ "jsval *vp)\n")
670
+ else:
671
+ # JSFastNative.
672
+ f.write(stubName + "(JSContext *cx, uintN argc, jsval *vp)\n")
673
+ f.write("{\n")
674
+ f.write(" XPC_QS_ASSERT_CONTEXT_OK(cx);\n")
675
+
676
+ # For methods, compute "this".
677
+ if isMethod:
678
+ f.write(" JSObject *obj = JS_THIS_OBJECT(cx, vp);\n"
679
+ " if (!obj)\n"
680
+ " return JS_FALSE;\n")
681
+
682
+ # Create ccx if needed.
683
+ haveCcx = isMethod and (isInterfaceType(member.realtype)
684
+ or anyParamRequiresCcx(member))
685
+ if haveCcx:
686
+ f.write(" XPCCallContext ccx(JS_CALLER, cx, obj, "
687
+ "JSVAL_TO_OBJECT(JS_CALLEE(cx, vp)));\n")
688
+ else:
689
+ # In some cases we emit a ccx, but it does not count as
690
+ # "haveCcx" because it's not complete.
691
+ if isAttr and isInterfaceType(member.realtype):
692
+ f.write(" XPCCallContext ccx(JS_CALLER, cx, obj);\n")
693
+
694
+ # Get the 'self' pointer.
695
+ if customMethodCall is None or not 'thisType' in customMethodCall:
696
+ f.write(" %s *self;\n" % member.iface.name)
697
+ else:
698
+ f.write(" %s *self;\n" % customMethodCall['thisType'])
699
+ f.write(" xpc_qsSelfRef selfref;\n")
700
+ # Don't use FromCcx for getters or setters; the way we construct the ccx in
701
+ # a getter/setter causes it to find the wrong wrapper in some cases.
702
+ if isMethod and haveCcx:
703
+ # Undocumented, but the interpreter puts 'this' at argv[-1],
704
+ # which is vp[1]; and it's ok to overwrite it.
705
+ f.write(" if (!xpc_qsUnwrapThisFromCcx(ccx, &self, &selfref.ptr, "
706
+ "&vp[1]))\n")
707
+ f.write(" return JS_FALSE;\n")
708
+ else:
709
+ if isGetter:
710
+ pthisval = 'vp'
711
+ elif isSetter:
712
+ f.write(" xpc_qsTempRoot tvr(cx);\n")
713
+ pthisval = 'tvr.addr()'
714
+ else:
715
+ pthisval = '&vp[1]' # as above, ok to overwrite vp[1]
716
+
717
+ f.write(" if (!xpc_qsUnwrapThis(cx, obj, &self, &selfref.ptr, "
718
+ "%s))\n" % pthisval)
719
+ f.write(" return JS_FALSE;\n")
720
+
721
+ if isMethod:
722
+ # If there are any required arguments, check argc.
723
+ requiredArgs = len(member.params)
724
+ while requiredArgs and member.params[requiredArgs-1].optional:
725
+ requiredArgs -= 1
726
+ if requiredArgs:
727
+ f.write(" if (argc < %d)\n" % requiredArgs)
728
+ f.write(" return xpc_qsThrow(cx, "
729
+ "NS_ERROR_XPC_NOT_ENOUGH_ARGS);\n")
730
+
731
+ # Convert in-parameters.
732
+ rvdeclared = False
733
+ if isMethod:
734
+ if len(member.params) > 0:
735
+ f.write(" jsval *argv = JS_ARGV(cx, vp);\n")
736
+ for i, param in enumerate(member.params):
737
+ validateParam(member, param)
738
+ # Emit code to convert this argument from jsval.
739
+ rvdeclared = writeArgumentUnboxing(
740
+ f, i, 'arg%d' % i, param.realtype,
741
+ haveCcx=haveCcx,
742
+ optional=param.optional,
743
+ rvdeclared=rvdeclared)
744
+ elif isSetter:
745
+ rvdeclared = writeArgumentUnboxing(f, None, 'arg0', member.realtype,
746
+ haveCcx=False, optional=False,
747
+ rvdeclared=rvdeclared)
748
+
749
+ if customMethodCall is not None:
750
+ f.write("%s\n" % customMethodCall['code'])
751
+ f.write("#ifdef DEBUG\n")
752
+ f.write(" nsresult debug_rv;\n")
753
+ f.write(" nsCOMPtr<%s> debug_self = do_QueryInterface(self);\n"
754
+ % member.iface.name);
755
+ prefix = 'debug_'
756
+ else:
757
+ if not rvdeclared:
758
+ f.write(" nsresult rv;\n")
759
+ rvdeclared = True
760
+ prefix = ''
761
+
762
+ resultname = prefix + 'result'
763
+ selfname = prefix + 'self'
764
+ nsresultname = prefix + 'rv'
765
+
766
+ # Prepare out-parameter.
767
+ if isMethod or isGetter:
768
+ writeResultDecl(f, member.realtype, resultname)
769
+
770
+ # Call the method.
771
+ if isMethod:
772
+ comName = header.methodNativeName(member)
773
+ argv = ['arg' + str(i) for i, p in enumerate(member.params)]
774
+ if not isVoidType(member.realtype):
775
+ argv.append(outParamForm(resultname, member.realtype))
776
+ args = ', '.join(argv)
777
+ else:
778
+ comName = header.attributeNativeName(member, isGetter)
779
+ if isGetter:
780
+ args = outParamForm(resultname, member.realtype)
781
+ else:
782
+ args = "arg0"
783
+
784
+ f.write(" %s = %s->%s(%s);\n" % (nsresultname, selfname, comName, args))
785
+
786
+ if customMethodCall is None:
787
+ # Check for errors.
788
+ f.write(" if (NS_FAILED(rv))\n")
789
+ if isMethod:
790
+ if haveCcx:
791
+ f.write(" return xpc_qsThrowMethodFailedWithCcx("
792
+ "ccx, rv);\n")
793
+ else:
794
+ f.write(" return xpc_qsThrowMethodFailed("
795
+ "cx, rv, vp);\n")
796
+ else:
797
+ if isGetter:
798
+ thisval = '*vp'
799
+ else:
800
+ thisval = '*tvr.addr()'
801
+ f.write(" return xpc_qsThrowGetterSetterFailed(cx, rv, " +
802
+ "JSVAL_TO_OBJECT(%s), id);\n" % thisval)
803
+ else:
804
+ if isMethod or isGetter:
805
+ f.write(" NS_ASSERTION(NS_SUCCEEDED(debug_rv) && "
806
+ "xpc_qsSameResult(debug_result, result),\n"
807
+ " \"Got the wrong answer from the custom "
808
+ "method call!\");\n")
809
+ f.write("#endif\n")
810
+
811
+ # Convert the return value.
812
+ if isMethod:
813
+ writeResultConv(f, member.realtype, len(member.params) + 1, 'vp', '*vp')
814
+ elif isGetter:
815
+ writeResultConv(f, member.realtype, None, 'vp', '*vp')
816
+ else:
817
+ f.write(" return JS_TRUE;\n")
818
+
819
+ # Epilog.
820
+ f.write("}\n\n")
821
+
822
+ traceTypeMap = {
823
+ 'void':
824
+ ["jsval ", "JSVAL", "JSVAL_VOID"],
825
+ 'boolean':
826
+ ["JSBool ", "BOOL", "JS_FALSE"],
827
+ 'short':
828
+ ["int32 ", "INT32", "0"],
829
+ 'unsigned short':
830
+ ["uint32 ", "UINT32", "0"],
831
+ 'long':
832
+ ["int32 ", "INT32", "0"],
833
+ 'unsigned long':
834
+ ["uint32 ", "UINT32", "0"],
835
+ 'float':
836
+ ["jsdouble ", "DOUBLE", "0"],
837
+ 'double':
838
+ ["jsdouble ", "DOUBLE", "0"],
839
+
840
+ # XXX STRING_FAIL can't return a null'd string, ask jorendorff, maybe a JSVAL_FAIL
841
+ '[astring]':
842
+ ["JSString *", "STRING", "nsnull"],
843
+ '[domstring]':
844
+ ["JSString *", "STRING", "nsnull"],
845
+ '[cstring]':
846
+ ["JSString *", "STRING", "nsnull"],
847
+ 'string':
848
+ ["JSString *", "STRING", "nsnull"],
849
+ 'wstring':
850
+ ["JSString *", "STRING", "nsnull"],
851
+
852
+ '_default':
853
+ ["jsval ", "JSVAL", "JSVAL_VOID"]
854
+ }
855
+
856
+ def getTraceType(type):
857
+ traceType = traceTypeMap.get(type) or traceTypeMap.get("_default")
858
+ assert traceType
859
+ return traceType[0]
860
+
861
+ def getTraceInfoType(type):
862
+ traceType = traceTypeMap.get(type) or traceTypeMap.get("_default")
863
+ assert traceType
864
+ return traceType[1]
865
+
866
+ def getTraceInfoDefaultReturn(type):
867
+ traceType = traceTypeMap.get(type) or traceTypeMap.get("_default")
868
+ assert traceType
869
+ return traceType[2]
870
+
871
+ def getFailureString(retval, indent):
872
+ assert indent > 0
873
+ ret = " " * (4 * indent)
874
+ ret += "js_SetTraceableNativeFailed(cx);\n"
875
+ ret += " " * (4 * indent)
876
+ ret += "return %s;\n" % retval
877
+ ret += " " * (4 * (indent - 1))
878
+ ret += "}\n"
879
+ return ret
880
+
881
+ def writeFailure(f, retval, indent):
882
+ f.write(getFailureString(retval, indent))
883
+
884
+ traceableArgumentConversionTemplates = {
885
+ 'short':
886
+ " PRint16 ${name} = (PRint16) ${argVal};\n",
887
+ 'unsigned short':
888
+ " PRUint16 ${name} = (PRUint16) ${argVal};\n",
889
+ 'long':
890
+ " PRInt32 ${name} = (PRInt32) ${argVal};\n",
891
+ 'unsigned long':
892
+ " PRUint32 ${name} = (PRUint32) ${argVal};\n",
893
+ 'boolean':
894
+ " PRBool ${name} = (PRBool) ${argVal};\n",
895
+ 'float':
896
+ " float ${name} = (float) ${argVal};\n",
897
+ 'double':
898
+ " jsdouble ${name} = ${argVal};\n",
899
+ '[astring]':
900
+ " XPCReadableJSStringWrapper ${name}(${argVal});\n",
901
+ '[domstring]':
902
+ " XPCReadableJSStringWrapper ${name}(${argVal});\n",
903
+ '[cstring]':
904
+ " NS_ConvertUTF16toUTF8 ${name}("
905
+ "(const PRUnichar *)JS_GetStringChars(${argVal}), "
906
+ "JS_GetStringLength(${argVal}));\n",
907
+ 'string':
908
+ " NS_ConvertUTF16toUTF8 ${name}_utf8("
909
+ "(const PRUnichar *)JS_GetStringChars(${argVal}), "
910
+ "JS_GetStringLength(${argVal}));\n"
911
+ " const char *${name} = ${name}_utf8.get();\n",
912
+ 'wstring':
913
+ " const PRUnichar *${name} = JS_GetStringChars({argVal});\n",
914
+ }
915
+
916
+ def writeTraceableArgumentConversion(f, member, i, name, type, haveCcx,
917
+ rvdeclared):
918
+ argVal = "arg%d" % i
919
+ argPtr = "&" + argVal
920
+
921
+ params = {
922
+ 'name': name,
923
+ 'argVal': argVal
924
+ }
925
+
926
+ typeName = getBuiltinOrNativeTypeName(type)
927
+ if typeName is not None:
928
+ template = traceableArgumentConversionTemplates.get(typeName)
929
+ if template is not None:
930
+ f.write(substitute(template, params))
931
+ return rvdeclared
932
+ # else fall through; the type isn't supported yet.
933
+ elif isInterfaceType(type):
934
+ if type.name == 'nsIVariant':
935
+ # Totally custom.
936
+ assert haveCcx
937
+ template = (
938
+ " nsCOMPtr<nsIVariant> ${name}(already_AddRefed<nsIVariant>("
939
+ "XPCVariant::newVariant(ccx, ${argVal})));\n"
940
+ " if (!${name}) {\n")
941
+ f.write(substitute(template, params))
942
+ writeFailure(f, getTraceInfoDefaultReturn(member.type), 2)
943
+ return rvdeclared
944
+ elif type.name == 'nsIAtom':
945
+ # Should have special atomizing behavior. Fall through.
946
+ pass
947
+ else:
948
+ if not rvdeclared:
949
+ f.write(" nsresult rv;\n");
950
+ f.write(" nsCOMPtr<%s> %s;\n" % (type.name, name))
951
+ f.write(" rv = xpc_qsUnwrapArg<%s>("
952
+ "cx, %s, getter_AddRefs(%s));\n"
953
+ % (type.name, argVal, name))
954
+ f.write(" if (NS_FAILED(rv)) {\n")
955
+ if haveCcx:
956
+ f.write(" xpc_qsThrowBadArgWithCcx(ccx, rv, %d);\n" % i)
957
+ else:
958
+ # XXX Fix this to return a real error!
959
+ f.write(" xpc_qsThrowBadArgWithDetails(cx, rv, %d, "
960
+ "\"%s\", \"%s\");\n"
961
+ % (i, member.iface.name, member.name))
962
+ writeFailure(f, getTraceInfoDefaultReturn(member.type), 2)
963
+ return True
964
+
965
+ print member
966
+ warn("Unable to unbox argument of type %s" % type.name)
967
+ f.write(" !; // TODO - Unbox argument %s = arg%d\n" % (name, i))
968
+ return rvdeclared
969
+
970
+ traceableResultConvTemplates = {
971
+ 'void':
972
+ " return JSVAL_VOID;\n",
973
+ 'short':
974
+ " return int32(result);\n",
975
+ 'unsigned short':
976
+ " return uint32(result);\n",
977
+ 'long':
978
+ " return int32(result);\n",
979
+ 'unsigned long':
980
+ " return uint32(result);\n",
981
+ 'boolean':
982
+ " return result ? JS_TRUE : JS_FALSE;\n",
983
+ '[domstring]':
984
+ " jsval rval;\n"
985
+ " if (!xpc_qsStringToJsval(cx, result, &rval)) {\n"
986
+ " JS_ReportOutOfMemory(cx);\n${errorStr}"
987
+ " return rval;\n",
988
+ '[astring]':
989
+ " jsval rval;\n"
990
+ " if (!xpc_qsStringToJsval(cx, result, &rval)) {\n"
991
+ " JS_ReportOutOfMemory(cx);\n${errorStr}"
992
+ " return rval;\n",
993
+ }
994
+
995
+ def writeTraceableResultConv(f, type, paramNum):
996
+ typeName = getBuiltinOrNativeTypeName(type)
997
+ if typeName is not None:
998
+ template = traceableResultConvTemplates.get(typeName)
999
+ if template is not None:
1000
+ values = { 'errorStr': getFailureString(
1001
+ getTraceInfoDefaultReturn(type), 2) }
1002
+ f.write(substitute(template, values))
1003
+ return
1004
+ # else fall through; this type isn't supported yet
1005
+ elif isInterfaceType(type):
1006
+ if isVariantType(type):
1007
+ f.write(" JSBool ok = xpc_qsVariantToJsval(ccx, result, %d, "
1008
+ "tvr.addr());\n" % paramNum)
1009
+ else:
1010
+ f.write(" AutoMarkingNativeInterfacePtr resultiface(ccx, "
1011
+ "%s_Interface(ccx));\n" % type.name)
1012
+ f.write(" JSBool ok = xpc_qsXPCOMObjectToJsval(ccx, result, "
1013
+ "xpc_qsGetWrapperCache(result), resultiface, tvr.addr());"
1014
+ "\n")
1015
+ f.write(" if (!ok) {\n");
1016
+ writeFailure(f, getTraceInfoDefaultReturn(type), 2)
1017
+ f.write(" return *tvr.addr();\n")
1018
+ return
1019
+
1020
+ warn("Unable to convert result of type %s" % typeName)
1021
+ f.write(" !; // TODO - Convert `result` to jsval, store in rval.\n")
1022
+ f.write(" return xpc_qsThrow(cx, NS_ERROR_UNEXPECTED); // FIXME\n")
1023
+
1024
+ def writeTraceableQuickStub(f, customMethodCalls, member, stubName):
1025
+ assert member.traceable
1026
+
1027
+ traceInfo = {
1028
+ 'type': getTraceInfoType(member.type) + "_FAIL",
1029
+ 'params': ["CONTEXT", "THIS"]
1030
+ }
1031
+
1032
+ haveCcx = isInterfaceType(member.realtype) or anyParamRequiresCcx(member)
1033
+
1034
+ customMethodCall = customMethodCalls.get(stubName, None)
1035
+
1036
+ # Write the function
1037
+ f.write("static %sFASTCALL\n" % getTraceType(member.type))
1038
+ f.write("%s(JSContext *cx, JSObject *obj" % (stubName + "_tn"))
1039
+ if haveCcx:
1040
+ f.write(", JSObject *callee")
1041
+ traceInfo["params"].append("CALLEE")
1042
+ for i, param in enumerate(member.params):
1043
+ type = getBuiltinOrNativeTypeName(param.realtype)
1044
+ f.write(", %sarg%d" % (getTraceType(type), i))
1045
+ traceInfo["params"].append(getTraceInfoType(type))
1046
+ f.write(")\n{\n");
1047
+ f.write(" XPC_QS_ASSERT_CONTEXT_OK(cx);\n")
1048
+
1049
+ # Create ccx if needed.
1050
+ if haveCcx:
1051
+ f.write(" XPCCallContext ccx(JS_CALLER, cx, obj, callee);\n")
1052
+
1053
+ # Get the 'self' pointer.
1054
+ if customMethodCall is None or not 'thisType' in customMethodCall:
1055
+ f.write(" %s *self;\n" % member.iface.name)
1056
+ else:
1057
+ f.write(" %s *self;\n" % customMethodCall['thisType'])
1058
+ f.write(" xpc_qsSelfRef selfref;\n")
1059
+ f.write(" xpc_qsTempRoot tvr(cx);\n")
1060
+ if haveCcx:
1061
+ f.write(" if (!xpc_qsUnwrapThisFromCcx(ccx, &self, &selfref.ptr, "
1062
+ "tvr.addr())) {\n")
1063
+ else:
1064
+ f.write(" if (!xpc_qsUnwrapThis(cx, obj, &self, &selfref.ptr, "
1065
+ "tvr.addr())) {\n")
1066
+ writeFailure(f, getTraceInfoDefaultReturn(member.type), 2)
1067
+
1068
+ argNames = []
1069
+
1070
+ # Convert in-parameters.
1071
+ rvdeclared = False
1072
+ for i, param in enumerate(member.params):
1073
+ validateParam(member, param)
1074
+ type = unaliasType(param.realtype)
1075
+ argName = "_arg%d" % i
1076
+ rvdeclared = writeTraceableArgumentConversion(f, member, i, argName,
1077
+ param.realtype,
1078
+ haveCcx, rvdeclared)
1079
+ argNames.append(argName)
1080
+
1081
+ if customMethodCall is not None:
1082
+ f.write("%s\n" % customMethodCall['code'])
1083
+ f.write("#ifdef DEBUG\n")
1084
+ f.write(" nsresult debug_rv;\n")
1085
+ f.write(" nsCOMPtr<%s> debug_self = do_QueryInterface(self);\n"
1086
+ % member.iface.name);
1087
+ prefix = 'debug_'
1088
+ else:
1089
+ if not rvdeclared:
1090
+ f.write(" nsresult rv;\n")
1091
+ rvdeclared = True
1092
+ prefix = ''
1093
+
1094
+ resultname = prefix + 'result'
1095
+ selfname = prefix + 'self'
1096
+ nsresultname = prefix + 'rv'
1097
+
1098
+ # Prepare out-parameter.
1099
+ writeResultDecl(f, member.realtype, resultname)
1100
+
1101
+ # Call the method.
1102
+ comName = header.methodNativeName(member)
1103
+ if not isVoidType(member.realtype):
1104
+ argNames.append(outParamForm(resultname, member.realtype))
1105
+ args = ', '.join(argNames)
1106
+
1107
+ f.write(" %s = %s->%s(%s);\n" % (nsresultname, selfname, comName, args))
1108
+
1109
+ if customMethodCall is None:
1110
+ # Check for errors.
1111
+ f.write(" if (NS_FAILED(rv)) {\n")
1112
+ if haveCcx:
1113
+ f.write(" xpc_qsThrowMethodFailedWithCcx(ccx, rv);\n")
1114
+ else:
1115
+ # XXX Replace with a real error message!
1116
+ f.write(" xpc_qsThrowMethodFailedWithDetails(cx, rv, "
1117
+ "\"%s\", \"%s\");\n" % (member.iface.name, member.name))
1118
+ writeFailure(f, getTraceInfoDefaultReturn(member.type), 2)
1119
+ else:
1120
+ f.write(" NS_ASSERTION(NS_SUCCEEDED(debug_rv) && "
1121
+ "xpc_qsSameResult(debug_result, result),\n"
1122
+ " \"Got the wrong answer from the custom "
1123
+ "method call!\");\n")
1124
+ f.write("#endif\n")
1125
+
1126
+ # Convert the return value.
1127
+ writeTraceableResultConv(f, member.realtype, len(member.params) + 1)
1128
+
1129
+ # Epilog.
1130
+ f.write("}\n\n")
1131
+
1132
+ # Write the JS_DEFINE_TRCINFO block
1133
+ f.write("JS_DEFINE_TRCINFO_1(%s,\n" % stubName)
1134
+ f.write(" (%d, (static, %s, %s, %s, 0, 0)))\n\n"
1135
+ % (len(traceInfo["params"]), traceInfo["type"], stubName + "_tn",
1136
+ ", ".join(traceInfo["params"])))
1137
+
1138
+ def writeAttrStubs(f, customMethodCalls, attr):
1139
+ getterName = (attr.iface.name + '_'
1140
+ + header.attributeNativeName(attr, True))
1141
+ writeQuickStub(f, customMethodCalls, attr, getterName)
1142
+ if attr.readonly:
1143
+ setterName = 'xpc_qsReadOnlySetter'
1144
+ else:
1145
+ setterName = (attr.iface.name + '_'
1146
+ + header.attributeNativeName(attr, False))
1147
+ writeQuickStub(f, customMethodCalls, attr, setterName, isSetter=True)
1148
+
1149
+ ps = ('{"%s", %s, %s}'
1150
+ % (attr.name, getterName, setterName))
1151
+ return ps
1152
+
1153
+ def writeMethodStub(f, customMethodCalls, method):
1154
+ """ Write a method stub to `f`. Return an xpc_qsFunctionSpec initializer. """
1155
+ stubName = method.iface.name + '_' + header.methodNativeName(method)
1156
+ writeQuickStub(f, customMethodCalls, method, stubName)
1157
+ fs = '{"%s", %s, %d}' % (method.name, stubName, len(method.params))
1158
+ return fs
1159
+
1160
+ def writeTraceableStub(f, customMethodCalls, method):
1161
+ """ Write a method stub to `f`. Return an xpc_qsTraceableSpec initializer. """
1162
+ stubName = method.iface.name + '_' + header.methodNativeName(method)
1163
+ writeTraceableQuickStub(f, customMethodCalls, method, stubName)
1164
+ fs = '{"%s", %s, %d}' % (method.name,
1165
+ "JS_DATA_TO_FUNC_PTR(JSNative, %s_trcinfo)" % stubName,
1166
+ len(method.params))
1167
+ return fs
1168
+
1169
+ def writeStubsForInterface(f, customMethodCalls, iface):
1170
+ f.write("// === interface %s\n\n" % iface.name)
1171
+ propspecs = []
1172
+ funcspecs = []
1173
+ tracespecs = []
1174
+ for member in iface.stubMembers:
1175
+ if member.kind == 'attribute':
1176
+ ps = writeAttrStubs(f, customMethodCalls, member)
1177
+ propspecs.append(ps)
1178
+ elif member.kind == 'method':
1179
+ fs = writeMethodStub(f, customMethodCalls, member)
1180
+ if member.traceable:
1181
+ ts = writeTraceableStub(f, customMethodCalls, member)
1182
+ tracespecs.append(ts)
1183
+ else:
1184
+ funcspecs.append(fs)
1185
+ else:
1186
+ raise TypeError('expected attribute or method, not %r'
1187
+ % member.__class__.__name__)
1188
+
1189
+ if propspecs:
1190
+ f.write("static const xpc_qsPropertySpec %s_properties[] = {\n"
1191
+ % iface.name)
1192
+ for ps in propspecs:
1193
+ f.write(" %s,\n" % ps)
1194
+ f.write(" {nsnull}};\n")
1195
+ if funcspecs:
1196
+ f.write("static const xpc_qsFunctionSpec %s_functions[] = {\n" % iface.name)
1197
+ for fs in funcspecs:
1198
+ f.write(" %s,\n" % fs)
1199
+ f.write(" {nsnull}};\n")
1200
+ if tracespecs:
1201
+ f.write("static const xpc_qsTraceableSpec %s_traceables[] = {\n" % iface.name)
1202
+ for ts in tracespecs:
1203
+ f.write(" %s,\n" % ts)
1204
+ f.write(" {nsnull}};\n")
1205
+ f.write('\n\n')
1206
+
1207
+ def hashIID(iid):
1208
+ # See nsIDKey::HashCode in nsHashtable.h.
1209
+ return int(iid[:8], 16)
1210
+
1211
+ uuid_re = re.compile(r'^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$')
1212
+
1213
+ def writeResultXPCInterfacesArray(f, conf, resulttypes):
1214
+ f.write("// === XPCNativeInterface cache \n\n")
1215
+ count = len(resulttypes)
1216
+ if count > 0:
1217
+ f.write("static XPCNativeInterface* interfaces[%d];\n\n" % count)
1218
+ f.write("void %s_MarkInterfaces()\n"
1219
+ "{\n" % conf.name)
1220
+ if count > 0:
1221
+ f.write(" for (PRUint32 i = 0; i < %d; ++i)\n"
1222
+ " if (interfaces[i])\n"
1223
+ " interfaces[i]->Mark();\n" % count)
1224
+ f.write("}\n")
1225
+ f.write("void %s_ClearInterfaces()\n"
1226
+ "{\n" % conf.name)
1227
+ if count > 0:
1228
+ f.write(" memset(interfaces, 0, %d * "
1229
+ "sizeof(XPCNativeInterface*));\n" % count)
1230
+ f.write("}\n\n")
1231
+ i = 0
1232
+ for type in resulttypes:
1233
+ f.write("XPC_QS_DEFINE_XPCNATIVEINTERFACE_GETTER(%s, interfaces[%d])\n"
1234
+ % (type, i))
1235
+ i += 1
1236
+ if count > 0:
1237
+ f.write("\n\n")
1238
+
1239
+ def writeDefiner(f, conf, interfaces):
1240
+ f.write("// === Definer\n\n")
1241
+
1242
+ # generate the static hash table
1243
+ loadFactor = 0.6
1244
+ size = int(len(interfaces) / loadFactor)
1245
+ buckets = [[] for i in range(size)]
1246
+ for iface in interfaces:
1247
+ # This if-statement discards interfaces specified with
1248
+ # "nsInterfaceName.*" that don't have any stub-able members.
1249
+ if iface.stubMembers:
1250
+ h = hashIID(iface.attributes.uuid)
1251
+ buckets[h % size].append(iface)
1252
+
1253
+ # Calculate where each interface's entry will show up in tableData. Where
1254
+ # there are hash collisions, the extra entries are added at the end of the
1255
+ # table.
1256
+ entryIndexes = {}
1257
+ arraySize = size
1258
+ for i, bucket in enumerate(buckets):
1259
+ if bucket:
1260
+ entryIndexes[bucket[0].attributes.uuid] = i
1261
+ for iface in bucket[1:]:
1262
+ entryIndexes[iface.attributes.uuid] = arraySize
1263
+ arraySize += 1
1264
+
1265
+ entries = [" {{0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}, "
1266
+ "nsnull, nsnull, nsnull, XPC_QS_NULL_INDEX, XPC_QS_NULL_INDEX}"
1267
+ for i in range(arraySize)]
1268
+ for i, bucket in enumerate(buckets):
1269
+ for j, iface in enumerate(bucket):
1270
+ # iid field
1271
+ uuid = iface.attributes.uuid.lower()
1272
+ m = uuid_re.match(uuid)
1273
+ assert m is not None
1274
+ m0, m1, m2, m3, m4 = m.groups()
1275
+ m3arr = ('{0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}'
1276
+ % (m3[0:2], m3[2:4], m4[0:2], m4[2:4],
1277
+ m4[4:6], m4[6:8], m4[8:10], m4[10:12]))
1278
+ iid = ('{0x%s, 0x%s, 0x%s, %s}' % (m0, m1, m2, m3arr))
1279
+
1280
+ # properties field
1281
+ properties = "nsnull"
1282
+ for member in iface.stubMembers:
1283
+ if member.kind == 'attribute':
1284
+ assert not member.traceable
1285
+ properties = iface.name + "_properties"
1286
+ break
1287
+
1288
+ # member field
1289
+ functions = "nsnull"
1290
+ for member in iface.stubMembers:
1291
+ if member.kind == 'method' and not member.traceable:
1292
+ functions = iface.name + "_functions"
1293
+ break
1294
+
1295
+ # traceables field
1296
+ traceables = "nsnull"
1297
+ for member in iface.stubMembers:
1298
+ if member.traceable:
1299
+ traceables = iface.name + "_traceables"
1300
+ break
1301
+
1302
+ # parentInterface field
1303
+ baseName = iface.base
1304
+ while baseName is not None:
1305
+ piface = iface.idl.getName(baseName, None)
1306
+ k = entryIndexes.get(piface.attributes.uuid)
1307
+ if k is not None:
1308
+ parentInterface = str(k)
1309
+ break
1310
+ baseName = piface.base
1311
+ else:
1312
+ parentInterface = "XPC_QS_NULL_INDEX"
1313
+
1314
+ # chain field
1315
+ if j == len(bucket) - 1:
1316
+ chain = "XPC_QS_NULL_INDEX"
1317
+ else:
1318
+ k = entryIndexes[bucket[j+1].attributes.uuid]
1319
+ chain = str(k)
1320
+
1321
+ # add entry
1322
+ entry = " {%s, %s, %s, %s, %s, %s}" % (
1323
+ iid, properties, functions, traceables, parentInterface, chain)
1324
+ entries[entryIndexes[iface.attributes.uuid]] = entry
1325
+
1326
+ f.write("static const xpc_qsHashEntry tableData[] = {\n")
1327
+ f.write(",\n".join(entries))
1328
+ f.write("\n };\n\n")
1329
+
1330
+ # the definer function (entry point to this quick stubs file)
1331
+ f.write("JSBool %s_DefineQuickStubs(" % conf.name)
1332
+ f.write("JSContext *cx, JSObject *proto, uintN flags, PRUint32 count, "
1333
+ "const nsID **iids)\n"
1334
+ "{\n")
1335
+ f.write(" return xpc_qsDefineQuickStubs("
1336
+ "cx, proto, flags, count, iids, %d, tableData);\n" % size)
1337
+ f.write("}\n\n\n")
1338
+
1339
+
1340
+ stubTopTemplate = '''\
1341
+ /* THIS FILE IS AUTOGENERATED - DO NOT EDIT */
1342
+ #include "jsapi.h"
1343
+ #include "jscntxt.h"
1344
+ #include "prtypes.h"
1345
+ #include "nsID.h"
1346
+ #include "%s"
1347
+ #include "nscore.h"
1348
+ #include "nsCOMPtr.h"
1349
+ #include "nsDependentString.h"
1350
+ #include "xpcprivate.h" // for XPCCallContext
1351
+ #include "xpcquickstubs.h"
1352
+ #include "jsbuiltins.h"
1353
+ '''
1354
+
1355
+ def writeStubFile(filename, headerFilename, conf, interfaces):
1356
+ print "Creating stub file", filename
1357
+ make_targets.append(filename)
1358
+
1359
+ f = open(filename, 'w')
1360
+ filesIncluded = sets.Set()
1361
+
1362
+ def includeType(type):
1363
+ type = unaliasType(type)
1364
+ if type.kind in ('builtin', 'native'):
1365
+ return None
1366
+ file = conf.irregularFilenames.get(type.name, type.name) + '.h'
1367
+ if file not in filesIncluded:
1368
+ f.write('#include "%s"\n' % file)
1369
+ filesIncluded.add(file)
1370
+ return type
1371
+
1372
+ def writeIncludesForMember(member):
1373
+ assert member.kind in ('attribute', 'method')
1374
+ resulttype = includeType(member.realtype)
1375
+ if member.kind == 'method':
1376
+ for p in member.params:
1377
+ includeType(p.realtype)
1378
+ return resulttype
1379
+
1380
+ def writeIncludesForInterface(iface):
1381
+ assert iface.kind == 'interface'
1382
+ resulttypes = []
1383
+ for member in iface.stubMembers:
1384
+ resulttype = writeIncludesForMember(member)
1385
+ if resulttype is not None and not isVariantType(resulttype):
1386
+ resulttypes.append(resulttype.name)
1387
+
1388
+ includeType(iface)
1389
+
1390
+ return resulttypes
1391
+
1392
+ try:
1393
+ f.write(stubTopTemplate % os.path.basename(headerFilename))
1394
+ N = 256
1395
+ for customInclude in conf.customIncludes:
1396
+ f.write('#include "%s"\n' % customInclude)
1397
+ resulttypes = []
1398
+ for iface in interfaces:
1399
+ resulttypes.extend(writeIncludesForInterface(iface))
1400
+ f.write("\n\n")
1401
+ writeResultXPCInterfacesArray(f, conf, sets.ImmutableSet(resulttypes))
1402
+ for iface in interfaces:
1403
+ writeStubsForInterface(f, conf.customMethodCalls, iface)
1404
+ writeDefiner(f, conf, interfaces)
1405
+ finally:
1406
+ f.close()
1407
+
1408
+ def makeQuote(filename):
1409
+ return filename.replace(' ', '\\ ') # enjoy!
1410
+
1411
+ def writeMakeDependOutput(filename):
1412
+ print "Creating makedepend file", filename
1413
+ f = open(filename, 'w')
1414
+ try:
1415
+ if len(make_targets) > 0:
1416
+ f.write("%s:" % makeQuote(make_targets[0]))
1417
+ for filename in make_dependencies:
1418
+ f.write(' \\\n\t\t%s' % makeQuote(filename))
1419
+ f.write('\n\n')
1420
+ for filename in make_targets[1:]:
1421
+ f.write('%s: %s\n' % (makeQuote(filename), makeQuote(make_targets[0])))
1422
+ finally:
1423
+ f.close()
1424
+
1425
+ def main():
1426
+ from optparse import OptionParser
1427
+ o = OptionParser(usage="usage: %prog [options] configfile")
1428
+ o.add_option('-o', "--stub-output",
1429
+ type='string', dest='stub_output', default=None,
1430
+ help="Quick stub C++ source output file", metavar="FILE")
1431
+ o.add_option('--header-output', type='string', default=None,
1432
+ help="Quick stub header output file", metavar="FILE")
1433
+ o.add_option('--makedepend-output', type='string', default=None,
1434
+ help="gnumake dependencies output file", metavar="FILE")
1435
+ o.add_option('--idlpath', type='string', default='.',
1436
+ help="colon-separated directories to search for idl files",
1437
+ metavar="PATH")
1438
+ o.add_option('--cachedir', dest='cachedir', default='',
1439
+ help="Directory in which to cache lex/parse tables.")
1440
+ o.add_option("--verbose-errors", action='store_true', default=False,
1441
+ help="When an error happens, display the Python traceback.")
1442
+ o.add_option("--enable-traceables", action='store_true', default=False,
1443
+ help="Whether or not traceable methods are generated.")
1444
+ (options, filenames) = o.parse_args()
1445
+
1446
+ if len(filenames) != 1:
1447
+ o.error("Exactly one config filename is needed.")
1448
+ filename = filenames[0]
1449
+
1450
+ if options.stub_output is None:
1451
+ if filename.endswith('.qsconf') or filename.endswith('.py'):
1452
+ options.stub_output = filename.rsplit('.', 1)[0] + '.cpp'
1453
+ else:
1454
+ options.stub_output = filename + '.cpp'
1455
+ if options.header_output is None:
1456
+ options.header_output = re.sub(r'(\.c|\.cpp)?$', '.h',
1457
+ options.stub_output)
1458
+
1459
+ if options.cachedir != '':
1460
+ sys.path.append(options.cachedir)
1461
+ if not os.path.isdir(options.cachedir):
1462
+ os.mkdir(options.cachedir)
1463
+
1464
+ try:
1465
+ includePath = options.idlpath.split(':')
1466
+ conf, interfaces = readConfigFile(filename,
1467
+ includePath=includePath,
1468
+ cachedir=options.cachedir,
1469
+ traceable=options.enable_traceables)
1470
+ writeHeaderFile(options.header_output, conf.name)
1471
+ writeStubFile(options.stub_output, options.header_output,
1472
+ conf, interfaces)
1473
+ if options.makedepend_output is not None:
1474
+ writeMakeDependOutput(options.makedepend_output)
1475
+ except Exception, exc:
1476
+ if options.verbose_errors:
1477
+ raise
1478
+ elif isinstance(exc, (UserError, xpidl.IDLError)):
1479
+ warn(str(exc))
1480
+ elif isinstance(exc, OSError):
1481
+ warn("%s: %s" % (exc.__class__.__name__, exc))
1482
+ else:
1483
+ raise
1484
+ sys.exit(1)
1485
+
1486
+ if __name__ == '__main__':
1487
+ main()