johnson 1.2.0 → 2.0.0.pre0

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