johnson 1.2.0 → 2.0.0.pre0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,1128 @@
1
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
+ *
3
+ * ***** BEGIN LICENSE BLOCK *****
4
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
+ *
6
+ * The contents of this file are subject to the Mozilla Public License Version
7
+ * 1.1 (the "License"); you may not use this file except in compliance with
8
+ * the License. You may obtain a copy of the License at
9
+ * http://www.mozilla.org/MPL/
10
+ *
11
+ * Software distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
+ * for the specific language governing rights and limitations under the
14
+ * License.
15
+ *
16
+ * The Original Code is mozilla.org code.
17
+ *
18
+ * The Initial Developer of the Original Code is
19
+ * Mozilla Foundation
20
+ * Portions created by the Initial Developer are Copyright (C) 2008
21
+ * the Initial Developer. All Rights Reserved.
22
+ *
23
+ * Contributor(s):
24
+ * Jason Orendorff <jorendorff@mozilla.com>
25
+ *
26
+ * Alternatively, the contents of this file may be used under the terms of
27
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
28
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
+ * in which case the provisions of the GPL or the LGPL are applicable instead
30
+ * of those above. If you wish to allow use of your version of this file only
31
+ * under the terms of either the GPL or the LGPL, and not to allow others to
32
+ * use your version of this file under the terms of the MPL, indicate your
33
+ * decision by deleting the provisions above and replace them with the notice
34
+ * and other provisions required by the GPL or the LGPL. If you do not delete
35
+ * the provisions above, a recipient may use your version of this file under
36
+ * the terms of any one of the MPL, the GPL or the LGPL.
37
+ *
38
+ * ***** END LICENSE BLOCK ***** */
39
+
40
+ #include "jsapi.h"
41
+ #include "jsstr.h"
42
+ #include "jscntxt.h" /* for error messages */
43
+ #include "nsCOMPtr.h"
44
+ #include "xpcprivate.h"
45
+ #include "xpcinlines.h"
46
+ #include "xpcquickstubs.h"
47
+ #include "XPCWrapper.h"
48
+ #include "XPCNativeWrapper.h"
49
+
50
+ static const xpc_qsHashEntry *
51
+ LookupEntry(PRUint32 tableSize, const xpc_qsHashEntry *table, const nsID &iid)
52
+ {
53
+ size_t i;
54
+ const xpc_qsHashEntry *p;
55
+
56
+ i = iid.m0 % tableSize;
57
+ do
58
+ {
59
+ p = table + i;
60
+ if(p->iid.Equals(iid))
61
+ return p;
62
+ i = p->chain;
63
+ } while(i != XPC_QS_NULL_INDEX);
64
+ return nsnull;
65
+ }
66
+
67
+ static const xpc_qsHashEntry *
68
+ LookupInterfaceOrAncestor(PRUint32 tableSize, const xpc_qsHashEntry *table,
69
+ const nsID &iid)
70
+ {
71
+ const xpc_qsHashEntry *entry = LookupEntry(tableSize, table, iid);
72
+ if(!entry)
73
+ {
74
+ /*
75
+ * On a miss, we have to search for every interface the object
76
+ * supports, including ancestors.
77
+ */
78
+ nsCOMPtr<nsIInterfaceInfo> info;
79
+ if(NS_FAILED(nsXPConnect::GetXPConnect()->GetInfoForIID(
80
+ &iid, getter_AddRefs(info))))
81
+ return nsnull;
82
+
83
+ const nsIID *piid;
84
+ for(;;)
85
+ {
86
+ nsCOMPtr<nsIInterfaceInfo> parent;
87
+ if(NS_FAILED(info->GetParent(getter_AddRefs(parent))) ||
88
+ !parent ||
89
+ NS_FAILED(parent->GetIIDShared(&piid)))
90
+ {
91
+ break;
92
+ }
93
+ entry = LookupEntry(tableSize, table, *piid);
94
+ if(entry)
95
+ break;
96
+ info.swap(parent);
97
+ }
98
+ }
99
+ return entry;
100
+ }
101
+
102
+ static JSBool
103
+ PropertyOpForwarder(JSContext *cx, uintN argc, jsval *vp)
104
+ {
105
+ // Layout:
106
+ // this = our this
107
+ // property op to call = callee reserved slot 0
108
+ // name of the property = callee reserved slot 1
109
+
110
+ JSObject *callee = JSVAL_TO_OBJECT(JS_CALLEE(cx, vp));
111
+ JSObject *obj = JS_THIS_OBJECT(cx, vp);
112
+ jsval v;
113
+
114
+ if(!JS_GetReservedSlot(cx, callee, 0, &v))
115
+ return JS_FALSE;
116
+ JSObject *ptrobj = JSVAL_TO_OBJECT(v);
117
+ JSPropertyOp *popp = static_cast<JSPropertyOp *>(JS_GetPrivate(cx, ptrobj));
118
+
119
+ if(!JS_GetReservedSlot(cx, callee, 1, &v))
120
+ return JS_FALSE;
121
+
122
+ jsval argval = (argc > 0) ? JS_ARGV(cx, vp)[0] : JSVAL_VOID;
123
+ JS_SET_RVAL(cx, vp, argval);
124
+ return (*popp)(cx, obj, v, vp);
125
+ }
126
+
127
+ static void
128
+ PointerFinalize(JSContext *cx, JSObject *obj)
129
+ {
130
+ JSPropertyOp *popp = static_cast<JSPropertyOp *>(JS_GetPrivate(cx, obj));
131
+ delete popp;
132
+ }
133
+
134
+ static JSClass
135
+ PointerHolderClass = {
136
+ "Pointer", JSCLASS_HAS_PRIVATE,
137
+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
138
+ JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, PointerFinalize,
139
+ JSCLASS_NO_OPTIONAL_MEMBERS
140
+ };
141
+
142
+ static JSObject *
143
+ GeneratePropertyOp(JSContext *cx, JSObject *obj, jsval idval, uintN argc,
144
+ const char *name, JSPropertyOp pop)
145
+ {
146
+ // The JS engine provides two reserved slots on function objects for
147
+ // XPConnect to use. Use them to stick the necessary info here.
148
+ JSFunction *fun =
149
+ JS_NewFunction(cx, reinterpret_cast<JSNative>(PropertyOpForwarder),
150
+ argc, JSFUN_FAST_NATIVE, obj, name);
151
+ if(!fun)
152
+ return JS_FALSE;
153
+
154
+ JSObject *funobj = JS_GetFunctionObject(fun);
155
+
156
+ JSAutoTempValueRooter tvr(cx, OBJECT_TO_JSVAL(funobj));
157
+
158
+ // Unfortunately, we cannot guarantee that JSPropertyOp is aligned. Use a
159
+ // second object to work around this.
160
+ JSObject *ptrobj = JS_NewObject(cx, &PointerHolderClass, nsnull, funobj);
161
+ if(!ptrobj)
162
+ return JS_FALSE;
163
+ JSPropertyOp *popp = new JSPropertyOp;
164
+ if(!popp)
165
+ return JS_FALSE;
166
+ *popp = pop;
167
+ JS_SetPrivate(cx, ptrobj, popp);
168
+
169
+ JS_SetReservedSlot(cx, funobj, 0, OBJECT_TO_JSVAL(ptrobj));
170
+ JS_SetReservedSlot(cx, funobj, 1, idval);
171
+ return funobj;
172
+ }
173
+
174
+ static JSBool
175
+ ReifyPropertyOps(JSContext *cx, JSObject *obj, jsval idval, jsid interned_id,
176
+ const char *name, JSPropertyOp getter, JSPropertyOp setter,
177
+ JSObject **getterobjp, JSObject **setterobjp)
178
+ {
179
+ // Generate both getter and setter and stash them in the prototype.
180
+ jsval roots[2] = { JSVAL_NULL, JSVAL_NULL };
181
+ JSAutoTempValueRooter tvr(cx, 2, roots);
182
+
183
+ uintN attrs = JSPROP_SHARED;
184
+ JSObject *getterobj;
185
+ if(getter)
186
+ {
187
+ getterobj = GeneratePropertyOp(cx, obj, idval, 0, name, getter);
188
+ if(!getterobj)
189
+ return JS_FALSE;
190
+ roots[0] = OBJECT_TO_JSVAL(getterobj);
191
+ attrs |= JSPROP_GETTER;
192
+ }
193
+ else
194
+ getterobj = nsnull;
195
+
196
+ JSObject *setterobj;
197
+ if (setter)
198
+ {
199
+ setterobj = GeneratePropertyOp(cx, obj, idval, 1, name, setter);
200
+ if(!setterobj)
201
+ return JS_FALSE;
202
+ roots[1] = OBJECT_TO_JSVAL(setterobj);
203
+ attrs |= JSPROP_SETTER;
204
+ }
205
+ else
206
+ setterobj = nsnull;
207
+
208
+ if(getterobjp)
209
+ *getterobjp = getterobj;
210
+ if(setterobjp)
211
+ *setterobjp = setterobj;
212
+ return JS_DefinePropertyById(cx, obj, interned_id, JSVAL_VOID,
213
+ JS_DATA_TO_FUNC_PTR(JSPropertyOp, getterobj),
214
+ JS_DATA_TO_FUNC_PTR(JSPropertyOp, setterobj),
215
+ attrs);
216
+ }
217
+
218
+ static JSBool
219
+ LookupGetterOrSetter(JSContext *cx, JSBool wantGetter, jsval *vp)
220
+ {
221
+ uintN attrs;
222
+ JSBool found;
223
+ JSPropertyOp getter, setter;
224
+ JSObject *obj2;
225
+ jsid interned_id;
226
+ jsval v;
227
+
228
+ XPC_QS_ASSERT_CONTEXT_OK(cx);
229
+ JSObject *obj = JS_THIS_OBJECT(cx, vp);
230
+ if (!obj)
231
+ return JS_FALSE;
232
+ jsval idval = JS_ARGV(cx, vp)[0];
233
+
234
+ const char *name = JSVAL_IS_STRING(idval)
235
+ ? JS_GetStringBytes(JSVAL_TO_STRING(idval))
236
+ : nsnull;
237
+ if(!JS_ValueToId(cx, idval, &interned_id) ||
238
+ !JS_LookupPropertyWithFlagsById(cx, obj, interned_id,
239
+ JSRESOLVE_QUALIFIED, &obj2, &v) ||
240
+ (obj2 &&
241
+ !JS_GetPropertyAttrsGetterAndSetterById(cx, obj2, interned_id, &attrs,
242
+ &found, &getter, &setter)))
243
+ return JS_FALSE;
244
+
245
+ // No property at all means no getters or setters possible.
246
+ if(!obj2 || !found)
247
+ {
248
+ JS_SET_RVAL(cx, vp, JSVAL_VOID);
249
+ return JS_TRUE;
250
+ }
251
+
252
+ // Inline obj_lookup[GS]etter here.
253
+ if(wantGetter)
254
+ {
255
+ if(attrs & JSPROP_GETTER)
256
+ {
257
+ JS_SET_RVAL(cx, vp,
258
+ OBJECT_TO_JSVAL(JS_FUNC_TO_DATA_PTR(JSObject *, getter)));
259
+ return JS_TRUE;
260
+ }
261
+ }
262
+ else
263
+ {
264
+ if(attrs & JSPROP_SETTER)
265
+ {
266
+ JS_SET_RVAL(cx, vp,
267
+ OBJECT_TO_JSVAL(JS_FUNC_TO_DATA_PTR(JSObject *, setter)));
268
+ return JS_TRUE;
269
+ }
270
+ }
271
+
272
+ // Since XPConnect doesn't use JSPropertyOps in any other contexts,
273
+ // ensuring that we have an XPConnect prototype object ensures that
274
+ // we are only going to expose quickstubbed properties to script.
275
+ // Also be careful not to overwrite existing properties!
276
+ if(!name ||
277
+ !IS_PROTO_CLASS(STOBJ_GET_CLASS(obj2)) ||
278
+ (attrs & (JSPROP_GETTER | JSPROP_SETTER)) ||
279
+ !(getter || setter))
280
+ {
281
+ JS_SET_RVAL(cx, vp, JSVAL_VOID);
282
+ return JS_TRUE;
283
+ }
284
+
285
+ JSObject *getterobj, *setterobj;
286
+ if(!ReifyPropertyOps(cx, obj, idval, interned_id, name, getter, setter,
287
+ &getterobj, &setterobj))
288
+ return JS_FALSE;
289
+
290
+ JSObject *wantedobj = wantGetter ? getterobj : setterobj;
291
+ v = wantedobj ? OBJECT_TO_JSVAL(wantedobj) : JSVAL_VOID;
292
+ JS_SET_RVAL(cx, vp, v);
293
+ return JS_TRUE;
294
+ }
295
+
296
+ static JSBool
297
+ SharedLookupGetter(JSContext *cx, uintN argc, jsval *vp)
298
+ {
299
+ return LookupGetterOrSetter(cx, PR_TRUE, vp);
300
+ }
301
+
302
+ static JSBool
303
+ SharedLookupSetter(JSContext *cx, uintN argc, jsval *vp)
304
+ {
305
+ return LookupGetterOrSetter(cx, PR_FALSE, vp);
306
+ }
307
+
308
+ // XXX Hack! :-/
309
+ JS_FRIEND_API(JSBool) js_obj_defineGetter(JSContext *cx, uintN argc, jsval *vp);
310
+ JS_FRIEND_API(JSBool) js_obj_defineSetter(JSContext *cx, uintN argc, jsval *vp);
311
+
312
+ static JSBool
313
+ DefineGetterOrSetter(JSContext *cx, uintN argc, JSBool wantGetter, jsval *vp)
314
+ {
315
+ uintN attrs;
316
+ JSBool found;
317
+ JSPropertyOp getter, setter;
318
+ JSObject *obj2;
319
+ jsval v;
320
+ jsid interned_id;
321
+
322
+ XPC_QS_ASSERT_CONTEXT_OK(cx);
323
+ JSObject *obj = JS_THIS_OBJECT(cx, vp);
324
+ if (!obj)
325
+ return JS_FALSE;
326
+ JSFastNative forward = wantGetter ? js_obj_defineGetter : js_obj_defineSetter;
327
+ jsval id = (argc >= 1) ? JS_ARGV(cx, vp)[0] : JSVAL_VOID;
328
+ if(!JSVAL_IS_STRING(id))
329
+ return forward(cx, argc, vp);
330
+ JSString *str = JSVAL_TO_STRING(id);
331
+
332
+ const char *name = JS_GetStringBytes(str);
333
+ if(!JS_ValueToId(cx, id, &interned_id) ||
334
+ !JS_LookupPropertyWithFlagsById(cx, obj, interned_id,
335
+ JSRESOLVE_QUALIFIED, &obj2, &v) ||
336
+ (obj2 &&
337
+ !JS_GetPropertyAttrsGetterAndSetterById(cx, obj2, interned_id, &attrs,
338
+ &found, &getter, &setter)))
339
+ return JS_FALSE;
340
+
341
+ // The property didn't exist, already has a getter or setter, or is not
342
+ // our property, then just forward now.
343
+ if(!obj2 ||
344
+ (attrs & (JSPROP_GETTER | JSPROP_SETTER)) ||
345
+ !(getter || setter) ||
346
+ !IS_PROTO_CLASS(STOBJ_GET_CLASS(obj2)))
347
+ return forward(cx, argc, vp);
348
+
349
+ // Reify the getter and setter...
350
+ if(!ReifyPropertyOps(cx, obj, id, interned_id, name, getter, setter,
351
+ nsnull, nsnull))
352
+ return JS_FALSE;
353
+
354
+ return forward(cx, argc, vp);
355
+ }
356
+
357
+ static JSBool
358
+ SharedDefineGetter(JSContext *cx, uintN argc, jsval *vp)
359
+ {
360
+ return DefineGetterOrSetter(cx, argc, PR_TRUE, vp);
361
+ }
362
+
363
+ static JSBool
364
+ SharedDefineSetter(JSContext *cx, uintN argc, jsval *vp)
365
+ {
366
+ return DefineGetterOrSetter(cx, argc, PR_FALSE, vp);
367
+ }
368
+
369
+
370
+ JSBool
371
+ xpc_qsDefineQuickStubs(JSContext *cx, JSObject *proto, uintN flags,
372
+ PRUint32 ifacec, const nsIID **interfaces,
373
+ PRUint32 tableSize, const xpc_qsHashEntry *table)
374
+ {
375
+ /*
376
+ * Walk interfaces in reverse order to behave like XPConnect when a
377
+ * feature is defined in more than one of the interfaces.
378
+ *
379
+ * XPCNativeSet::FindMethod returns the first matching feature it finds,
380
+ * searching the interfaces forward. Here, definitions toward the
381
+ * front of 'interfaces' overwrite those toward the back.
382
+ */
383
+ PRBool definedProperty = PR_FALSE;
384
+ for(uint32 i = ifacec; i-- != 0;)
385
+ {
386
+ const nsID &iid = *interfaces[i];
387
+ const xpc_qsHashEntry *entry =
388
+ LookupInterfaceOrAncestor(tableSize, table, iid);
389
+
390
+ if(entry)
391
+ {
392
+ for(;;)
393
+ {
394
+ // Define quick stubs for attributes.
395
+ const xpc_qsPropertySpec *ps = entry->properties;
396
+ if(ps)
397
+ {
398
+ for(; ps->name; ps++)
399
+ {
400
+ definedProperty = PR_TRUE;
401
+ if(!JS_DefineProperty(cx, proto, ps->name, JSVAL_VOID,
402
+ ps->getter, ps->setter,
403
+ flags | JSPROP_SHARED))
404
+ return JS_FALSE;
405
+ }
406
+ }
407
+
408
+ // Define quick stubs for methods.
409
+ const xpc_qsFunctionSpec *fs = entry->functions;
410
+ if(fs)
411
+ {
412
+ for(; fs->name; fs++)
413
+ {
414
+ if(!JS_DefineFunction(
415
+ cx, proto, fs->name,
416
+ reinterpret_cast<JSNative>(fs->native),
417
+ fs->arity, flags | JSFUN_FAST_NATIVE))
418
+ return JS_FALSE;
419
+ }
420
+ }
421
+
422
+ const xpc_qsTraceableSpec *ts = entry->traceables;
423
+ if(ts)
424
+ {
425
+ for(; ts->name; ts++)
426
+ {
427
+ if(!JS_DefineFunction(
428
+ cx, proto, ts->name, ts->native, ts->arity,
429
+ flags | JSFUN_FAST_NATIVE | JSFUN_STUB_GSOPS |
430
+ JSFUN_TRACEABLE))
431
+ return JS_FALSE;
432
+ }
433
+ }
434
+
435
+ // Next.
436
+ size_t j = entry->parentInterface;
437
+ if(j == XPC_QS_NULL_INDEX)
438
+ break;
439
+ entry = table + j;
440
+ }
441
+ }
442
+ }
443
+
444
+ static JSFunctionSpec getterfns[] = {
445
+ JS_FN("__lookupGetter__", SharedLookupGetter, 1, 0),
446
+ JS_FN("__lookupSetter__", SharedLookupSetter, 1, 0),
447
+ JS_FN("__defineGetter__", SharedDefineGetter, 2, 0),
448
+ JS_FN("__defineSetter__", SharedDefineSetter, 2, 0),
449
+ JS_FS_END
450
+ };
451
+
452
+ if(definedProperty && !JS_DefineFunctions(cx, proto, getterfns))
453
+ return JS_FALSE;
454
+
455
+ return JS_TRUE;
456
+ }
457
+
458
+ JSBool
459
+ xpc_qsThrow(JSContext *cx, nsresult rv)
460
+ {
461
+ XPCThrower::Throw(rv, cx);
462
+ return JS_FALSE;
463
+ }
464
+
465
+ /**
466
+ * Get the interface name and member name (for error messages).
467
+ *
468
+ * We could instead have each quick stub pass its name to the error-handling
469
+ * functions, as that name is statically known. But that would be redundant;
470
+ * the information is handy at runtime anyway. Also, this code often produces
471
+ * a more specific error message, e.g. "[nsIDOMHTMLDocument.appendChild]"
472
+ * rather than "[nsIDOMNode.appendChild]".
473
+ */
474
+ static void
475
+ GetMemberInfo(JSObject *obj,
476
+ jsval memberId,
477
+ const char **ifaceName,
478
+ const char **memberName)
479
+ {
480
+ // Get the interface name. From DefinePropertyIfFound (in
481
+ // xpcwrappednativejsops.cpp) and XPCThrower::Verbosify.
482
+ //
483
+ // We could instead make the quick stub could pass in its interface name,
484
+ // but this code often produces a more specific error message, e.g.
485
+ *ifaceName = "Unknown";
486
+
487
+ NS_ASSERTION(IS_WRAPPER_CLASS(STOBJ_GET_CLASS(obj)) ||
488
+ STOBJ_GET_CLASS(obj) == &XPC_WN_Tearoff_JSClass,
489
+ "obj must be an XPCWrappedNative");
490
+ XPCWrappedNative *wrapper = (XPCWrappedNative *) STOBJ_GET_PRIVATE(obj);
491
+ XPCWrappedNativeProto *proto = wrapper->GetProto();
492
+ if(proto)
493
+ {
494
+ XPCNativeSet *set = proto->GetSet();
495
+ if(set)
496
+ {
497
+ XPCNativeMember *member;
498
+ XPCNativeInterface *iface;
499
+
500
+ if(set->FindMember(memberId, &member, &iface))
501
+ *ifaceName = iface->GetNameString();
502
+ }
503
+ }
504
+
505
+ *memberName = (JSVAL_IS_STRING(memberId)
506
+ ? JS_GetStringBytes(JSVAL_TO_STRING(memberId))
507
+ : "unknown");
508
+ }
509
+
510
+ static void
511
+ GetMethodInfo(JSContext *cx,
512
+ jsval *vp,
513
+ const char **ifaceName,
514
+ const char **memberName)
515
+ {
516
+ JSObject *funobj = JSVAL_TO_OBJECT(JS_CALLEE(cx, vp));
517
+ NS_ASSERTION(JS_ObjectIsFunction(cx, funobj),
518
+ "JSFastNative callee should be Function object");
519
+ JSString *str = JS_GetFunctionId((JSFunction *) JS_GetPrivate(cx, funobj));
520
+ jsval methodId = str ? STRING_TO_JSVAL(str) : JSVAL_NULL;
521
+
522
+ GetMemberInfo(JSVAL_TO_OBJECT(vp[1]), methodId, ifaceName, memberName);
523
+ }
524
+
525
+ static JSBool
526
+ ThrowCallFailed(JSContext *cx, nsresult rv,
527
+ const char *ifaceName, const char *memberName)
528
+ {
529
+ // From XPCThrower::ThrowBadResult.
530
+ char* sz;
531
+ const char* format;
532
+ const char* name;
533
+
534
+ /*
535
+ * If there is a pending exception when the native call returns and
536
+ * it has the same error result as returned by the native call, then
537
+ * the native call may be passing through an error from a previous JS
538
+ * call. So we'll just throw that exception into our JS.
539
+ */
540
+ if(XPCThrower::CheckForPendingException(rv, cx))
541
+ return JS_FALSE;
542
+
543
+ // else...
544
+
545
+ if(!nsXPCException::NameAndFormatForNSResult(
546
+ NS_ERROR_XPC_NATIVE_RETURNED_FAILURE, nsnull, &format) ||
547
+ !format)
548
+ {
549
+ format = "";
550
+ }
551
+
552
+ if(nsXPCException::NameAndFormatForNSResult(rv, &name, nsnull)
553
+ && name)
554
+ {
555
+ sz = JS_smprintf("%s 0x%x (%s) [%s.%s]",
556
+ format, rv, name, ifaceName, memberName);
557
+ }
558
+ else
559
+ {
560
+ sz = JS_smprintf("%s 0x%x [%s.%s]",
561
+ format, rv, ifaceName, memberName);
562
+ }
563
+
564
+ XPCThrower::BuildAndThrowException(cx, rv, sz);
565
+
566
+ if(sz)
567
+ JS_smprintf_free(sz);
568
+
569
+ return JS_FALSE;
570
+ }
571
+
572
+ JSBool
573
+ xpc_qsThrowGetterSetterFailed(JSContext *cx, nsresult rv, JSObject *obj,
574
+ jsval memberId)
575
+ {
576
+ const char *ifaceName, *memberName;
577
+ GetMemberInfo(obj, memberId, &ifaceName, &memberName);
578
+ return ThrowCallFailed(cx, rv, ifaceName, memberName);
579
+ }
580
+
581
+ JSBool
582
+ xpc_qsThrowMethodFailed(JSContext *cx, nsresult rv, jsval *vp)
583
+ {
584
+ const char *ifaceName, *memberName;
585
+ GetMethodInfo(cx, vp, &ifaceName, &memberName);
586
+ return ThrowCallFailed(cx, rv, ifaceName, memberName);
587
+ }
588
+
589
+ JSBool
590
+ xpc_qsThrowMethodFailedWithCcx(XPCCallContext &ccx, nsresult rv)
591
+ {
592
+ ThrowBadResult(rv, ccx);
593
+ return JS_FALSE;
594
+ }
595
+
596
+ void
597
+ xpc_qsThrowMethodFailedWithDetails(JSContext *cx, nsresult rv,
598
+ const char *ifaceName,
599
+ const char *memberName)
600
+ {
601
+ ThrowCallFailed(cx, rv, ifaceName, memberName);
602
+ }
603
+
604
+ static void
605
+ ThrowBadArg(JSContext *cx, nsresult rv,
606
+ const char *ifaceName, const char *memberName, uintN paramnum)
607
+ {
608
+ // From XPCThrower::ThrowBadParam.
609
+ char* sz;
610
+ const char* format;
611
+
612
+ if(!nsXPCException::NameAndFormatForNSResult(rv, nsnull, &format))
613
+ format = "";
614
+
615
+ sz = JS_smprintf("%s arg %u [%s.%s]",
616
+ format, (unsigned int) paramnum, ifaceName, memberName);
617
+
618
+ XPCThrower::BuildAndThrowException(cx, rv, sz);
619
+
620
+ if(sz)
621
+ JS_smprintf_free(sz);
622
+ }
623
+
624
+ void
625
+ xpc_qsThrowBadArg(JSContext *cx, nsresult rv, jsval *vp, uintN paramnum)
626
+ {
627
+ const char *ifaceName, *memberName;
628
+ GetMethodInfo(cx, vp, &ifaceName, &memberName);
629
+ ThrowBadArg(cx, rv, ifaceName, memberName, paramnum);
630
+ }
631
+
632
+ void
633
+ xpc_qsThrowBadArgWithCcx(XPCCallContext &ccx, nsresult rv, uintN paramnum)
634
+ {
635
+ XPCThrower::ThrowBadParam(rv, paramnum, ccx);
636
+ }
637
+
638
+ void
639
+ xpc_qsThrowBadArgWithDetails(JSContext *cx, nsresult rv, uintN paramnum,
640
+ const char *ifaceName, const char *memberName)
641
+ {
642
+ ThrowBadArg(cx, rv, ifaceName, memberName, paramnum);
643
+ }
644
+
645
+ void
646
+ xpc_qsThrowBadSetterValue(JSContext *cx, nsresult rv,
647
+ JSObject *obj, jsval propId)
648
+ {
649
+ const char *ifaceName, *memberName;
650
+ GetMemberInfo(obj, propId, &ifaceName, &memberName);
651
+ ThrowBadArg(cx, rv, ifaceName, memberName, 0);
652
+ }
653
+
654
+ xpc_qsDOMString::xpc_qsDOMString(JSContext *cx, jsval *pval)
655
+ {
656
+ // From the T_DOMSTRING case in XPCConvert::JSData2Native.
657
+ typedef implementation_type::char_traits traits;
658
+ jsval v;
659
+ JSString *s;
660
+ const jschar *chars;
661
+ size_t len;
662
+
663
+ v = *pval;
664
+ if(JSVAL_IS_STRING(v))
665
+ {
666
+ s = JSVAL_TO_STRING(v);
667
+ }
668
+ else
669
+ {
670
+ if(JSVAL_IS_NULL(v))
671
+ {
672
+ (new(mBuf) implementation_type(
673
+ traits::sEmptyBuffer, PRUint32(0)))->SetIsVoid(PR_TRUE);
674
+ mValid = JS_TRUE;
675
+ return;
676
+ }
677
+
678
+ s = JS_ValueToString(cx, v);
679
+ if(!s)
680
+ {
681
+ mValid = JS_FALSE;
682
+ return;
683
+ }
684
+ *pval = STRING_TO_JSVAL(s); // Root the new string.
685
+ }
686
+
687
+ len = JS_GetStringLength(s);
688
+ chars = (len == 0 ? traits::sEmptyBuffer : JS_GetStringChars(s));
689
+ new(mBuf) implementation_type(chars, len);
690
+ mValid = JS_TRUE;
691
+ }
692
+
693
+ xpc_qsAString::xpc_qsAString(JSContext *cx, jsval *pval)
694
+ {
695
+ // From the T_ASTRING case in XPCConvert::JSData2Native.
696
+ typedef implementation_type::char_traits traits;
697
+ jsval v;
698
+ JSString *s;
699
+ const jschar *chars;
700
+ size_t len;
701
+
702
+ v = *pval;
703
+ if(JSVAL_IS_STRING(v))
704
+ {
705
+ s = JSVAL_TO_STRING(v);
706
+ }
707
+ else
708
+ {
709
+ if(JSVAL_IS_NULL(v) || JSVAL_IS_VOID(v))
710
+ {
711
+ (new(mBuf) implementation_type(
712
+ traits::sEmptyBuffer, PRUint32(0)))->SetIsVoid(PR_TRUE);
713
+ mValid = JS_TRUE;
714
+ return;
715
+ }
716
+
717
+ s = JS_ValueToString(cx, v);
718
+ if(!s)
719
+ {
720
+ mValid = JS_FALSE;
721
+ return;
722
+ }
723
+ *pval = STRING_TO_JSVAL(s); // Root the new string.
724
+ }
725
+
726
+ len = JS_GetStringLength(s);
727
+ chars = (len == 0 ? traits::sEmptyBuffer : JS_GetStringChars(s));
728
+ new(mBuf) implementation_type(chars, len);
729
+ mValid = JS_TRUE;
730
+ }
731
+
732
+ xpc_qsACString::xpc_qsACString(JSContext *cx, jsval *pval)
733
+ {
734
+ // From the T_CSTRING case in XPCConvert::JSData2Native.
735
+ jsval v;
736
+ JSString *s;
737
+
738
+ v = *pval;
739
+ if(JSVAL_IS_STRING(v))
740
+ {
741
+ s = JSVAL_TO_STRING(v);
742
+ }
743
+ else
744
+ {
745
+ if(JSVAL_IS_NULL(v) || JSVAL_IS_VOID(v))
746
+ {
747
+ (new(mBuf) implementation_type())->SetIsVoid(PR_TRUE);
748
+ mValid = JS_TRUE;
749
+ return;
750
+ }
751
+
752
+ s = JS_ValueToString(cx, v);
753
+ if(!s)
754
+ {
755
+ mValid = JS_FALSE;
756
+ return;
757
+ }
758
+ *pval = STRING_TO_JSVAL(s); // Root the new string.
759
+ }
760
+
761
+ const char *bytes = JS_GetStringBytes(s);
762
+ size_t len = JS_GetStringLength(s);
763
+ new(mBuf) implementation_type(bytes, len);
764
+ mValid = JS_TRUE;
765
+ }
766
+
767
+ static nsresult
768
+ getNativeFromWrapper(XPCWrappedNative *wrapper,
769
+ const nsIID &iid,
770
+ void **ppThis,
771
+ nsISupports **pThisRef,
772
+ jsval *vp)
773
+ {
774
+ nsISupports *idobj = wrapper->GetIdentityObject();
775
+
776
+ // Try using the QITableEntry to avoid the extra AddRef and Release.
777
+ QITableEntry* entries = wrapper->GetOffsets();
778
+ if(entries)
779
+ {
780
+ for(QITableEntry* e = entries; e->iid; e++)
781
+ {
782
+ if(e->iid->Equals(iid))
783
+ {
784
+ *ppThis = (char*) idobj + e->offset - entries[0].offset;
785
+ *vp = OBJECT_TO_JSVAL(wrapper->GetFlatJSObject());
786
+ *pThisRef = nsnull;
787
+ return NS_OK;
788
+ }
789
+ }
790
+ }
791
+
792
+ nsresult rv = idobj->QueryInterface(iid, ppThis);
793
+ *pThisRef = static_cast<nsISupports*>(*ppThis);
794
+ if(NS_SUCCEEDED(rv))
795
+ *vp = OBJECT_TO_JSVAL(wrapper->GetFlatJSObject());
796
+ return rv;
797
+ }
798
+
799
+ JSBool
800
+ xpc_qsUnwrapThisImpl(JSContext *cx,
801
+ JSObject *obj,
802
+ const nsIID &iid,
803
+ void **ppThis,
804
+ nsISupports **pThisRef,
805
+ jsval *vp)
806
+ {
807
+ // From XPCWrappedNative::GetWrappedNativeOfJSObject.
808
+ //
809
+ // Usually IS_WRAPPER_CLASS is true the first time through the while loop,
810
+ // and the QueryInterface then succeeds.
811
+
812
+ NS_ASSERTION(obj, "this == null");
813
+
814
+ JSObject *cur = obj;
815
+ while(cur)
816
+ {
817
+ JSClass *clazz;
818
+ XPCWrappedNative *wrapper;
819
+ nsresult rv;
820
+
821
+ clazz = STOBJ_GET_CLASS(cur);
822
+ if(IS_WRAPPER_CLASS(clazz))
823
+ {
824
+ wrapper = (XPCWrappedNative*) xpc_GetJSPrivate(cur);
825
+ NS_ASSERTION(wrapper, "XPCWN wrapping nothing");
826
+ }
827
+ else if(clazz == &XPC_WN_Tearoff_JSClass)
828
+ {
829
+ wrapper = (XPCWrappedNative*) xpc_GetJSPrivate(STOBJ_GET_PARENT(cur));
830
+ NS_ASSERTION(wrapper, "XPCWN wrapping nothing");
831
+ }
832
+ else
833
+ {
834
+ JSObject *unsafeObj = XPCWrapper::Unwrap(cx, cur);
835
+ if(unsafeObj)
836
+ {
837
+ cur = unsafeObj;
838
+ continue;
839
+ }
840
+
841
+ // This goto is a bug, dutifully copied from
842
+ // XPCWrappedNative::GetWrappedNativeOfJSObject.
843
+ goto next;
844
+ }
845
+
846
+ rv = getNativeFromWrapper(wrapper, iid, ppThis, pThisRef, vp);
847
+ if(NS_SUCCEEDED(rv))
848
+ return JS_TRUE;
849
+ if(rv != NS_ERROR_NO_INTERFACE)
850
+ return xpc_qsThrow(cx, rv);
851
+
852
+ next:
853
+ cur = STOBJ_GET_PROTO(cur);
854
+ }
855
+
856
+ // If we didn't find a wrapper using the given obj, try again with obj's
857
+ // outer object, if it's got one.
858
+
859
+ JSClass *clazz = STOBJ_GET_CLASS(obj);
860
+
861
+ if((clazz->flags & JSCLASS_IS_EXTENDED) &&
862
+ ((JSExtendedClass*)clazz)->outerObject)
863
+ {
864
+ JSObject *outer = ((JSExtendedClass*)clazz)->outerObject(cx, obj);
865
+
866
+ // Protect against infinite recursion through XOWs.
867
+ JSObject *unsafeObj;
868
+ clazz = STOBJ_GET_CLASS(outer);
869
+ if(clazz == &sXPC_XOW_JSClass.base &&
870
+ (unsafeObj = XPCWrapper::Unwrap(cx, outer)))
871
+ {
872
+ outer = unsafeObj;
873
+ }
874
+
875
+ if(outer && outer != obj)
876
+ return xpc_qsUnwrapThisImpl(cx, outer, iid, ppThis, pThisRef, vp);
877
+ }
878
+
879
+ *pThisRef = nsnull;
880
+ return xpc_qsThrow(cx, NS_ERROR_XPC_BAD_OP_ON_WN_PROTO);
881
+ }
882
+
883
+ JSBool
884
+ xpc_qsUnwrapThisFromCcxImpl(XPCCallContext &ccx,
885
+ const nsIID &iid,
886
+ void **ppThis,
887
+ nsISupports **pThisRef,
888
+ jsval *vp)
889
+ {
890
+ XPCWrappedNative *wrapper = ccx.GetWrapper();
891
+ if(!wrapper)
892
+ return xpc_qsThrow(ccx.GetJSContext(), NS_ERROR_XPC_BAD_OP_ON_WN_PROTO);
893
+ if(!wrapper->IsValid())
894
+ return xpc_qsThrow(ccx.GetJSContext(), NS_ERROR_XPC_HAS_BEEN_SHUTDOWN);
895
+
896
+ nsresult rv = getNativeFromWrapper(wrapper, iid, ppThis, pThisRef, vp);
897
+ if(NS_FAILED(rv))
898
+ return xpc_qsThrow(ccx.GetJSContext(), rv);
899
+ return JS_TRUE;
900
+ }
901
+
902
+ nsresult
903
+ xpc_qsUnwrapArgImpl(JSContext *cx,
904
+ jsval v,
905
+ const nsIID &iid,
906
+ void **ppArg)
907
+ {
908
+ // From XPCConvert::JSData2Native
909
+ if(JSVAL_IS_VOID(v) || JSVAL_IS_NULL(v))
910
+ return NS_OK;
911
+
912
+ if(!JSVAL_IS_OBJECT(v))
913
+ {
914
+ return ((JSVAL_IS_INT(v) && JSVAL_TO_INT(v) == 0)
915
+ ? NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL
916
+ : NS_ERROR_XPC_BAD_CONVERT_JS);
917
+ }
918
+ JSObject *src = JSVAL_TO_OBJECT(v);
919
+
920
+ // From XPCConvert::JSObject2NativeInterface
921
+ XPCWrappedNative* wrappedNative =
922
+ XPCWrappedNative::GetWrappedNativeOfJSObject(cx, src);
923
+ nsISupports *iface;
924
+ if(wrappedNative)
925
+ {
926
+ iface = wrappedNative->GetIdentityObject();
927
+ if(NS_FAILED(iface->QueryInterface(iid, ppArg)))
928
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
929
+ return NS_OK;
930
+ }
931
+ // else...
932
+ // Slow path.
933
+
934
+ // XXX E4X breaks the world. Don't try wrapping E4X objects!
935
+ // This hack can be removed (or changed accordingly) when the
936
+ // DOM <-> E4X bindings are complete, see bug 270553
937
+ if(JS_TypeOfValue(cx, OBJECT_TO_JSVAL(src)) == JSTYPE_XML)
938
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
939
+
940
+ // Does the JSObject have 'nsISupportness'?
941
+ // XXX hmm, I wonder if this matters anymore with no
942
+ // oldstyle DOM objects around.
943
+ if(XPCConvert::GetISupportsFromJSObject(src, &iface))
944
+ {
945
+ if(!iface || NS_FAILED(iface->QueryInterface(iid, ppArg)))
946
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
947
+ return NS_OK;
948
+ }
949
+
950
+ // Create the ccx needed for quick stubs.
951
+ XPCCallContext ccx(JS_CALLER, cx);
952
+ if(!ccx.IsValid())
953
+ return NS_ERROR_XPC_BAD_CONVERT_JS;
954
+
955
+ nsXPCWrappedJS *wrapper;
956
+ nsresult rv =
957
+ nsXPCWrappedJS::GetNewOrUsed(ccx, src, iid, nsnull, &wrapper);
958
+ if(NS_FAILED(rv) || !wrapper)
959
+ return rv;
960
+
961
+ // We need to go through the QueryInterface logic to make this return
962
+ // the right thing for the various 'special' interfaces; e.g.
963
+ // nsIPropertyBag. We must use AggregatedQueryInterface in cases where
964
+ // there is an outer to avoid nasty recursion.
965
+ rv = wrapper->QueryInterface(iid, ppArg);
966
+ NS_RELEASE(wrapper);
967
+ return rv;
968
+ }
969
+
970
+ JSBool
971
+ xpc_qsJsvalToCharStr(JSContext *cx, jsval *pval, char **pstr)
972
+ {
973
+ jsval v = *pval;
974
+ JSString *str;
975
+
976
+ if(JSVAL_IS_STRING(v))
977
+ {
978
+ str = JSVAL_TO_STRING(v);
979
+ }
980
+ else if(JSVAL_IS_VOID(v) || JSVAL_IS_NULL(v))
981
+ {
982
+ *pstr = NULL;
983
+ return JS_TRUE;
984
+ }
985
+ else
986
+ {
987
+ if(!(str = JS_ValueToString(cx, v)))
988
+ return JS_FALSE;
989
+ *pval = STRING_TO_JSVAL(str); // Root the new string.
990
+ }
991
+
992
+ *pstr = JS_GetStringBytes(str);
993
+ return JS_TRUE;
994
+ }
995
+
996
+ JSBool
997
+ xpc_qsJsvalToWcharStr(JSContext *cx, jsval *pval, PRUnichar **pstr)
998
+ {
999
+ jsval v = *pval;
1000
+ JSString *str;
1001
+
1002
+ if(JSVAL_IS_STRING(v))
1003
+ {
1004
+ str = JSVAL_TO_STRING(v);
1005
+ }
1006
+ else if(JSVAL_IS_VOID(v) || JSVAL_IS_NULL(v))
1007
+ {
1008
+ *pstr = NULL;
1009
+ return JS_TRUE;
1010
+ }
1011
+ else
1012
+ {
1013
+ if(!(str = JS_ValueToString(cx, v)))
1014
+ return JS_FALSE;
1015
+ *pval = STRING_TO_JSVAL(str); // Root the new string.
1016
+ }
1017
+
1018
+ *pstr = JS_GetStringChars(str);
1019
+ return JS_TRUE;
1020
+ }
1021
+
1022
+ JSBool
1023
+ xpc_qsStringToJsval(JSContext *cx, const nsAString &str, jsval *rval)
1024
+ {
1025
+ // From the T_DOMSTRING case in XPCConvert::NativeData2JS.
1026
+ if(str.IsVoid())
1027
+ {
1028
+ *rval = JSVAL_NULL;
1029
+ return JS_TRUE;
1030
+ }
1031
+
1032
+ JSString *jsstr = XPCStringConvert::ReadableToJSString(cx, str);
1033
+ if(!jsstr)
1034
+ return JS_FALSE;
1035
+ *rval = STRING_TO_JSVAL(jsstr);
1036
+ return JS_TRUE;
1037
+ }
1038
+
1039
+ JSBool
1040
+ xpc_qsXPCOMObjectToJsval(XPCCallContext &ccx, nsISupports *p,
1041
+ nsWrapperCache *cache, XPCNativeInterface *iface,
1042
+ jsval *rval)
1043
+ {
1044
+ // From the T_INTERFACE case in XPCConvert::NativeData2JS.
1045
+ // This is one of the slowest things quick stubs do.
1046
+
1047
+ JSObject *scope = ccx.GetCurrentJSObject();
1048
+ NS_ASSERTION(scope, "bad ccx");
1049
+
1050
+ if(!iface)
1051
+ return xpc_qsThrow(ccx, NS_ERROR_XPC_BAD_CONVERT_NATIVE);
1052
+
1053
+ // XXX The OBJ_IS_NOT_GLOBAL here is not really right. In
1054
+ // fact, this code is depending on the fact that the
1055
+ // global object will not have been collected, and
1056
+ // therefore this NativeInterface2JSObject will not end up
1057
+ // creating a new XPCNativeScriptableShared.
1058
+ nsresult rv;
1059
+ if(!XPCConvert::NativeInterface2JSObject(ccx, rval, nsnull, p, nsnull,
1060
+ iface, cache, scope, PR_TRUE,
1061
+ OBJ_IS_NOT_GLOBAL, &rv))
1062
+ {
1063
+ // I can't tell if NativeInterface2JSObject throws JS exceptions
1064
+ // or not. This is a sloppy stab at the right semantics; the
1065
+ // method really ought to be fixed to behave consistently.
1066
+ if(!JS_IsExceptionPending(ccx))
1067
+ xpc_qsThrow(ccx, NS_FAILED(rv) ? rv : NS_ERROR_UNEXPECTED);
1068
+ return JS_FALSE;
1069
+ }
1070
+
1071
+ #ifdef DEBUG
1072
+ JSObject* jsobj = JSVAL_TO_OBJECT(*rval);
1073
+ if(jsobj && !STOBJ_GET_PARENT(jsobj))
1074
+ NS_ASSERTION(STOBJ_GET_CLASS(jsobj)->flags & JSCLASS_IS_GLOBAL,
1075
+ "Why did we recreate this wrapper?");
1076
+ #endif
1077
+
1078
+ return JS_TRUE;
1079
+ }
1080
+
1081
+ JSBool
1082
+ xpc_qsVariantToJsval(XPCCallContext &ccx,
1083
+ nsIVariant *p,
1084
+ uintN paramNum,
1085
+ jsval *rval)
1086
+ {
1087
+ // From the T_INTERFACE case in XPCConvert::NativeData2JS.
1088
+ // Error handling is in XPCWrappedNative::CallMethod.
1089
+ if(p)
1090
+ {
1091
+ nsresult rv;
1092
+ JSBool ok = XPCVariant::VariantDataToJS(ccx, p,
1093
+ ccx.GetCurrentJSObject(),
1094
+ &rv, rval);
1095
+ if (!ok)
1096
+ XPCThrower::ThrowBadParam(rv, 0, ccx);
1097
+ return ok;
1098
+ }
1099
+ *rval = JSVAL_NULL;
1100
+ return JS_TRUE;
1101
+ }
1102
+
1103
+ JSBool
1104
+ xpc_qsReadOnlySetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
1105
+ {
1106
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
1107
+ JSMSG_GETTER_ONLY, NULL);
1108
+ return JS_FALSE;
1109
+ }
1110
+
1111
+ #ifdef DEBUG
1112
+ void
1113
+ xpc_qsAssertContextOK(JSContext *cx)
1114
+ {
1115
+ XPCPerThreadData *thread = XPCPerThreadData::GetData(cx);
1116
+ XPCJSContextStack* stack = thread->GetJSContextStack();
1117
+
1118
+ JSContext* topJSContext = nsnull;
1119
+ nsresult rv = stack->Peek(&topJSContext);
1120
+ NS_ASSERTION(NS_SUCCEEDED(rv), "XPCJSContextStack::Peek failed");
1121
+
1122
+ // This is what we're actually trying to assert here.
1123
+ NS_ASSERTION(cx == topJSContext, "wrong context on XPCJSContextStack!");
1124
+
1125
+ NS_ASSERTION(XPCPerThreadData::IsMainThread(cx),
1126
+ "XPConnect quick stub called on non-main thread");
1127
+ }
1128
+ #endif