johnson 1.2.0 → 2.0.0.pre0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,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
+ }