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,2015 @@
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 Communicator client code, released
17
+ * March 31, 1998.
18
+ *
19
+ * The Initial Developer of the Original Code is
20
+ * Netscape Communications Corporation.
21
+ * Portions created by the Initial Developer are Copyright (C) 1999
22
+ * the Initial Developer. All Rights Reserved.
23
+ *
24
+ * Contributor(s):
25
+ * John Bandhauer <jband@netscape.com> (original author)
26
+ * Pierre Phaneuf <pp@ludusdesign.com>
27
+ *
28
+ * Alternatively, the contents of this file may be used under the terms of
29
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
30
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
31
+ * in which case the provisions of the GPL or the LGPL are applicable instead
32
+ * of those above. If you wish to allow use of your version of this file only
33
+ * under the terms of either the GPL or the LGPL, and not to allow others to
34
+ * use your version of this file under the terms of the MPL, indicate your
35
+ * decision by deleting the provisions above and replace them with the notice
36
+ * and other provisions required by the GPL or the LGPL. If you do not delete
37
+ * the provisions above, a recipient may use your version of this file under
38
+ * the terms of any one of the MPL, the GPL or the LGPL.
39
+ *
40
+ * ***** END LICENSE BLOCK ***** */
41
+
42
+ /* Sharable code and data for wrapper around JSObjects. */
43
+
44
+ #include "xpcprivate.h"
45
+ #include "XPCWrapper.h"
46
+ #include "nsWrapperCache.h"
47
+
48
+ NS_IMPL_THREADSAFE_ISUPPORTS1(nsXPCWrappedJSClass, nsIXPCWrappedJSClass)
49
+
50
+ // the value of this variable is never used - we use its address as a sentinel
51
+ static uint32 zero_methods_descriptor;
52
+
53
+ void AutoScriptEvaluate::StartEvaluating(JSErrorReporter errorReporter)
54
+ {
55
+ NS_PRECONDITION(!mEvaluated, "AutoScriptEvaluate::Evaluate should only be called once");
56
+
57
+ if(!mJSContext)
58
+ return;
59
+ mEvaluated = PR_TRUE;
60
+ if(!mJSContext->errorReporter)
61
+ {
62
+ JS_SetErrorReporter(mJSContext, errorReporter);
63
+ mErrorReporterSet = PR_TRUE;
64
+ }
65
+ mContextHasThread = JS_GetContextThread(mJSContext);
66
+ if (mContextHasThread)
67
+ JS_BeginRequest(mJSContext);
68
+
69
+ // Saving the exception state keeps us from interfering with another script
70
+ // that may also be running on this context. This occurred first with the
71
+ // js debugger, as described in
72
+ // http://bugzilla.mozilla.org/show_bug.cgi?id=88130 but presumably could
73
+ // show up in any situation where a script calls into a wrapped js component
74
+ // on the same context, while the context has a nonzero exception state.
75
+ // Because JS_SaveExceptionState/JS_RestoreExceptionState use malloc
76
+ // and addroot, we avoid them if possible by returning null (as opposed to
77
+ // a JSExceptionState with no information) when there is no pending
78
+ // exception.
79
+ if(JS_IsExceptionPending(mJSContext))
80
+ {
81
+ mState = JS_SaveExceptionState(mJSContext);
82
+ JS_ClearPendingException(mJSContext);
83
+ }
84
+ }
85
+
86
+ AutoScriptEvaluate::~AutoScriptEvaluate()
87
+ {
88
+ if(!mJSContext || !mEvaluated)
89
+ return;
90
+ if(mState)
91
+ JS_RestoreExceptionState(mJSContext, mState);
92
+ else
93
+ JS_ClearPendingException(mJSContext);
94
+
95
+ if(mContextHasThread)
96
+ JS_EndRequest(mJSContext);
97
+
98
+ // If this is a JSContext that has a private context that provides a
99
+ // nsIXPCScriptNotify interface, then notify the object the script has
100
+ // been executed.
101
+ //
102
+ // Note: We rely on the rule that if any JSContext in our JSRuntime has
103
+ // private data that points to an nsISupports subclass, it has also set
104
+ // the JSOPTION_PRIVATE_IS_NSISUPPORTS option.
105
+
106
+ if (JS_GetOptions(mJSContext) & JSOPTION_PRIVATE_IS_NSISUPPORTS)
107
+ {
108
+ nsCOMPtr<nsIXPCScriptNotify> scriptNotify =
109
+ do_QueryInterface(static_cast<nsISupports*>
110
+ (JS_GetContextPrivate(mJSContext)));
111
+ if(scriptNotify)
112
+ scriptNotify->ScriptExecuted();
113
+ }
114
+
115
+ if(mErrorReporterSet)
116
+ JS_SetErrorReporter(mJSContext, NULL);
117
+ }
118
+
119
+ // It turns out that some errors may be not worth reporting. So, this
120
+ // function is factored out to manage that.
121
+ JSBool xpc_IsReportableErrorCode(nsresult code)
122
+ {
123
+ if (NS_SUCCEEDED(code))
124
+ return JS_FALSE;
125
+
126
+ switch(code)
127
+ {
128
+ // Error codes that we don't want to report as errors...
129
+ // These generally indicate bad interface design AFAIC.
130
+ case NS_ERROR_FACTORY_REGISTER_AGAIN:
131
+ case NS_BASE_STREAM_WOULD_BLOCK:
132
+ return JS_FALSE;
133
+ }
134
+
135
+ return JS_TRUE;
136
+ }
137
+
138
+ // static
139
+ nsresult
140
+ nsXPCWrappedJSClass::GetNewOrUsed(XPCCallContext& ccx, REFNSIID aIID,
141
+ nsXPCWrappedJSClass** resultClazz)
142
+ {
143
+ nsXPCWrappedJSClass* clazz = nsnull;
144
+ XPCJSRuntime* rt = ccx.GetRuntime();
145
+
146
+ { // scoped lock
147
+ XPCAutoLock lock(rt->GetMapLock());
148
+ IID2WrappedJSClassMap* map = rt->GetWrappedJSClassMap();
149
+ clazz = map->Find(aIID);
150
+ NS_IF_ADDREF(clazz);
151
+ }
152
+
153
+ if(!clazz)
154
+ {
155
+ nsCOMPtr<nsIInterfaceInfo> info;
156
+ ccx.GetXPConnect()->GetInfoForIID(&aIID, getter_AddRefs(info));
157
+ if(info)
158
+ {
159
+ PRBool canScript;
160
+ if(NS_SUCCEEDED(info->IsScriptable(&canScript)) && canScript &&
161
+ nsXPConnect::IsISupportsDescendant(info))
162
+ {
163
+ clazz = new nsXPCWrappedJSClass(ccx, aIID, info);
164
+ if(clazz && !clazz->mDescriptors)
165
+ NS_RELEASE(clazz); // sets clazz to nsnull
166
+ }
167
+ }
168
+ }
169
+ *resultClazz = clazz;
170
+ return NS_OK;
171
+ }
172
+
173
+ nsXPCWrappedJSClass::nsXPCWrappedJSClass(XPCCallContext& ccx, REFNSIID aIID,
174
+ nsIInterfaceInfo* aInfo)
175
+ : mRuntime(ccx.GetRuntime()),
176
+ mInfo(aInfo),
177
+ mName(nsnull),
178
+ mIID(aIID),
179
+ mDescriptors(nsnull)
180
+ {
181
+ NS_ADDREF(mInfo);
182
+ NS_ADDREF_THIS();
183
+
184
+ { // scoped lock
185
+ XPCAutoLock lock(mRuntime->GetMapLock());
186
+ mRuntime->GetWrappedJSClassMap()->Add(this);
187
+ }
188
+
189
+ uint16 methodCount;
190
+ if(NS_SUCCEEDED(mInfo->GetMethodCount(&methodCount)))
191
+ {
192
+ if(methodCount)
193
+ {
194
+ int wordCount = (methodCount/32)+1;
195
+ if(nsnull != (mDescriptors = new uint32[wordCount]))
196
+ {
197
+ int i;
198
+ // init flags to 0;
199
+ for(i = wordCount-1; i >= 0; i--)
200
+ mDescriptors[i] = 0;
201
+
202
+ for(i = 0; i < methodCount; i++)
203
+ {
204
+ const nsXPTMethodInfo* info;
205
+ if(NS_SUCCEEDED(mInfo->GetMethodInfo(i, &info)))
206
+ SetReflectable(i, XPCConvert::IsMethodReflectable(*info));
207
+ else
208
+ {
209
+ delete [] mDescriptors;
210
+ mDescriptors = nsnull;
211
+ break;
212
+ }
213
+ }
214
+ }
215
+ }
216
+ else
217
+ {
218
+ mDescriptors = &zero_methods_descriptor;
219
+ }
220
+ }
221
+ }
222
+
223
+ nsXPCWrappedJSClass::~nsXPCWrappedJSClass()
224
+ {
225
+ if(mDescriptors && mDescriptors != &zero_methods_descriptor)
226
+ delete [] mDescriptors;
227
+ if(mRuntime)
228
+ { // scoped lock
229
+ XPCAutoLock lock(mRuntime->GetMapLock());
230
+ mRuntime->GetWrappedJSClassMap()->Remove(this);
231
+ }
232
+ if(mName)
233
+ nsMemory::Free(mName);
234
+ NS_IF_RELEASE(mInfo);
235
+ }
236
+
237
+ JSObject*
238
+ nsXPCWrappedJSClass::CallQueryInterfaceOnJSObject(XPCCallContext& ccx,
239
+ JSObject* jsobj,
240
+ REFNSIID aIID)
241
+ {
242
+ JSContext* cx = ccx.GetJSContext();
243
+ JSObject* id;
244
+ jsval retval;
245
+ JSObject* retObj;
246
+ JSBool success = JS_FALSE;
247
+ jsid funid;
248
+ jsval fun;
249
+
250
+ // check upfront for the existence of the function property
251
+ funid = mRuntime->GetStringID(XPCJSRuntime::IDX_QUERY_INTERFACE);
252
+ if(!JS_GetPropertyById(cx, jsobj, funid, &fun) || JSVAL_IS_PRIMITIVE(fun))
253
+ return nsnull;
254
+
255
+ // protect fun so that we're sure it's alive when we call it
256
+ AUTO_MARK_JSVAL(ccx, fun);
257
+
258
+ // Ensure that we are asking for a scriptable interface.
259
+ // NB: It's important for security that this check is here rather
260
+ // than later, since it prevents untrusted objects from implementing
261
+ // some interfaces in JS and aggregating a trusted object to
262
+ // implement intentionally (for security) unscriptable interfaces.
263
+ // We so often ask for nsISupports that we can short-circuit the test...
264
+ if(!aIID.Equals(NS_GET_IID(nsISupports)))
265
+ {
266
+ nsCOMPtr<nsIInterfaceInfo> info;
267
+ ccx.GetXPConnect()->GetInfoForIID(&aIID, getter_AddRefs(info));
268
+ if(!info)
269
+ return nsnull;
270
+ PRBool canScript;
271
+ if(NS_FAILED(info->IsScriptable(&canScript)) || !canScript)
272
+ return nsnull;
273
+ }
274
+
275
+ // OK, it looks like we'll be calling into JS code.
276
+
277
+ AutoScriptEvaluate scriptEval(cx);
278
+
279
+ // XXX we should install an error reporter that will send reports to
280
+ // the JS error console service.
281
+ scriptEval.StartEvaluating();
282
+
283
+ id = xpc_NewIDObject(cx, jsobj, aIID);
284
+ if(id)
285
+ {
286
+ // Throwing NS_NOINTERFACE is the prescribed way to fail QI from JS. It
287
+ // is not an exception that is ever worth reporting, but we don't want
288
+ // to eat all exceptions either.
289
+
290
+ uint32 oldOpts =
291
+ JS_SetOptions(cx, JS_GetOptions(cx) | JSOPTION_DONT_REPORT_UNCAUGHT);
292
+
293
+ jsval args[1] = {OBJECT_TO_JSVAL(id)};
294
+ success = JS_CallFunctionValue(cx, jsobj, fun, 1, args, &retval);
295
+
296
+ JS_SetOptions(cx, oldOpts);
297
+
298
+ if(!success)
299
+ {
300
+ NS_ASSERTION(JS_IsExceptionPending(cx),
301
+ "JS failed without setting an exception!");
302
+
303
+ jsval jsexception = JSVAL_NULL;
304
+ AUTO_MARK_JSVAL(ccx, &jsexception);
305
+
306
+ if(JS_GetPendingException(cx, &jsexception))
307
+ {
308
+ nsresult rv;
309
+ if(JSVAL_IS_OBJECT(jsexception))
310
+ {
311
+ // XPConnect may have constructed an object to represent a
312
+ // C++ QI failure. See if that is the case.
313
+ nsCOMPtr<nsIXPConnectWrappedNative> wrapper;
314
+
315
+ nsXPConnect::GetXPConnect()->
316
+ GetWrappedNativeOfJSObject(ccx,
317
+ JSVAL_TO_OBJECT(jsexception),
318
+ getter_AddRefs(wrapper));
319
+
320
+ if(wrapper)
321
+ {
322
+ nsCOMPtr<nsIException> exception =
323
+ do_QueryWrappedNative(wrapper);
324
+ if(exception &&
325
+ NS_SUCCEEDED(exception->GetResult(&rv)) &&
326
+ rv == NS_NOINTERFACE)
327
+ {
328
+ JS_ClearPendingException(cx);
329
+ }
330
+ }
331
+ }
332
+ else if(JSVAL_IS_NUMBER(jsexception))
333
+ {
334
+ // JS often throws an nsresult.
335
+ if(JSVAL_IS_DOUBLE(jsexception))
336
+ rv = (nsresult)(*JSVAL_TO_DOUBLE(jsexception));
337
+ else
338
+ rv = (nsresult)(JSVAL_TO_INT(jsexception));
339
+
340
+ if(rv == NS_NOINTERFACE)
341
+ JS_ClearPendingException(cx);
342
+ }
343
+ }
344
+
345
+ // Don't report if reporting was disabled by someone else.
346
+ if(!(oldOpts & JSOPTION_DONT_REPORT_UNCAUGHT))
347
+ JS_ReportPendingException(cx);
348
+ }
349
+ }
350
+
351
+ if(success)
352
+ success = JS_ValueToObject(cx, retval, &retObj);
353
+
354
+ return success ? retObj : nsnull;
355
+ }
356
+
357
+ /***************************************************************************/
358
+
359
+ static JSBool
360
+ GetNamedPropertyAsVariantRaw(XPCCallContext& ccx,
361
+ JSObject* aJSObj,
362
+ jsid aName,
363
+ nsIVariant** aResult,
364
+ nsresult* pErr)
365
+ {
366
+ nsXPTType type = nsXPTType((uint8)(TD_INTERFACE_TYPE | XPT_TDP_POINTER));
367
+ jsval val;
368
+
369
+ return JS_GetPropertyById(ccx, aJSObj, aName, &val) &&
370
+ XPCConvert::JSData2Native(ccx, aResult, val, type, JS_FALSE,
371
+ &NS_GET_IID(nsIVariant), pErr);
372
+ }
373
+
374
+ // static
375
+ nsresult
376
+ nsXPCWrappedJSClass::GetNamedPropertyAsVariant(XPCCallContext& ccx,
377
+ JSObject* aJSObj,
378
+ jsval aName,
379
+ nsIVariant** aResult)
380
+ {
381
+ JSContext* cx = ccx.GetJSContext();
382
+ JSBool ok;
383
+ jsid id;
384
+ nsresult rv = NS_ERROR_FAILURE;
385
+
386
+ AutoScriptEvaluate scriptEval(cx);
387
+ scriptEval.StartEvaluating();
388
+
389
+ ok = JS_ValueToId(cx, aName, &id) &&
390
+ GetNamedPropertyAsVariantRaw(ccx, aJSObj, id, aResult, &rv);
391
+
392
+ return ok ? NS_OK : NS_FAILED(rv) ? rv : NS_ERROR_FAILURE;
393
+ }
394
+
395
+ /***************************************************************************/
396
+
397
+ // static
398
+ nsresult
399
+ nsXPCWrappedJSClass::BuildPropertyEnumerator(XPCCallContext& ccx,
400
+ JSObject* aJSObj,
401
+ nsISimpleEnumerator** aEnumerate)
402
+ {
403
+ JSContext* cx = ccx.GetJSContext();
404
+ nsresult retval = NS_ERROR_FAILURE;
405
+ JSIdArray* idArray = nsnull;
406
+ xpcPropertyBagEnumerator* enumerator = nsnull;
407
+ int i;
408
+
409
+ // Saved state must be restored, all exits through 'out'...
410
+ AutoScriptEvaluate scriptEval(cx);
411
+ scriptEval.StartEvaluating();
412
+
413
+ idArray = JS_Enumerate(cx, aJSObj);
414
+ if(!idArray)
415
+ goto out;
416
+
417
+ enumerator = new xpcPropertyBagEnumerator(idArray->length);
418
+ if(!enumerator)
419
+ goto out;
420
+ NS_ADDREF(enumerator);
421
+
422
+ for(i = 0; i < idArray->length; i++)
423
+ {
424
+ nsCOMPtr<nsIVariant> value;
425
+ jsid idName = idArray->vector[i];
426
+ nsresult rv;
427
+
428
+ if(!GetNamedPropertyAsVariantRaw(ccx, aJSObj, idName,
429
+ getter_AddRefs(value), &rv))
430
+ {
431
+ if(NS_FAILED(rv))
432
+ retval = rv;
433
+ goto out;
434
+ }
435
+
436
+ jsval jsvalName;
437
+ if(!JS_IdToValue(cx, idName, &jsvalName))
438
+ goto out;
439
+
440
+ JSString* name = JS_ValueToString(cx, jsvalName);
441
+ if(!name)
442
+ goto out;
443
+
444
+ nsCOMPtr<nsIProperty> property =
445
+ new xpcProperty((const PRUnichar*) JS_GetStringChars(name),
446
+ (PRUint32) JS_GetStringLength(name),
447
+ value);
448
+ if(!property)
449
+ goto out;
450
+
451
+ if(!enumerator->AppendElement(property))
452
+ goto out;
453
+ }
454
+
455
+ NS_ADDREF(*aEnumerate = enumerator);
456
+ retval = NS_OK;
457
+
458
+ out:
459
+ NS_IF_RELEASE(enumerator);
460
+ if(idArray)
461
+ JS_DestroyIdArray(cx, idArray);
462
+
463
+ return retval;
464
+ }
465
+
466
+ /***************************************************************************/
467
+
468
+ NS_IMPL_ISUPPORTS1(xpcProperty, nsIProperty)
469
+
470
+ xpcProperty::xpcProperty(const PRUnichar* aName, PRUint32 aNameLen,
471
+ nsIVariant* aValue)
472
+ : mName(aName, aNameLen), mValue(aValue)
473
+ {
474
+ }
475
+
476
+ /* readonly attribute AString name; */
477
+ NS_IMETHODIMP xpcProperty::GetName(nsAString & aName)
478
+ {
479
+ aName.Assign(mName);
480
+ return NS_OK;
481
+ }
482
+
483
+ /* readonly attribute nsIVariant value; */
484
+ NS_IMETHODIMP xpcProperty::GetValue(nsIVariant * *aValue)
485
+ {
486
+ NS_ADDREF(*aValue = mValue);
487
+ return NS_OK;
488
+ }
489
+
490
+ /***************************************************************************/
491
+
492
+ NS_IMPL_ISUPPORTS1(xpcPropertyBagEnumerator, nsISimpleEnumerator)
493
+
494
+ xpcPropertyBagEnumerator::xpcPropertyBagEnumerator(PRUint32 count)
495
+ : mIndex(0), mCount(0)
496
+ {
497
+ mArray.SizeTo(count);
498
+ }
499
+
500
+ JSBool xpcPropertyBagEnumerator::AppendElement(nsISupports* element)
501
+ {
502
+ if(!mArray.AppendElement(element))
503
+ return JS_FALSE;
504
+ mCount++;
505
+ return JS_TRUE;
506
+ }
507
+
508
+ /* boolean hasMoreElements (); */
509
+ NS_IMETHODIMP xpcPropertyBagEnumerator::HasMoreElements(PRBool *_retval)
510
+ {
511
+ *_retval = mIndex < mCount;
512
+ return NS_OK;
513
+ }
514
+
515
+ /* nsISupports getNext (); */
516
+ NS_IMETHODIMP xpcPropertyBagEnumerator::GetNext(nsISupports **_retval)
517
+ {
518
+ if(!(mIndex < mCount))
519
+ {
520
+ NS_ERROR("Bad nsISimpleEnumerator caller!");
521
+ return NS_ERROR_FAILURE;
522
+ }
523
+
524
+ *_retval = mArray.ElementAt(mIndex++);
525
+ return *_retval ? NS_OK : NS_ERROR_FAILURE;
526
+ }
527
+
528
+ /***************************************************************************/
529
+ // This 'WrappedJSIdentity' class and singleton allow us to figure out if
530
+ // any given nsISupports* is implemented by a WrappedJS object. This is done
531
+ // using a QueryInterface call on the interface pointer with our ID. If
532
+ // that call returns NS_OK and the pointer is to our singleton, then the
533
+ // interface must be implemented by a WrappedJS object. NOTE: the
534
+ // 'WrappedJSIdentity' object is not a real XPCOM object and should not be
535
+ // used for anything else (hence it is declared in this implementation file).
536
+
537
+ // {5C5C3BB0-A9BA-11d2-BA64-00805F8A5DD7}
538
+ #define NS_IXPCONNECT_WRAPPED_JS_IDENTITY_CLASS_IID \
539
+ { 0x5c5c3bb0, 0xa9ba, 0x11d2, \
540
+ { 0xba, 0x64, 0x0, 0x80, 0x5f, 0x8a, 0x5d, 0xd7 } }
541
+
542
+ class WrappedJSIdentity
543
+ {
544
+ // no instance methods...
545
+ public:
546
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_IXPCONNECT_WRAPPED_JS_IDENTITY_CLASS_IID)
547
+
548
+ static void* GetSingleton()
549
+ {
550
+ static WrappedJSIdentity* singleton = nsnull;
551
+ if(!singleton)
552
+ singleton = new WrappedJSIdentity();
553
+ return (void*) singleton;
554
+ }
555
+ };
556
+
557
+ NS_DEFINE_STATIC_IID_ACCESSOR(WrappedJSIdentity,
558
+ NS_IXPCONNECT_WRAPPED_JS_IDENTITY_CLASS_IID)
559
+
560
+ /***************************************************************************/
561
+
562
+ // static
563
+ JSBool
564
+ nsXPCWrappedJSClass::IsWrappedJS(nsISupports* aPtr)
565
+ {
566
+ void* result;
567
+ NS_PRECONDITION(aPtr, "null pointer");
568
+ return aPtr &&
569
+ NS_OK == aPtr->QueryInterface(NS_GET_IID(WrappedJSIdentity), &result) &&
570
+ result == WrappedJSIdentity::GetSingleton();
571
+ }
572
+
573
+ static JSContext *
574
+ GetContextFromObject(JSObject *obj)
575
+ {
576
+ // Don't stomp over a running context.
577
+ XPCJSContextStack* stack =
578
+ XPCPerThreadData::GetData(nsnull)->GetJSContextStack();
579
+ JSContext* topJSContext;
580
+
581
+ if(stack && NS_SUCCEEDED(stack->Peek(&topJSContext)) && topJSContext)
582
+ return nsnull;
583
+
584
+ // In order to get a context, we need a context.
585
+ XPCCallContext ccx(NATIVE_CALLER);
586
+ if(!ccx.IsValid())
587
+ return nsnull;
588
+ XPCWrappedNativeScope* scope =
589
+ XPCWrappedNativeScope::FindInJSObjectScope(ccx, obj);
590
+ XPCContext *xpcc = scope->GetContext();
591
+
592
+ if(xpcc)
593
+ {
594
+ JSContext *cx = xpcc->GetJSContext();
595
+ if(cx->thread->id == js_CurrentThreadId())
596
+ return cx;
597
+ }
598
+
599
+ return nsnull;
600
+ }
601
+
602
+ #ifndef XPCONNECT_STANDALONE
603
+ class SameOriginCheckedComponent : public nsISecurityCheckedComponent
604
+ {
605
+ public:
606
+ SameOriginCheckedComponent(nsXPCWrappedJS* delegate)
607
+ : mDelegate(delegate)
608
+ {}
609
+
610
+ NS_DECL_ISUPPORTS
611
+ NS_DECL_NSISECURITYCHECKEDCOMPONENT
612
+
613
+ private:
614
+ nsRefPtr<nsXPCWrappedJS> mDelegate;
615
+ };
616
+
617
+ NS_IMPL_ADDREF(SameOriginCheckedComponent)
618
+ NS_IMPL_RELEASE(SameOriginCheckedComponent)
619
+
620
+ NS_INTERFACE_MAP_BEGIN(SameOriginCheckedComponent)
621
+ NS_INTERFACE_MAP_ENTRY(nsISecurityCheckedComponent)
622
+ NS_INTERFACE_MAP_END_AGGREGATED(mDelegate)
623
+
624
+ NS_IMETHODIMP
625
+ SameOriginCheckedComponent::CanCreateWrapper(const nsIID * iid,
626
+ char **_retval NS_OUTPARAM)
627
+ {
628
+ // XXX This doesn't actually work because nsScriptSecurityManager doesn't
629
+ // know what to do with "sameOrigin" for canCreateWrapper.
630
+ *_retval = NS_strdup("sameOrigin");
631
+ return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
632
+ }
633
+
634
+ NS_IMETHODIMP
635
+ SameOriginCheckedComponent::CanCallMethod(const nsIID * iid,
636
+ const PRUnichar *methodName,
637
+ char **_retval NS_OUTPARAM)
638
+ {
639
+ *_retval = NS_strdup("sameOrigin");
640
+ return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
641
+ }
642
+
643
+ NS_IMETHODIMP
644
+ SameOriginCheckedComponent::CanGetProperty(const nsIID * iid,
645
+ const PRUnichar *propertyName,
646
+ char **_retval NS_OUTPARAM)
647
+ {
648
+ *_retval = NS_strdup("sameOrigin");
649
+ return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
650
+ }
651
+
652
+ NS_IMETHODIMP
653
+ SameOriginCheckedComponent::CanSetProperty(const nsIID * iid,
654
+ const PRUnichar *propertyName,
655
+ char **_retval NS_OUTPARAM)
656
+ {
657
+ *_retval = NS_strdup("sameOrigin");
658
+ return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
659
+ }
660
+
661
+ #endif
662
+
663
+ NS_IMETHODIMP
664
+ nsXPCWrappedJSClass::DelegatedQueryInterface(nsXPCWrappedJS* self,
665
+ REFNSIID aIID,
666
+ void** aInstancePtr)
667
+ {
668
+ if(aIID.Equals(NS_GET_IID(nsIXPConnectJSObjectHolder)))
669
+ {
670
+ NS_ADDREF(self);
671
+ *aInstancePtr = (void*) static_cast<nsIXPConnectJSObjectHolder*>(self);
672
+ return NS_OK;
673
+ }
674
+
675
+ // Objects internal to xpconnect are the only objects that even know *how*
676
+ // to ask for this iid. And none of them bother refcounting the thing.
677
+ if(aIID.Equals(NS_GET_IID(WrappedJSIdentity)))
678
+ {
679
+ // asking to find out if this is a wrapper object
680
+ *aInstancePtr = WrappedJSIdentity::GetSingleton();
681
+ return NS_OK;
682
+ }
683
+
684
+ #ifdef XPC_IDISPATCH_SUPPORT
685
+ // If IDispatch is enabled and we're QI'ing to IDispatch
686
+ if(nsXPConnect::IsIDispatchEnabled() && aIID.Equals(NSID_IDISPATCH))
687
+ {
688
+ return XPCIDispatchExtension::IDispatchQIWrappedJS(self, aInstancePtr);
689
+ }
690
+ #endif
691
+ if(aIID.Equals(NS_GET_IID(nsIPropertyBag)))
692
+ {
693
+ // We only want to expose one implementation from our aggregate.
694
+ nsXPCWrappedJS* root = self->GetRootWrapper();
695
+
696
+ if(!root->IsValid())
697
+ {
698
+ *aInstancePtr = nsnull;
699
+ return NS_NOINTERFACE;
700
+ }
701
+
702
+ NS_ADDREF(root);
703
+ *aInstancePtr = (void*) static_cast<nsIPropertyBag*>(root);
704
+ return NS_OK;
705
+ }
706
+
707
+ // We can't have a cached wrapper.
708
+ if(aIID.Equals(NS_GET_IID(nsWrapperCache)))
709
+ {
710
+ *aInstancePtr = nsnull;
711
+ return NS_NOINTERFACE;
712
+ }
713
+
714
+ JSContext *context = GetContextFromObject(self->GetJSObject());
715
+ XPCCallContext ccx(NATIVE_CALLER, context);
716
+ if(!ccx.IsValid())
717
+ {
718
+ *aInstancePtr = nsnull;
719
+ return NS_NOINTERFACE;
720
+ }
721
+
722
+ // We support nsISupportsWeakReference iff the root wrapped JSObject
723
+ // claims to support it in its QueryInterface implementation.
724
+ if(aIID.Equals(NS_GET_IID(nsISupportsWeakReference)))
725
+ {
726
+ // We only want to expose one implementation from our aggregate.
727
+ nsXPCWrappedJS* root = self->GetRootWrapper();
728
+
729
+ // Fail if JSObject doesn't claim support for nsISupportsWeakReference
730
+ if(!root->IsValid() ||
731
+ !CallQueryInterfaceOnJSObject(ccx, root->GetJSObject(), aIID))
732
+ {
733
+ *aInstancePtr = nsnull;
734
+ return NS_NOINTERFACE;
735
+ }
736
+
737
+ NS_ADDREF(root);
738
+ *aInstancePtr = (void*) static_cast<nsISupportsWeakReference*>(root);
739
+ return NS_OK;
740
+ }
741
+
742
+ nsXPCWrappedJS* sibling;
743
+
744
+ // Checks for any existing wrapper explicitly constructed for this iid.
745
+ // This includes the current 'self' wrapper. This also deals with the
746
+ // nsISupports case (for which it returns mRoot).
747
+ if(nsnull != (sibling = self->Find(aIID)))
748
+ {
749
+ NS_ADDREF(sibling);
750
+ *aInstancePtr = sibling->GetXPTCStub();
751
+ return NS_OK;
752
+ }
753
+
754
+ // Check if asking for an interface from which one of our wrappers inherits.
755
+ if(nsnull != (sibling = self->FindInherited(aIID)))
756
+ {
757
+ NS_ADDREF(sibling);
758
+ *aInstancePtr = sibling->GetXPTCStub();
759
+ return NS_OK;
760
+ }
761
+
762
+ // else we do the more expensive stuff...
763
+
764
+ #ifndef XPCONNECT_STANDALONE
765
+ // Before calling out, ensure that we're not about to claim to implement
766
+ // nsISecurityCheckedComponent for an untrusted object. Doing so causes
767
+ // problems. See bug 352882.
768
+ // But if this is a content object, then we might be wrapping it for
769
+ // content. If our JS object isn't a double-wrapped object (that is, we
770
+ // don't have XPCWrappedJS(XPCWrappedNative(some C++ object))), then it
771
+ // definitely will not have classinfo (and therefore won't be a DOM
772
+ // object). Since content wants to be able to use these objects (directly
773
+ // or indirectly, see bug 483672), we implement nsISecurityCheckedComponent
774
+ // for them and tell caps that they are also bound by the same origin
775
+ // model.
776
+
777
+ if(aIID.Equals(NS_GET_IID(nsISecurityCheckedComponent)))
778
+ {
779
+ // XXX This code checks to see if the given object has chrome (also
780
+ // known as system) principals. It really wants to do a
781
+ // UniversalXPConnect type check.
782
+
783
+ *aInstancePtr = nsnull;
784
+
785
+ if(!XPCPerThreadData::IsMainThread(ccx.GetJSContext()))
786
+ return NS_NOINTERFACE;
787
+
788
+ nsXPConnect *xpc = nsXPConnect::GetXPConnect();
789
+ nsCOMPtr<nsIScriptSecurityManager> secMan =
790
+ do_QueryInterface(xpc->GetDefaultSecurityManager());
791
+ if(!secMan)
792
+ return NS_NOINTERFACE;
793
+
794
+ JSObject *selfObj = self->GetJSObject();
795
+ nsCOMPtr<nsIPrincipal> objPrin;
796
+ nsresult rv = secMan->GetObjectPrincipal(ccx, selfObj,
797
+ getter_AddRefs(objPrin));
798
+ if(NS_FAILED(rv))
799
+ return rv;
800
+
801
+ PRBool isSystem;
802
+ rv = secMan->IsSystemPrincipal(objPrin, &isSystem);
803
+ if((NS_FAILED(rv) || !isSystem) &&
804
+ !IS_WRAPPER_CLASS(STOBJ_GET_CLASS(selfObj)))
805
+ {
806
+ // A content object.
807
+ nsRefPtr<SameOriginCheckedComponent> checked =
808
+ new SameOriginCheckedComponent(self);
809
+ if(!checked)
810
+ return NS_ERROR_OUT_OF_MEMORY;
811
+ *aInstancePtr = checked.forget().get();
812
+ return NS_OK;
813
+ }
814
+ }
815
+ #endif
816
+
817
+ // check if the JSObject claims to implement this interface
818
+ JSObject* jsobj = CallQueryInterfaceOnJSObject(ccx, self->GetJSObject(),
819
+ aIID);
820
+ if(jsobj)
821
+ {
822
+ // protect jsobj until it is actually attached
823
+ AUTO_MARK_JSVAL(ccx, OBJECT_TO_JSVAL(jsobj));
824
+
825
+ // We can't use XPConvert::JSObject2NativeInterface() here
826
+ // since that can find a XPCWrappedNative directly on the
827
+ // proto chain, and we don't want that here. We need to find
828
+ // the actual JS object that claimed it supports the interface
829
+ // we're looking for or we'll potentially bypass security
830
+ // checks etc by calling directly through to a native found on
831
+ // the prototype chain.
832
+ //
833
+ // Instead, simply do the nsXPCWrappedJS part of
834
+ // XPConvert::JSObject2NativeInterface() here to make sure we
835
+ // get a new (or used) nsXPCWrappedJS.
836
+ nsXPCWrappedJS* wrapper;
837
+ nsresult rv = nsXPCWrappedJS::GetNewOrUsed(ccx, jsobj, aIID, nsnull,
838
+ &wrapper);
839
+ if(NS_SUCCEEDED(rv) && wrapper)
840
+ {
841
+ // We need to go through the QueryInterface logic to make
842
+ // this return the right thing for the various 'special'
843
+ // interfaces; e.g. nsIPropertyBag.
844
+ rv = wrapper->QueryInterface(aIID, aInstancePtr);
845
+ NS_RELEASE(wrapper);
846
+ return rv;
847
+ }
848
+ }
849
+
850
+ // else...
851
+ // no can do
852
+ *aInstancePtr = nsnull;
853
+ return NS_NOINTERFACE;
854
+ }
855
+
856
+ JSObject*
857
+ nsXPCWrappedJSClass::GetRootJSObject(XPCCallContext& ccx, JSObject* aJSObj)
858
+ {
859
+ JSObject* result = CallQueryInterfaceOnJSObject(ccx, aJSObj,
860
+ NS_GET_IID(nsISupports));
861
+ if(!result)
862
+ return aJSObj;
863
+ JSObject* inner = XPCWrapper::Unwrap(ccx, result);
864
+ if (inner)
865
+ return inner;
866
+ return result;
867
+ }
868
+
869
+ void
870
+ xpcWrappedJSErrorReporter(JSContext *cx, const char *message,
871
+ JSErrorReport *report)
872
+ {
873
+ if(report)
874
+ {
875
+ // If it is an exception report, then we can just deal with the
876
+ // exception later (if not caught in the JS code).
877
+ if(JSREPORT_IS_EXCEPTION(report->flags))
878
+ {
879
+ // XXX We have a problem with error reports from uncaught exceptions.
880
+ //
881
+ // http://bugzilla.mozilla.org/show_bug.cgi?id=66453
882
+ //
883
+ // The issue is...
884
+ //
885
+ // We can't assume that the exception will *stay* uncaught. So, if
886
+ // we build an nsIXPCException here and the underlying exception
887
+ // really is caught before our script is done running then we blow
888
+ // it by returning failure to our caller when the script didn't
889
+ // really fail. However, This report contains error location info
890
+ // that is no longer available after the script is done. So, if the
891
+ // exception really is not caught (and is a non-engine exception)
892
+ // then we've lost the oportunity to capture the script location
893
+ // info that we *could* have captured here.
894
+ //
895
+ // This is expecially an issue with nested evaluations.
896
+ //
897
+ // Perhaps we could capture an expception here and store it as
898
+ // 'provisional' and then later if there is a pending exception
899
+ // when the script is done then we could maybe compare that in some
900
+ // way with the 'provisional' one in which we captured location info.
901
+ // We would not want to assume that the one discovered here is the
902
+ // same one that is later detected. This could cause us to lie.
903
+ //
904
+ // The thing is. we do not currently store the right stuff to compare
905
+ // these two nsIXPCExceptions (triggered by the same exception jsval
906
+ // in the engine). Maybe we should store the jsval and compare that?
907
+ // Maybe without even rooting it since we will not dereference it.
908
+ // This is inexact, but maybe the right thing to do?
909
+ //
910
+ // if(report->errorNumber == JSMSG_UNCAUGHT_EXCEPTION)) ...
911
+ //
912
+
913
+ return;
914
+ }
915
+
916
+ if(JSREPORT_IS_WARNING(report->flags))
917
+ {
918
+ // XXX printf the warning (#ifdef DEBUG only!).
919
+ // XXX send the warning to the console service.
920
+ return;
921
+ }
922
+ }
923
+
924
+ XPCCallContext ccx(NATIVE_CALLER, cx);
925
+ if(!ccx.IsValid())
926
+ return;
927
+
928
+ nsCOMPtr<nsIException> e;
929
+ XPCConvert::JSErrorToXPCException(ccx, message, nsnull, nsnull, report,
930
+ getter_AddRefs(e));
931
+ if(e)
932
+ ccx.GetXPCContext()->SetException(e);
933
+ }
934
+
935
+ JSBool
936
+ nsXPCWrappedJSClass::GetArraySizeFromParam(JSContext* cx,
937
+ const XPTMethodDescriptor* method,
938
+ const nsXPTParamInfo& param,
939
+ uint16 methodIndex,
940
+ uint8 paramIndex,
941
+ SizeMode mode,
942
+ nsXPTCMiniVariant* nativeParams,
943
+ JSUint32* result)
944
+ {
945
+ uint8 argnum;
946
+ nsresult rv;
947
+
948
+ if(mode == GET_SIZE)
949
+ rv = mInfo->GetSizeIsArgNumberForParam(methodIndex, &param, 0, &argnum);
950
+ else
951
+ rv = mInfo->GetLengthIsArgNumberForParam(methodIndex, &param, 0, &argnum);
952
+ if(NS_FAILED(rv))
953
+ return JS_FALSE;
954
+
955
+ const nsXPTParamInfo& arg_param = method->params[argnum];
956
+ const nsXPTType& arg_type = arg_param.GetType();
957
+
958
+ // The xpidl compiler ensures this. We reaffirm it for safety.
959
+ if(arg_type.IsPointer() || arg_type.TagPart() != nsXPTType::T_U32)
960
+ return JS_FALSE;
961
+
962
+ if(arg_param.IsOut())
963
+ *result = *(JSUint32*)nativeParams[argnum].val.p;
964
+ else
965
+ *result = nativeParams[argnum].val.u32;
966
+
967
+ return JS_TRUE;
968
+ }
969
+
970
+ JSBool
971
+ nsXPCWrappedJSClass::GetInterfaceTypeFromParam(JSContext* cx,
972
+ const XPTMethodDescriptor* method,
973
+ const nsXPTParamInfo& param,
974
+ uint16 methodIndex,
975
+ const nsXPTType& type,
976
+ nsXPTCMiniVariant* nativeParams,
977
+ nsID* result)
978
+ {
979
+ uint8 type_tag = type.TagPart();
980
+
981
+ if(type_tag == nsXPTType::T_INTERFACE)
982
+ {
983
+ if(NS_SUCCEEDED(GetInterfaceInfo()->
984
+ GetIIDForParamNoAlloc(methodIndex, &param, result)))
985
+ {
986
+ return JS_TRUE;
987
+ }
988
+ }
989
+ else if(type_tag == nsXPTType::T_INTERFACE_IS)
990
+ {
991
+ uint8 argnum;
992
+ nsresult rv;
993
+ rv = mInfo->GetInterfaceIsArgNumberForParam(methodIndex,
994
+ &param, &argnum);
995
+ if(NS_FAILED(rv))
996
+ return JS_FALSE;
997
+
998
+ const nsXPTParamInfo& arg_param = method->params[argnum];
999
+ const nsXPTType& arg_type = arg_param.GetType();
1000
+ if(arg_type.IsPointer() &&
1001
+ arg_type.TagPart() == nsXPTType::T_IID)
1002
+ {
1003
+ if(arg_param.IsOut())
1004
+ {
1005
+ nsID** p = (nsID**) nativeParams[argnum].val.p;
1006
+ if(!p || !*p)
1007
+ return JS_FALSE;
1008
+ *result = **p;
1009
+ }
1010
+ else
1011
+ {
1012
+ nsID* p = (nsID*) nativeParams[argnum].val.p;
1013
+ if(!p)
1014
+ return JS_FALSE;
1015
+ *result = *p;
1016
+ }
1017
+ return JS_TRUE;
1018
+ }
1019
+ }
1020
+ return JS_FALSE;
1021
+ }
1022
+
1023
+ void
1024
+ nsXPCWrappedJSClass::CleanupPointerArray(const nsXPTType& datum_type,
1025
+ JSUint32 array_count,
1026
+ void** arrayp)
1027
+ {
1028
+ if(datum_type.IsInterfacePointer())
1029
+ {
1030
+ nsISupports** pp = (nsISupports**) arrayp;
1031
+ for(JSUint32 k = 0; k < array_count; k++)
1032
+ {
1033
+ nsISupports* p = pp[k];
1034
+ NS_IF_RELEASE(p);
1035
+ }
1036
+ }
1037
+ else
1038
+ {
1039
+ void** pp = (void**) arrayp;
1040
+ for(JSUint32 k = 0; k < array_count; k++)
1041
+ {
1042
+ void* p = pp[k];
1043
+ if(p) nsMemory::Free(p);
1044
+ }
1045
+ }
1046
+ }
1047
+
1048
+ void
1049
+ nsXPCWrappedJSClass::CleanupPointerTypeObject(const nsXPTType& type,
1050
+ void** pp)
1051
+ {
1052
+ NS_ASSERTION(pp,"null pointer");
1053
+ if(type.IsInterfacePointer())
1054
+ {
1055
+ nsISupports* p = *((nsISupports**)pp);
1056
+ if(p) p->Release();
1057
+ }
1058
+ else
1059
+ {
1060
+ void* p = *((void**)pp);
1061
+ if(p) nsMemory::Free(p);
1062
+ }
1063
+ }
1064
+
1065
+ class AutoClearPendingException
1066
+ {
1067
+ public:
1068
+ AutoClearPendingException(JSContext *cx) : mCx(cx) { }
1069
+ ~AutoClearPendingException() { JS_ClearPendingException(mCx); }
1070
+ private:
1071
+ JSContext* mCx;
1072
+ };
1073
+
1074
+ nsresult
1075
+ nsXPCWrappedJSClass::CheckForException(XPCCallContext & ccx,
1076
+ const char * aPropertyName,
1077
+ const char * anInterfaceName,
1078
+ PRBool aForceReport)
1079
+ {
1080
+ XPCContext * xpcc = ccx.GetXPCContext();
1081
+ JSContext * cx = ccx.GetJSContext();
1082
+ nsCOMPtr<nsIException> xpc_exception;
1083
+ /* this one would be set by our error reporter */
1084
+
1085
+ xpcc->GetException(getter_AddRefs(xpc_exception));
1086
+ if(xpc_exception)
1087
+ xpcc->SetException(nsnull);
1088
+
1089
+ // get this right away in case we do something below to cause JS code
1090
+ // to run on this JSContext
1091
+ nsresult pending_result = xpcc->GetPendingResult();
1092
+
1093
+ jsval js_exception;
1094
+ JSBool is_js_exception = JS_GetPendingException(cx, &js_exception);
1095
+
1096
+ /* JS might throw an expection whether the reporter was called or not */
1097
+ if(is_js_exception)
1098
+ {
1099
+ if(!xpc_exception)
1100
+ XPCConvert::JSValToXPCException(ccx, js_exception, anInterfaceName,
1101
+ aPropertyName,
1102
+ getter_AddRefs(xpc_exception));
1103
+
1104
+ /* cleanup and set failed even if we can't build an exception */
1105
+ if(!xpc_exception)
1106
+ {
1107
+ ccx.GetThreadData()->SetException(nsnull); // XXX necessary?
1108
+ }
1109
+ }
1110
+
1111
+ AutoClearPendingException acpe(cx);
1112
+
1113
+ if(xpc_exception)
1114
+ {
1115
+ nsresult e_result;
1116
+ if(NS_SUCCEEDED(xpc_exception->GetResult(&e_result)))
1117
+ {
1118
+ // Figure out whether or not we should report this exception.
1119
+ PRBool reportable = xpc_IsReportableErrorCode(e_result);
1120
+ if(reportable)
1121
+ {
1122
+ // Always want to report forced exceptions and XPConnect's own
1123
+ // errors.
1124
+ reportable = aForceReport ||
1125
+ NS_ERROR_GET_MODULE(e_result) == NS_ERROR_MODULE_XPCONNECT;
1126
+
1127
+ // See if an environment variable was set or someone has told us
1128
+ // that a user pref was set indicating that we should report all
1129
+ // exceptions.
1130
+ if(!reportable)
1131
+ reportable = nsXPConnect::ReportAllJSExceptions();
1132
+
1133
+ // Finally, check to see if this is the last JS frame on the
1134
+ // stack. If so then we always want to report it.
1135
+ if(!reportable)
1136
+ {
1137
+ PRBool onlyNativeStackFrames = PR_TRUE;
1138
+ JSStackFrame * fp = nsnull;
1139
+ while((fp = JS_FrameIterator(cx, &fp)))
1140
+ {
1141
+ if(!JS_IsNativeFrame(cx, fp))
1142
+ {
1143
+ onlyNativeStackFrames = PR_FALSE;
1144
+ break;
1145
+ }
1146
+ }
1147
+ reportable = onlyNativeStackFrames;
1148
+ }
1149
+
1150
+ // Ugly special case for GetInterface. It's "special" in the
1151
+ // same way as QueryInterface in that a failure is not
1152
+ // exceptional and shouldn't be reported. We have to do this
1153
+ // check here instead of in xpcwrappedjs (like we do for QI) to
1154
+ // avoid adding extra code to all xpcwrappedjs objects.
1155
+ if(reportable && e_result == NS_ERROR_NO_INTERFACE &&
1156
+ !strcmp(anInterfaceName, "nsIInterfaceRequestor") &&
1157
+ !strcmp(aPropertyName, "getInterface"))
1158
+ {
1159
+ reportable = PR_FALSE;
1160
+ }
1161
+ }
1162
+
1163
+ // Try to use the error reporter set on the context to handle this
1164
+ // error if it came from a JS exception.
1165
+ if(reportable && is_js_exception &&
1166
+ cx->errorReporter != xpcWrappedJSErrorReporter)
1167
+ {
1168
+ reportable = !JS_ReportPendingException(cx);
1169
+ }
1170
+
1171
+ if(reportable)
1172
+ {
1173
+ #ifdef DEBUG
1174
+ static const char line[] =
1175
+ "************************************************************\n";
1176
+ static const char preamble[] =
1177
+ "* Call to xpconnect wrapped JSObject produced this error: *\n";
1178
+ static const char cant_get_text[] =
1179
+ "FAILED TO GET TEXT FROM EXCEPTION\n";
1180
+
1181
+ fputs(line, stdout);
1182
+ fputs(preamble, stdout);
1183
+ char* text;
1184
+ if(NS_SUCCEEDED(xpc_exception->ToString(&text)) && text)
1185
+ {
1186
+ fputs(text, stdout);
1187
+ fputs("\n", stdout);
1188
+ nsMemory::Free(text);
1189
+ }
1190
+ else
1191
+ fputs(cant_get_text, stdout);
1192
+ fputs(line, stdout);
1193
+ #endif
1194
+
1195
+ // Log the exception to the JS Console, so that users can do
1196
+ // something with it.
1197
+ nsCOMPtr<nsIConsoleService> consoleService
1198
+ (do_GetService(XPC_CONSOLE_CONTRACTID));
1199
+ if(nsnull != consoleService)
1200
+ {
1201
+ nsresult rv;
1202
+ nsCOMPtr<nsIScriptError> scriptError;
1203
+ nsCOMPtr<nsISupports> errorData;
1204
+ rv = xpc_exception->GetData(getter_AddRefs(errorData));
1205
+ if(NS_SUCCEEDED(rv))
1206
+ scriptError = do_QueryInterface(errorData);
1207
+
1208
+ if(nsnull == scriptError)
1209
+ {
1210
+ // No luck getting one from the exception, so
1211
+ // try to cook one up.
1212
+ scriptError = do_CreateInstance(XPC_SCRIPT_ERROR_CONTRACTID);
1213
+ if(nsnull != scriptError)
1214
+ {
1215
+ char* exn_string;
1216
+ rv = xpc_exception->ToString(&exn_string);
1217
+ if(NS_SUCCEEDED(rv))
1218
+ {
1219
+ // use toString on the exception as the message
1220
+ nsAutoString newMessage;
1221
+ newMessage.AssignWithConversion(exn_string);
1222
+ nsMemory::Free((void *) exn_string);
1223
+
1224
+ // try to get filename, lineno from the first
1225
+ // stack frame location.
1226
+ PRInt32 lineNumber = 0;
1227
+ nsXPIDLCString sourceName;
1228
+
1229
+ nsCOMPtr<nsIStackFrame> location;
1230
+ xpc_exception->
1231
+ GetLocation(getter_AddRefs(location));
1232
+ if(location)
1233
+ {
1234
+ // Get line number w/o checking; 0 is ok.
1235
+ location->GetLineNumber(&lineNumber);
1236
+
1237
+ // get a filename.
1238
+ rv = location->GetFilename(getter_Copies(sourceName));
1239
+ }
1240
+
1241
+ rv = scriptError->Init(newMessage.get(),
1242
+ NS_ConvertASCIItoUTF16(sourceName).get(),
1243
+ nsnull,
1244
+ lineNumber, 0, 0,
1245
+ "XPConnect JavaScript");
1246
+ if(NS_FAILED(rv))
1247
+ scriptError = nsnull;
1248
+ }
1249
+ }
1250
+ }
1251
+ if(nsnull != scriptError)
1252
+ consoleService->LogMessage(scriptError);
1253
+ }
1254
+ }
1255
+ // Whether or not it passes the 'reportable' test, it might
1256
+ // still be an error and we have to do the right thing here...
1257
+ if(NS_FAILED(e_result))
1258
+ {
1259
+ ccx.GetThreadData()->SetException(xpc_exception);
1260
+ return e_result;
1261
+ }
1262
+ }
1263
+ }
1264
+ else
1265
+ {
1266
+ // see if JS code signaled failure result without throwing exception
1267
+ if(NS_FAILED(pending_result))
1268
+ {
1269
+ return pending_result;
1270
+ }
1271
+ }
1272
+ return NS_ERROR_FAILURE;
1273
+ }
1274
+
1275
+ NS_IMETHODIMP
1276
+ nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS* wrapper, uint16 methodIndex,
1277
+ const XPTMethodDescriptor* info,
1278
+ nsXPTCMiniVariant* nativeParams)
1279
+ {
1280
+ jsval* stackbase = nsnull;
1281
+ jsval* sp = nsnull;
1282
+ uint8 i;
1283
+ uint8 argc=0;
1284
+ uint8 stack_size;
1285
+ jsval result;
1286
+ uint8 paramCount=0;
1287
+ nsresult retval = NS_ERROR_FAILURE;
1288
+ nsresult pending_result = NS_OK;
1289
+ JSBool success;
1290
+ JSBool readyToDoTheCall = JS_FALSE;
1291
+ nsID param_iid;
1292
+ uint8 outConversionFailedIndex;
1293
+ JSObject* obj;
1294
+ const char* name = info->name;
1295
+ jsval fval;
1296
+ void* mark;
1297
+ JSBool foundDependentParam;
1298
+ XPCContext* xpcc;
1299
+ JSContext* cx;
1300
+ JSObject* thisObj;
1301
+
1302
+ // Make sure not to set the callee on ccx until after we've gone through
1303
+ // the whole nsIXPCFunctionThisTranslator bit. That code uses ccx to
1304
+ // convert natives to JSObjects, but we do NOT plan to pass those JSObjects
1305
+ // to our real callee.
1306
+ JSContext *context = GetContextFromObject(wrapper->GetJSObject());
1307
+ XPCCallContext ccx(NATIVE_CALLER, context);
1308
+ if(ccx.IsValid())
1309
+ {
1310
+ xpcc = ccx.GetXPCContext();
1311
+ cx = ccx.GetJSContext();
1312
+ }
1313
+ else
1314
+ {
1315
+ xpcc = nsnull;
1316
+ cx = nsnull;
1317
+ }
1318
+
1319
+ AutoScriptEvaluate scriptEval(cx);
1320
+ #ifdef DEBUG_stats_jband
1321
+ PRIntervalTime startTime = PR_IntervalNow();
1322
+ PRIntervalTime endTime = 0;
1323
+ static int totalTime = 0;
1324
+
1325
+
1326
+ static int count = 0;
1327
+ static const int interval = 10;
1328
+ if(0 == (++count % interval))
1329
+ printf("<<<<<<<< %d calls on nsXPCWrappedJSs made. (%d)\n", count, PR_IntervalToMilliseconds(totalTime));
1330
+ #endif
1331
+
1332
+ obj = thisObj = wrapper->GetJSObject();
1333
+
1334
+ // XXX ASSUMES that retval is last arg. The xpidl compiler ensures this.
1335
+ paramCount = info->num_args;
1336
+ argc = paramCount -
1337
+ (paramCount && XPT_PD_IS_RETVAL(info->params[paramCount-1].flags) ? 1 : 0);
1338
+
1339
+ if(!cx || !xpcc || !IsReflectable(methodIndex))
1340
+ goto pre_call_clean_up;
1341
+
1342
+ scriptEval.StartEvaluating(xpcWrappedJSErrorReporter);
1343
+
1344
+ xpcc->SetPendingResult(pending_result);
1345
+ xpcc->SetException(nsnull);
1346
+ ccx.GetThreadData()->SetException(nsnull);
1347
+
1348
+ // We use js_AllocStack, js_Invoke, and js_FreeStack so that the gcthings
1349
+ // we use as args will be rooted by the engine as we do conversions and
1350
+ // prepare to do the function call. This adds a fair amount of complexity,
1351
+ // but is a good optimization compared to calling JS_AddRoot for each item.
1352
+
1353
+ js_LeaveTrace(cx);
1354
+
1355
+ // setup stack
1356
+
1357
+ // if this isn't a function call then we don't need to push extra stuff
1358
+ if(XPT_MD_IS_GETTER(info->flags) || XPT_MD_IS_SETTER(info->flags))
1359
+ {
1360
+ stack_size = argc;
1361
+ }
1362
+ else
1363
+ {
1364
+ // allocate extra space for function and 'this'
1365
+ stack_size = argc + 2;
1366
+
1367
+ // We get fval before allocating the stack to avoid gc badness that can
1368
+ // happen if the GetProperty call leaves our request and the gc runs
1369
+ // while the stack we allocate contains garbage.
1370
+
1371
+ // If the interface is marked as a [function] then we will assume that
1372
+ // our JSObject is a function and not an object with a named method.
1373
+
1374
+ PRBool isFunction;
1375
+ if(NS_FAILED(mInfo->IsFunction(&isFunction)))
1376
+ goto pre_call_clean_up;
1377
+
1378
+ // In the xpidl [function] case we are making sure now that the
1379
+ // JSObject is callable. If it is *not* callable then we silently
1380
+ // fallback to looking up the named property...
1381
+ // (because jst says he thinks this fallback is 'The Right Thing'.)
1382
+ //
1383
+ // In the normal (non-function) case we just lookup the property by
1384
+ // name and as long as the object has such a named property we go ahead
1385
+ // and try to make the call. If it turns out the named property is not
1386
+ // a callable object then the JS engine will throw an error and we'll
1387
+ // pass this along to the caller as an exception/result code.
1388
+
1389
+ if(isFunction &&
1390
+ JS_TypeOfValue(ccx, OBJECT_TO_JSVAL(obj)) == JSTYPE_FUNCTION)
1391
+ {
1392
+ fval = OBJECT_TO_JSVAL(obj);
1393
+
1394
+ // We may need to translate the 'this' for the function object.
1395
+
1396
+ if(paramCount)
1397
+ {
1398
+ const nsXPTParamInfo& firstParam = info->params[0];
1399
+ if(firstParam.IsIn())
1400
+ {
1401
+ const nsXPTType& firstType = firstParam.GetType();
1402
+ if(firstType.IsPointer() && firstType.IsInterfacePointer())
1403
+ {
1404
+ nsIXPCFunctionThisTranslator* translator;
1405
+
1406
+ IID2ThisTranslatorMap* map =
1407
+ mRuntime->GetThisTranslatorMap();
1408
+
1409
+ {
1410
+ XPCAutoLock lock(mRuntime->GetMapLock()); // scoped lock
1411
+ translator = map->Find(mIID);
1412
+ }
1413
+
1414
+ if(translator)
1415
+ {
1416
+ PRBool hideFirstParamFromJS = PR_FALSE;
1417
+ nsIID* newWrapperIID = nsnull;
1418
+ nsCOMPtr<nsISupports> newThis;
1419
+
1420
+ if(NS_FAILED(translator->
1421
+ TranslateThis((nsISupports*)nativeParams[0].val.p,
1422
+ mInfo, methodIndex,
1423
+ &hideFirstParamFromJS,
1424
+ &newWrapperIID,
1425
+ getter_AddRefs(newThis))))
1426
+ {
1427
+ goto pre_call_clean_up;
1428
+ }
1429
+ if(hideFirstParamFromJS)
1430
+ {
1431
+ NS_ERROR("HideFirstParamFromJS not supported");
1432
+ goto pre_call_clean_up;
1433
+ }
1434
+ if(newThis)
1435
+ {
1436
+ jsval v;
1437
+ JSBool ok =
1438
+ XPCConvert::NativeInterface2JSObject(ccx,
1439
+ &v, nsnull, newThis, newWrapperIID,
1440
+ nsnull, nsnull, obj, PR_FALSE, PR_FALSE,
1441
+ nsnull);
1442
+ if(newWrapperIID)
1443
+ nsMemory::Free(newWrapperIID);
1444
+ if(!ok)
1445
+ {
1446
+ goto pre_call_clean_up;
1447
+ }
1448
+ thisObj = JSVAL_TO_OBJECT(v);
1449
+ }
1450
+ }
1451
+ }
1452
+ }
1453
+ }
1454
+ }
1455
+ else if(!JS_GetMethod(cx, obj, name, &thisObj, &fval))
1456
+ {
1457
+ // XXX We really want to factor out the error reporting better and
1458
+ // specifically report the failure to find a function with this name.
1459
+ // This is what we do below if the property is found but is not a
1460
+ // function. We just need to factor better so we can get to that
1461
+ // reporting path from here.
1462
+ goto pre_call_clean_up;
1463
+ }
1464
+ }
1465
+
1466
+ // if stack_size is zero then we won't be needing a stack
1467
+ if(stack_size && !(stackbase = sp = js_AllocStack(cx, stack_size, &mark)))
1468
+ {
1469
+ retval = NS_ERROR_OUT_OF_MEMORY;
1470
+ goto pre_call_clean_up;
1471
+ }
1472
+
1473
+ NS_ASSERTION(XPT_MD_IS_GETTER(info->flags) || sp,
1474
+ "Only a getter needs no stack.");
1475
+
1476
+ // this is a function call, so push function and 'this'
1477
+ if(stack_size != argc)
1478
+ {
1479
+ *sp++ = fval;
1480
+ *sp++ = OBJECT_TO_JSVAL(thisObj);
1481
+ }
1482
+
1483
+ // make certain we leave no garbage in the stack
1484
+ for(i = 0; i < argc; i++)
1485
+ {
1486
+ sp[i] = JSVAL_VOID;
1487
+ }
1488
+
1489
+ // build the args
1490
+ for(i = 0; i < argc; i++)
1491
+ {
1492
+ const nsXPTParamInfo& param = info->params[i];
1493
+ const nsXPTType& type = param.GetType();
1494
+ nsXPTType datum_type;
1495
+ JSUint32 array_count;
1496
+ PRBool isArray = type.IsArray();
1497
+ jsval val = JSVAL_NULL;
1498
+ AUTO_MARK_JSVAL(ccx, &val);
1499
+ PRBool isSizedString = isArray ?
1500
+ JS_FALSE :
1501
+ type.TagPart() == nsXPTType::T_PSTRING_SIZE_IS ||
1502
+ type.TagPart() == nsXPTType::T_PWSTRING_SIZE_IS;
1503
+
1504
+
1505
+ // verify that null was not passed for 'out' param
1506
+ if(param.IsOut() && !nativeParams[i].val.p)
1507
+ {
1508
+ retval = NS_ERROR_INVALID_ARG;
1509
+ goto pre_call_clean_up;
1510
+ }
1511
+
1512
+ if(isArray)
1513
+ {
1514
+ if(NS_FAILED(mInfo->GetTypeForParam(methodIndex, &param, 1,
1515
+ &datum_type)))
1516
+ goto pre_call_clean_up;
1517
+ }
1518
+ else
1519
+ datum_type = type;
1520
+
1521
+ if(param.IsIn())
1522
+ {
1523
+ nsXPTCMiniVariant* pv;
1524
+
1525
+ if(param.IsOut())
1526
+ pv = (nsXPTCMiniVariant*) nativeParams[i].val.p;
1527
+ else
1528
+ pv = &nativeParams[i];
1529
+
1530
+ if(datum_type.IsInterfacePointer() &&
1531
+ !GetInterfaceTypeFromParam(cx, info, param, methodIndex,
1532
+ datum_type, nativeParams,
1533
+ &param_iid))
1534
+ goto pre_call_clean_up;
1535
+
1536
+ if(isArray || isSizedString)
1537
+ {
1538
+ if(!GetArraySizeFromParam(cx, info, param, methodIndex,
1539
+ i, GET_LENGTH, nativeParams,
1540
+ &array_count))
1541
+ goto pre_call_clean_up;
1542
+ }
1543
+
1544
+ // Figure out what our callee is
1545
+ if(XPT_MD_IS_GETTER(info->flags) || XPT_MD_IS_SETTER(info->flags))
1546
+ {
1547
+ // Pull the getter or setter off of |obj|
1548
+ uintN attrs;
1549
+ JSBool found;
1550
+ JSPropertyOp getter;
1551
+ JSPropertyOp setter;
1552
+ JSBool ok =
1553
+ JS_GetPropertyAttrsGetterAndSetter(cx, obj, name,
1554
+ &attrs, &found,
1555
+ &getter, &setter);
1556
+ if(ok)
1557
+ {
1558
+ if(XPT_MD_IS_GETTER(info->flags) && (attrs & JSPROP_GETTER))
1559
+ {
1560
+ // JSPROP_GETTER means the getter is actually a
1561
+ // function object.
1562
+ ccx.SetCallee(JS_FUNC_TO_DATA_PTR(JSObject*, getter));
1563
+ }
1564
+ else if(XPT_MD_IS_SETTER(info->flags) && (attrs & JSPROP_SETTER))
1565
+ {
1566
+ // JSPROP_SETTER means the setter is actually a
1567
+ // function object.
1568
+ ccx.SetCallee(JS_FUNC_TO_DATA_PTR(JSObject*, setter));
1569
+ }
1570
+ }
1571
+ }
1572
+ else if(JSVAL_IS_OBJECT(fval))
1573
+ {
1574
+ ccx.SetCallee(JSVAL_TO_OBJECT(fval));
1575
+ }
1576
+
1577
+ if(isArray)
1578
+ {
1579
+
1580
+ if(!XPCConvert::NativeArray2JS(ccx, &val, (const void**)&pv->val,
1581
+ datum_type, &param_iid,
1582
+ array_count, obj, nsnull))
1583
+ goto pre_call_clean_up;
1584
+ }
1585
+ else if(isSizedString)
1586
+ {
1587
+ if(!XPCConvert::NativeStringWithSize2JS(ccx, &val,
1588
+ (const void*)&pv->val,
1589
+ datum_type,
1590
+ array_count, nsnull))
1591
+ goto pre_call_clean_up;
1592
+ }
1593
+ else
1594
+ {
1595
+ if(!XPCConvert::NativeData2JS(ccx, &val, &pv->val, type,
1596
+ &param_iid, obj, nsnull))
1597
+ goto pre_call_clean_up;
1598
+ }
1599
+ }
1600
+
1601
+ if(param.IsOut())
1602
+ {
1603
+ // create an 'out' object
1604
+ JSObject* out_obj = NewOutObject(cx, obj);
1605
+ if(!out_obj)
1606
+ {
1607
+ retval = NS_ERROR_OUT_OF_MEMORY;
1608
+ goto pre_call_clean_up;
1609
+ }
1610
+
1611
+ if(param.IsIn())
1612
+ {
1613
+ if(!JS_SetPropertyById(cx, out_obj,
1614
+ mRuntime->GetStringID(XPCJSRuntime::IDX_VALUE),
1615
+ &val))
1616
+ {
1617
+ goto pre_call_clean_up;
1618
+ }
1619
+ }
1620
+ *sp++ = OBJECT_TO_JSVAL(out_obj);
1621
+ }
1622
+ else
1623
+ *sp++ = val;
1624
+ }
1625
+
1626
+
1627
+
1628
+ readyToDoTheCall = JS_TRUE;
1629
+
1630
+ pre_call_clean_up:
1631
+ // clean up any 'out' params handed in
1632
+ for(i = 0; i < paramCount; i++)
1633
+ {
1634
+ const nsXPTParamInfo& param = info->params[i];
1635
+ if(!param.IsOut())
1636
+ continue;
1637
+
1638
+ const nsXPTType& type = param.GetType();
1639
+ if(!type.IsPointer())
1640
+ continue;
1641
+ void* p;
1642
+ if(!(p = nativeParams[i].val.p))
1643
+ continue;
1644
+
1645
+ if(param.IsIn())
1646
+ {
1647
+ if(type.IsArray())
1648
+ {
1649
+ void** pp;
1650
+ if(nsnull != (pp = *((void***)p)))
1651
+ {
1652
+
1653
+ // we need to get the array length and iterate the items
1654
+ JSUint32 array_count;
1655
+ nsXPTType datum_type;
1656
+
1657
+ if(NS_SUCCEEDED(mInfo->GetTypeForParam(methodIndex, &param,
1658
+ 1, &datum_type)) &&
1659
+ datum_type.IsPointer() &&
1660
+ GetArraySizeFromParam(cx, info, param, methodIndex,
1661
+ i, GET_LENGTH, nativeParams,
1662
+ &array_count) && array_count)
1663
+ {
1664
+ CleanupPointerArray(datum_type, array_count, pp);
1665
+ }
1666
+ // always release the array if it is inout
1667
+ nsMemory::Free(pp);
1668
+ }
1669
+ }
1670
+ else
1671
+ CleanupPointerTypeObject(type, (void**)p);
1672
+ }
1673
+ *((void**)p) = nsnull;
1674
+ }
1675
+
1676
+ // Make sure "this" doesn't get deleted during this call.
1677
+ nsCOMPtr<nsIXPCWrappedJSClass> kungFuDeathGrip(this);
1678
+
1679
+ result = JSVAL_NULL;
1680
+ AUTO_MARK_JSVAL(ccx, &result);
1681
+
1682
+ if(!readyToDoTheCall)
1683
+ goto done;
1684
+
1685
+ // do the deed - note exceptions
1686
+
1687
+ JS_ClearPendingException(cx);
1688
+
1689
+ if(XPT_MD_IS_GETTER(info->flags))
1690
+ success = JS_GetProperty(cx, obj, name, &result);
1691
+ else if(XPT_MD_IS_SETTER(info->flags))
1692
+ success = JS_SetProperty(cx, obj, name, sp-1);
1693
+ else
1694
+ {
1695
+ if(!JSVAL_IS_PRIMITIVE(fval))
1696
+ {
1697
+ success = js_Invoke(cx, argc, stackbase, 0);
1698
+ result = *stackbase;
1699
+ }
1700
+ else
1701
+ {
1702
+ // The property was not an object so can't be a function.
1703
+ // Let's build and 'throw' an exception.
1704
+
1705
+ static const nsresult code =
1706
+ NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED;
1707
+ static const char format[] = "%s \"%s\"";
1708
+ const char * msg;
1709
+ char* sz = nsnull;
1710
+
1711
+ if(nsXPCException::NameAndFormatForNSResult(code, nsnull, &msg) && msg)
1712
+ sz = JS_smprintf(format, msg, name);
1713
+
1714
+ nsCOMPtr<nsIException> e;
1715
+
1716
+ XPCConvert::ConstructException(code, sz, GetInterfaceName(), name,
1717
+ nsnull, getter_AddRefs(e), nsnull, nsnull);
1718
+ xpcc->SetException(e);
1719
+ if(sz)
1720
+ JS_smprintf_free(sz);
1721
+ success = JS_FALSE;
1722
+ }
1723
+ }
1724
+
1725
+ if (!success)
1726
+ {
1727
+ PRBool forceReport;
1728
+ if(NS_FAILED(mInfo->IsFunction(&forceReport)))
1729
+ forceReport = PR_FALSE;
1730
+
1731
+ // May also want to check if we're moving from content->chrome and force
1732
+ // a report in that case.
1733
+
1734
+ retval = CheckForException(ccx, name, GetInterfaceName(), forceReport);
1735
+ goto done;
1736
+ }
1737
+
1738
+ ccx.GetThreadData()->SetException(nsnull); // XXX necessary?
1739
+
1740
+ #define HANDLE_OUT_CONVERSION_FAILURE \
1741
+ {outConversionFailedIndex = i; break;}
1742
+
1743
+ // convert out args and result
1744
+ // NOTE: this is the total number of native params, not just the args
1745
+ // Convert independent params only.
1746
+ // When we later convert the dependent params (if any) we will know that
1747
+ // the params upon which they depend will have already been converted -
1748
+ // regardless of ordering.
1749
+
1750
+ outConversionFailedIndex = paramCount;
1751
+ foundDependentParam = JS_FALSE;
1752
+ for(i = 0; i < paramCount; i++)
1753
+ {
1754
+ const nsXPTParamInfo& param = info->params[i];
1755
+ if(!param.IsOut() && !param.IsDipper())
1756
+ continue;
1757
+
1758
+ const nsXPTType& type = param.GetType();
1759
+ if(type.IsDependent())
1760
+ {
1761
+ foundDependentParam = JS_TRUE;
1762
+ continue;
1763
+ }
1764
+
1765
+ jsval val;
1766
+ uint8 type_tag = type.TagPart();
1767
+ JSBool useAllocator = JS_FALSE;
1768
+ nsXPTCMiniVariant* pv;
1769
+
1770
+ if(param.IsDipper())
1771
+ pv = (nsXPTCMiniVariant*) &nativeParams[i].val.p;
1772
+ else
1773
+ pv = (nsXPTCMiniVariant*) nativeParams[i].val.p;
1774
+
1775
+ if(param.IsRetval())
1776
+ val = result;
1777
+ else if(JSVAL_IS_PRIMITIVE(stackbase[i+2]) ||
1778
+ !JS_GetPropertyById(cx, JSVAL_TO_OBJECT(stackbase[i+2]),
1779
+ mRuntime->GetStringID(XPCJSRuntime::IDX_VALUE),
1780
+ &val))
1781
+ HANDLE_OUT_CONVERSION_FAILURE
1782
+
1783
+ // setup allocator and/or iid
1784
+
1785
+ if(type_tag == nsXPTType::T_INTERFACE)
1786
+ {
1787
+ if(NS_FAILED(GetInterfaceInfo()->
1788
+ GetIIDForParamNoAlloc(methodIndex, &param,
1789
+ &param_iid)))
1790
+ HANDLE_OUT_CONVERSION_FAILURE
1791
+ }
1792
+ else if(type.IsPointer() && !param.IsShared() && !param.IsDipper())
1793
+ useAllocator = JS_TRUE;
1794
+
1795
+ if(!XPCConvert::JSData2Native(ccx, &pv->val, val, type,
1796
+ useAllocator, &param_iid, nsnull))
1797
+ HANDLE_OUT_CONVERSION_FAILURE
1798
+ }
1799
+
1800
+ // if any params were dependent, then we must iterate again to convert them.
1801
+ if(foundDependentParam && outConversionFailedIndex == paramCount)
1802
+ {
1803
+ for(i = 0; i < paramCount; i++)
1804
+ {
1805
+ const nsXPTParamInfo& param = info->params[i];
1806
+ if(!param.IsOut())
1807
+ continue;
1808
+
1809
+ const nsXPTType& type = param.GetType();
1810
+ if(!type.IsDependent())
1811
+ continue;
1812
+
1813
+ jsval val;
1814
+ nsXPTCMiniVariant* pv;
1815
+ nsXPTType datum_type;
1816
+ JSBool useAllocator = JS_FALSE;
1817
+ JSUint32 array_count;
1818
+ PRBool isArray = type.IsArray();
1819
+ PRBool isSizedString = isArray ?
1820
+ JS_FALSE :
1821
+ type.TagPart() == nsXPTType::T_PSTRING_SIZE_IS ||
1822
+ type.TagPart() == nsXPTType::T_PWSTRING_SIZE_IS;
1823
+
1824
+ pv = (nsXPTCMiniVariant*) nativeParams[i].val.p;
1825
+
1826
+ if(param.IsRetval())
1827
+ val = result;
1828
+ else if(!JS_GetPropertyById(cx, JSVAL_TO_OBJECT(stackbase[i+2]),
1829
+ mRuntime->GetStringID(XPCJSRuntime::IDX_VALUE),
1830
+ &val))
1831
+ HANDLE_OUT_CONVERSION_FAILURE
1832
+
1833
+ // setup allocator and/or iid
1834
+
1835
+ if(isArray)
1836
+ {
1837
+ if(NS_FAILED(mInfo->GetTypeForParam(methodIndex, &param, 1,
1838
+ &datum_type)))
1839
+ HANDLE_OUT_CONVERSION_FAILURE
1840
+ }
1841
+ else
1842
+ datum_type = type;
1843
+
1844
+ if(datum_type.IsInterfacePointer())
1845
+ {
1846
+ if(!GetInterfaceTypeFromParam(cx, info, param, methodIndex,
1847
+ datum_type, nativeParams,
1848
+ &param_iid))
1849
+ HANDLE_OUT_CONVERSION_FAILURE
1850
+ }
1851
+ else if(type.IsPointer() && !param.IsShared())
1852
+ useAllocator = JS_TRUE;
1853
+
1854
+ if(isArray || isSizedString)
1855
+ {
1856
+ if(!GetArraySizeFromParam(cx, info, param, methodIndex,
1857
+ i, GET_LENGTH, nativeParams,
1858
+ &array_count))
1859
+ HANDLE_OUT_CONVERSION_FAILURE
1860
+ }
1861
+
1862
+ if(isArray)
1863
+ {
1864
+ if(array_count &&
1865
+ !XPCConvert::JSArray2Native(ccx, (void**)&pv->val, val,
1866
+ array_count, array_count,
1867
+ datum_type,
1868
+ useAllocator, &param_iid,
1869
+ nsnull))
1870
+ HANDLE_OUT_CONVERSION_FAILURE
1871
+ }
1872
+ else if(isSizedString)
1873
+ {
1874
+ if(!XPCConvert::JSStringWithSize2Native(ccx,
1875
+ (void*)&pv->val, val,
1876
+ array_count, array_count,
1877
+ datum_type, useAllocator,
1878
+ nsnull))
1879
+ HANDLE_OUT_CONVERSION_FAILURE
1880
+ }
1881
+ else
1882
+ {
1883
+ if(!XPCConvert::JSData2Native(ccx, &pv->val, val, type,
1884
+ useAllocator, &param_iid,
1885
+ nsnull))
1886
+ HANDLE_OUT_CONVERSION_FAILURE
1887
+ }
1888
+ }
1889
+ }
1890
+
1891
+ if(outConversionFailedIndex != paramCount)
1892
+ {
1893
+ // We didn't manage all the result conversions!
1894
+ // We have to cleanup any junk that *did* get converted.
1895
+
1896
+ for(uint8 k = 0; k < i; k++)
1897
+ {
1898
+ const nsXPTParamInfo& param = info->params[k];
1899
+ if(!param.IsOut())
1900
+ continue;
1901
+ const nsXPTType& type = param.GetType();
1902
+ if(!type.IsPointer())
1903
+ continue;
1904
+ void* p;
1905
+ if(!(p = nativeParams[k].val.p))
1906
+ continue;
1907
+
1908
+ if(type.IsArray())
1909
+ {
1910
+ void** pp;
1911
+ if(nsnull != (pp = *((void***)p)))
1912
+ {
1913
+ // we need to get the array length and iterate the items
1914
+ JSUint32 array_count;
1915
+ nsXPTType datum_type;
1916
+
1917
+ if(NS_SUCCEEDED(mInfo->GetTypeForParam(methodIndex, &param,
1918
+ 1, &datum_type)) &&
1919
+ datum_type.IsPointer() &&
1920
+ GetArraySizeFromParam(cx, info, param, methodIndex,
1921
+ k, GET_LENGTH, nativeParams,
1922
+ &array_count) && array_count)
1923
+ {
1924
+ CleanupPointerArray(datum_type, array_count, pp);
1925
+ }
1926
+ nsMemory::Free(pp);
1927
+ }
1928
+ }
1929
+ else
1930
+ CleanupPointerTypeObject(type, (void**)p);
1931
+ *((void**)p) = nsnull;
1932
+ }
1933
+ }
1934
+ else
1935
+ {
1936
+ // set to whatever the JS code might have set as the result
1937
+ retval = pending_result;
1938
+ }
1939
+
1940
+ done:
1941
+ if(sp)
1942
+ js_FreeStack(cx, mark);
1943
+
1944
+ #ifdef DEBUG_stats_jband
1945
+ endTime = PR_IntervalNow();
1946
+ printf("%s::%s %d ( c->js ) \n", GetInterfaceName(), info->GetName(), PR_IntervalToMilliseconds(endTime-startTime));
1947
+ totalTime += endTime-startTime;
1948
+ #endif
1949
+ return retval;
1950
+ }
1951
+
1952
+ const char*
1953
+ nsXPCWrappedJSClass::GetInterfaceName()
1954
+ {
1955
+ if(!mName)
1956
+ mInfo->GetName(&mName);
1957
+ return mName;
1958
+ }
1959
+
1960
+ JSObject*
1961
+ nsXPCWrappedJSClass::NewOutObject(JSContext* cx, JSObject* scope)
1962
+ {
1963
+ return JS_NewObject(cx, nsnull, nsnull, JS_GetGlobalForObject(cx, scope));
1964
+ }
1965
+
1966
+
1967
+ NS_IMETHODIMP
1968
+ nsXPCWrappedJSClass::DebugDump(PRInt16 depth)
1969
+ {
1970
+ #ifdef DEBUG
1971
+ depth-- ;
1972
+ XPC_LOG_ALWAYS(("nsXPCWrappedJSClass @ %x with mRefCnt = %d", this, mRefCnt.get()));
1973
+ XPC_LOG_INDENT();
1974
+ char* name;
1975
+ mInfo->GetName(&name);
1976
+ XPC_LOG_ALWAYS(("interface name is %s", name));
1977
+ if(name)
1978
+ nsMemory::Free(name);
1979
+ char * iid = mIID.ToString();
1980
+ XPC_LOG_ALWAYS(("IID number is %s", iid ? iid : "invalid"));
1981
+ if(iid)
1982
+ PR_Free(iid);
1983
+ XPC_LOG_ALWAYS(("InterfaceInfo @ %x", mInfo));
1984
+ uint16 methodCount = 0;
1985
+ if(depth)
1986
+ {
1987
+ uint16 i;
1988
+ nsCOMPtr<nsIInterfaceInfo> parent;
1989
+ XPC_LOG_INDENT();
1990
+ mInfo->GetParent(getter_AddRefs(parent));
1991
+ XPC_LOG_ALWAYS(("parent @ %x", parent.get()));
1992
+ mInfo->GetMethodCount(&methodCount);
1993
+ XPC_LOG_ALWAYS(("MethodCount = %d", methodCount));
1994
+ mInfo->GetConstantCount(&i);
1995
+ XPC_LOG_ALWAYS(("ConstantCount = %d", i));
1996
+ XPC_LOG_OUTDENT();
1997
+ }
1998
+ XPC_LOG_ALWAYS(("mRuntime @ %x", mRuntime));
1999
+ XPC_LOG_ALWAYS(("mDescriptors @ %x count = %d", mDescriptors, methodCount));
2000
+ if(depth && mDescriptors && methodCount)
2001
+ {
2002
+ depth--;
2003
+ XPC_LOG_INDENT();
2004
+ for(uint16 i = 0; i < methodCount; i++)
2005
+ {
2006
+ XPC_LOG_ALWAYS(("Method %d is %s%s", \
2007
+ i, IsReflectable(i) ? "":" NOT ","reflectable"));
2008
+ }
2009
+ XPC_LOG_OUTDENT();
2010
+ depth++;
2011
+ }
2012
+ XPC_LOG_OUTDENT();
2013
+ #endif
2014
+ return NS_OK;
2015
+ }