johnson 1.2.0 → 2.0.0.pre0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,1342 @@
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) 1998
22
+ * the Initial Developer. All Rights Reserved.
23
+ *
24
+ * Contributor(s):
25
+ * John Bandhauer <jband@netscape.com> (original author)
26
+ *
27
+ * Alternatively, the contents of this file may be used under the terms of
28
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
29
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30
+ * in which case the provisions of the GPL or the LGPL are applicable instead
31
+ * of those above. If you wish to allow use of your version of this file only
32
+ * under the terms of either the GPL or the LGPL, and not to allow others to
33
+ * use your version of this file under the terms of the MPL, indicate your
34
+ * decision by deleting the provisions above and replace them with the notice
35
+ * and other provisions required by the GPL or the LGPL. If you do not delete
36
+ * the provisions above, a recipient may use your version of this file under
37
+ * the terms of any one of the MPL, the GPL or the LGPL.
38
+ *
39
+ * ***** END LICENSE BLOCK ***** */
40
+
41
+ /* Per JSRuntime object */
42
+
43
+ #include "xpcprivate.h"
44
+ #include "dom_quickstubs.h"
45
+
46
+ /***************************************************************************/
47
+
48
+ const char* XPCJSRuntime::mStrings[] = {
49
+ "constructor", // IDX_CONSTRUCTOR
50
+ "toString", // IDX_TO_STRING
51
+ "toSource", // IDX_TO_SOURCE
52
+ "lastResult", // IDX_LAST_RESULT
53
+ "returnCode", // IDX_RETURN_CODE
54
+ "value", // IDX_VALUE
55
+ "QueryInterface", // IDX_QUERY_INTERFACE
56
+ "Components", // IDX_COMPONENTS
57
+ "wrappedJSObject", // IDX_WRAPPED_JSOBJECT
58
+ "Object", // IDX_OBJECT
59
+ "Function", // IDX_FUNCTION
60
+ "prototype", // IDX_PROTOTYPE
61
+ "createInstance", // IDX_CREATE_INSTANCE
62
+ "item", // IDX_ITEM
63
+ "__proto__", // IDX_PROTO
64
+ "__iterator__" // IDX_ITERATOR
65
+ #ifdef XPC_IDISPATCH_SUPPORT
66
+ , "GeckoActiveXObject" // IDX_ACTIVEX_OBJECT
67
+ , "COMObject" // IDX_COMOBJECT
68
+ , "supports" // IDX_ACTIVEX_SUPPORTS
69
+ #endif
70
+ };
71
+
72
+ /***************************************************************************/
73
+
74
+ // data holder class for the enumerator callback below
75
+ struct JSDyingJSObjectData
76
+ {
77
+ JSContext* cx;
78
+ nsVoidArray* array;
79
+ };
80
+
81
+ static JSDHashOperator
82
+ WrappedJSDyingJSObjectFinder(JSDHashTable *table, JSDHashEntryHdr *hdr,
83
+ uint32 number, void *arg)
84
+ {
85
+ JSDyingJSObjectData* data = (JSDyingJSObjectData*) arg;
86
+ nsXPCWrappedJS* wrapper = ((JSObject2WrappedJSMap::Entry*)hdr)->value;
87
+ NS_ASSERTION(wrapper, "found a null JS wrapper!");
88
+
89
+ // walk the wrapper chain and find any whose JSObject is to be finalized
90
+ while(wrapper)
91
+ {
92
+ if(wrapper->IsSubjectToFinalization())
93
+ {
94
+ if(JS_IsAboutToBeFinalized(data->cx, wrapper->GetJSObject()))
95
+ data->array->AppendElement(wrapper);
96
+ }
97
+ wrapper = wrapper->GetNextWrapper();
98
+ }
99
+ return JS_DHASH_NEXT;
100
+ }
101
+
102
+ struct CX_AND_XPCRT_Data
103
+ {
104
+ JSContext* cx;
105
+ XPCJSRuntime* rt;
106
+ };
107
+
108
+ static JSDHashOperator
109
+ NativeInterfaceGC(JSDHashTable *table, JSDHashEntryHdr *hdr,
110
+ uint32 number, void *arg)
111
+ {
112
+ CX_AND_XPCRT_Data* data = (CX_AND_XPCRT_Data*) arg;
113
+ ((IID2NativeInterfaceMap::Entry*)hdr)->value->
114
+ DealWithDyingGCThings(data->cx, data->rt);
115
+ return JS_DHASH_NEXT;
116
+ }
117
+
118
+ static JSDHashOperator
119
+ NativeInterfaceSweeper(JSDHashTable *table, JSDHashEntryHdr *hdr,
120
+ uint32 number, void *arg)
121
+ {
122
+ CX_AND_XPCRT_Data* data = (CX_AND_XPCRT_Data*) arg;
123
+ XPCNativeInterface* iface = ((IID2NativeInterfaceMap::Entry*)hdr)->value;
124
+ if(iface->IsMarked())
125
+ {
126
+ iface->Unmark();
127
+ return JS_DHASH_NEXT;
128
+ }
129
+
130
+ #ifdef XPC_REPORT_NATIVE_INTERFACE_AND_SET_FLUSHING
131
+ printf("- Destroying XPCNativeInterface for %s\n",
132
+ JS_GetStringBytes(JSVAL_TO_STRING(iface->GetName())));
133
+ #endif
134
+
135
+ XPCNativeInterface::DestroyInstance(data->cx, data->rt, iface);
136
+ return JS_DHASH_REMOVE;
137
+ }
138
+
139
+ // *Some* NativeSets are referenced from mClassInfo2NativeSetMap.
140
+ // *All* NativeSets are referenced from mNativeSetMap.
141
+ // So, in mClassInfo2NativeSetMap we just clear references to the unmarked.
142
+ // In mNativeSetMap we clear the references to the unmarked *and* delete them.
143
+
144
+ static JSDHashOperator
145
+ NativeUnMarkedSetRemover(JSDHashTable *table, JSDHashEntryHdr *hdr,
146
+ uint32 number, void *arg)
147
+ {
148
+ XPCNativeSet* set = ((ClassInfo2NativeSetMap::Entry*)hdr)->value;
149
+ if(set->IsMarked())
150
+ return JS_DHASH_NEXT;
151
+ return JS_DHASH_REMOVE;
152
+ }
153
+
154
+ static JSDHashOperator
155
+ NativeSetSweeper(JSDHashTable *table, JSDHashEntryHdr *hdr,
156
+ uint32 number, void *arg)
157
+ {
158
+ XPCNativeSet* set = ((NativeSetMap::Entry*)hdr)->key_value;
159
+ if(set->IsMarked())
160
+ {
161
+ set->Unmark();
162
+ return JS_DHASH_NEXT;
163
+ }
164
+
165
+ #ifdef XPC_REPORT_NATIVE_INTERFACE_AND_SET_FLUSHING
166
+ printf("- Destroying XPCNativeSet for:\n");
167
+ PRUint16 count = set->GetInterfaceCount();
168
+ for(PRUint16 k = 0; k < count; k++)
169
+ {
170
+ XPCNativeInterface* iface = set->GetInterfaceAt(k);
171
+ printf(" %s\n",JS_GetStringBytes(JSVAL_TO_STRING(iface->GetName())));
172
+ }
173
+ #endif
174
+
175
+ XPCNativeSet::DestroyInstance(set);
176
+ return JS_DHASH_REMOVE;
177
+ }
178
+
179
+ static JSDHashOperator
180
+ JSClassSweeper(JSDHashTable *table, JSDHashEntryHdr *hdr,
181
+ uint32 number, void *arg)
182
+ {
183
+ XPCNativeScriptableShared* shared =
184
+ ((XPCNativeScriptableSharedMap::Entry*) hdr)->key;
185
+ if(shared->IsMarked())
186
+ {
187
+ #ifdef off_XPC_REPORT_JSCLASS_FLUSHING
188
+ printf("+ Marked XPCNativeScriptableShared for: %s @ %x\n",
189
+ shared->GetJSClass()->name,
190
+ shared->GetJSClass());
191
+ #endif
192
+ shared->Unmark();
193
+ return JS_DHASH_NEXT;
194
+ }
195
+
196
+ #ifdef XPC_REPORT_JSCLASS_FLUSHING
197
+ printf("- Destroying XPCNativeScriptableShared for: %s @ %x\n",
198
+ shared->GetJSClass()->name,
199
+ shared->GetJSClass());
200
+ #endif
201
+
202
+ delete shared;
203
+ return JS_DHASH_REMOVE;
204
+ }
205
+
206
+ static JSDHashOperator
207
+ DyingProtoKiller(JSDHashTable *table, JSDHashEntryHdr *hdr,
208
+ uint32 number, void *arg)
209
+ {
210
+ XPCWrappedNativeProto* proto =
211
+ (XPCWrappedNativeProto*)((JSDHashEntryStub*)hdr)->key;
212
+ delete proto;
213
+ return JS_DHASH_REMOVE;
214
+ }
215
+
216
+ static JSDHashOperator
217
+ DetachedWrappedNativeProtoMarker(JSDHashTable *table, JSDHashEntryHdr *hdr,
218
+ uint32 number, void *arg)
219
+ {
220
+ XPCWrappedNativeProto* proto =
221
+ (XPCWrappedNativeProto*)((JSDHashEntryStub*)hdr)->key;
222
+
223
+ proto->Mark();
224
+ return JS_DHASH_NEXT;
225
+ }
226
+
227
+ // GCCallback calls are chained
228
+ static JSBool
229
+ ContextCallback(JSContext *cx, uintN operation)
230
+ {
231
+ XPCJSRuntime* self = nsXPConnect::GetRuntimeInstance();
232
+ if(self)
233
+ {
234
+ if(operation == JSCONTEXT_NEW)
235
+ {
236
+ if(!self->OnJSContextNew(cx))
237
+ return JS_FALSE;
238
+ }
239
+ else if(operation == JSCONTEXT_DESTROY)
240
+ {
241
+ delete XPCContext::GetXPCContext(cx);
242
+ }
243
+ }
244
+ return JS_TRUE;
245
+ }
246
+
247
+ struct ObjectHolder : public JSDHashEntryHdr
248
+ {
249
+ void *holder;
250
+ nsScriptObjectTracer* tracer;
251
+ };
252
+
253
+ nsresult
254
+ XPCJSRuntime::AddJSHolder(void* aHolder, nsScriptObjectTracer* aTracer)
255
+ {
256
+ if(!mJSHolders.ops)
257
+ return NS_ERROR_OUT_OF_MEMORY;
258
+
259
+ ObjectHolder *entry =
260
+ reinterpret_cast<ObjectHolder*>(JS_DHashTableOperate(&mJSHolders,
261
+ aHolder,
262
+ JS_DHASH_ADD));
263
+ if(!entry)
264
+ return NS_ERROR_OUT_OF_MEMORY;
265
+
266
+ entry->holder = aHolder;
267
+ entry->tracer = aTracer;
268
+
269
+ return NS_OK;
270
+ }
271
+
272
+ nsresult
273
+ XPCJSRuntime::RemoveJSHolder(void* aHolder)
274
+ {
275
+ if(!mJSHolders.ops)
276
+ return NS_ERROR_OUT_OF_MEMORY;
277
+
278
+ JS_DHashTableOperate(&mJSHolders, aHolder, JS_DHASH_REMOVE);
279
+
280
+ return NS_OK;
281
+ }
282
+
283
+ // static
284
+ void XPCJSRuntime::TraceJS(JSTracer* trc, void* data)
285
+ {
286
+ XPCJSRuntime* self = (XPCJSRuntime*)data;
287
+
288
+ // Skip this part if XPConnect is shutting down. We get into
289
+ // bad locking problems with the thread iteration otherwise.
290
+ if(!self->GetXPConnect()->IsShuttingDown())
291
+ {
292
+ PRLock* threadLock = XPCPerThreadData::GetLock();
293
+ if(threadLock)
294
+ { // scoped lock
295
+ nsAutoLock lock(threadLock);
296
+
297
+ XPCPerThreadData* iterp = nsnull;
298
+ XPCPerThreadData* thread;
299
+
300
+ while(nsnull != (thread =
301
+ XPCPerThreadData::IterateThreads(&iterp)))
302
+ {
303
+ // Trace those AutoMarkingPtr lists!
304
+ thread->TraceJS(trc);
305
+ }
306
+ }
307
+ }
308
+
309
+ // XPCJSObjectHolders don't participate in cycle collection, so always trace
310
+ // them here.
311
+ for(XPCRootSetElem *e = self->mObjectHolderRoots; e ; e = e->GetNextRoot())
312
+ static_cast<XPCJSObjectHolder*>(e)->TraceJS(trc);
313
+
314
+ if(self->GetXPConnect()->ShouldTraceRoots())
315
+ {
316
+ // Only trace these if we're not cycle-collecting, the cycle collector
317
+ // will do that if we are.
318
+ self->TraceXPConnectRoots(trc);
319
+ }
320
+ }
321
+
322
+ static void
323
+ TraceJSObject(PRUint32 aLangID, void *aScriptThing, void *aClosure)
324
+ {
325
+ if(aLangID == nsIProgrammingLanguage::JAVASCRIPT)
326
+ {
327
+ JS_CALL_TRACER(static_cast<JSTracer*>(aClosure), aScriptThing,
328
+ js_GetGCThingTraceKind(aScriptThing),
329
+ "JSObjectHolder");
330
+ }
331
+ }
332
+
333
+ static JSDHashOperator
334
+ TraceJSHolder(JSDHashTable *table, JSDHashEntryHdr *hdr, uint32 number,
335
+ void *arg)
336
+ {
337
+ ObjectHolder* entry = reinterpret_cast<ObjectHolder*>(hdr);
338
+
339
+ entry->tracer->Trace(entry->holder, TraceJSObject, arg);
340
+
341
+ return JS_DHASH_NEXT;
342
+ }
343
+
344
+ struct ClearedGlobalObject : public JSDHashEntryHdr
345
+ {
346
+ JSContext* mContext;
347
+ JSObject* mGlobalObject;
348
+ };
349
+
350
+ void XPCJSRuntime::TraceXPConnectRoots(JSTracer *trc, JSBool rootGlobals)
351
+ {
352
+ if(mUnrootedGlobalCount != 0)
353
+ {
354
+ JSContext *iter = nsnull, *acx;
355
+ while((acx = JS_ContextIterator(GetJSRuntime(), &iter)))
356
+ {
357
+ if(JS_HAS_OPTION(acx, JSOPTION_UNROOTED_GLOBAL))
358
+ {
359
+ NS_ASSERTION(nsXPConnect::GetXPConnect()->GetRequestDepth(acx)
360
+ == 0, "active cx must be always rooted");
361
+ NS_ASSERTION(acx->globalObject, "bad state");
362
+ JS_CALL_OBJECT_TRACER(trc, acx->globalObject,
363
+ "global object");
364
+ if(rootGlobals)
365
+ {
366
+ NS_ASSERTION(mUnrootedGlobalCount != 0, "bad state");
367
+ NS_ASSERTION(trc == acx->runtime->gcMarkingTracer,
368
+ "bad tracer");
369
+ JS_ToggleOptions(acx, JSOPTION_UNROOTED_GLOBAL);
370
+ --mUnrootedGlobalCount;
371
+ }
372
+ }
373
+ }
374
+ }
375
+
376
+ XPCWrappedNativeScope::TraceJS(trc, this);
377
+
378
+ for(XPCRootSetElem *e = mVariantRoots; e ; e = e->GetNextRoot())
379
+ static_cast<XPCTraceableVariant*>(e)->TraceJS(trc);
380
+
381
+ for(XPCRootSetElem *e = mWrappedJSRoots; e ; e = e->GetNextRoot())
382
+ static_cast<nsXPCWrappedJS*>(e)->TraceJS(trc);
383
+
384
+ if(mJSHolders.ops)
385
+ JS_DHashTableEnumerate(&mJSHolders, TraceJSHolder, trc);
386
+ }
387
+
388
+ static JSDHashOperator
389
+ NoteJSHolder(JSDHashTable *table, JSDHashEntryHdr *hdr, uint32 number,
390
+ void *arg)
391
+ {
392
+ ObjectHolder* entry = reinterpret_cast<ObjectHolder*>(hdr);
393
+
394
+ nsCycleCollectionTraversalCallback* cb =
395
+ static_cast<nsCycleCollectionTraversalCallback*>(arg);
396
+ cb->NoteRoot(nsIProgrammingLanguage::CPLUSPLUS, entry->holder,
397
+ entry->tracer);
398
+
399
+ return JS_DHASH_NEXT;
400
+ }
401
+
402
+
403
+ void XPCJSRuntime::AddXPConnectRoots(JSContext* cx,
404
+ nsCycleCollectionTraversalCallback &cb)
405
+ {
406
+ // For all JS objects that are held by native objects but aren't held
407
+ // through rooting or locking, we need to add all the native objects that
408
+ // hold them so that the JS objects are colored correctly in the cycle
409
+ // collector. This includes JSContexts that don't have outstanding requests,
410
+ // because their global object wasn't marked by the JS GC. All other JS
411
+ // roots were marked by the JS GC and will be colored correctly in the cycle
412
+ // collector.
413
+
414
+ JSContext *iter = nsnull, *acx;
415
+ while((acx = JS_ContextIterator(GetJSRuntime(), &iter)))
416
+ {
417
+ #ifndef DEBUG_CC
418
+ // Only skip JSContexts with outstanding requests if DEBUG_CC is not
419
+ // defined, else we do want to know about all JSContexts to get better
420
+ // graphs and explanations.
421
+ if(nsXPConnect::GetXPConnect()->GetRequestDepth(acx) != 0)
422
+ continue;
423
+ #endif
424
+ cb.NoteRoot(nsIProgrammingLanguage::CPLUSPLUS, acx,
425
+ nsXPConnect::JSContextParticipant());
426
+ }
427
+
428
+ XPCWrappedNativeScope::SuspectAllWrappers(this, cx, cb);
429
+
430
+ for(XPCRootSetElem *e = mVariantRoots; e ; e = e->GetNextRoot())
431
+ cb.NoteXPCOMRoot(static_cast<XPCTraceableVariant*>(e));
432
+
433
+ for(XPCRootSetElem *e = mWrappedJSRoots; e ; e = e->GetNextRoot())
434
+ {
435
+ nsIXPConnectWrappedJS *wrappedJS = static_cast<nsXPCWrappedJS*>(e);
436
+ cb.NoteXPCOMRoot(wrappedJS);
437
+ }
438
+
439
+ if(mJSHolders.ops)
440
+ JS_DHashTableEnumerate(&mJSHolders, NoteJSHolder, &cb);
441
+ }
442
+
443
+ void XPCJSRuntime::UnrootContextGlobals()
444
+ {
445
+ mUnrootedGlobalCount = 0;
446
+ JSContext *iter = nsnull, *acx;
447
+ while((acx = JS_ContextIterator(GetJSRuntime(), &iter)))
448
+ {
449
+ NS_ASSERTION(!JS_HAS_OPTION(acx, JSOPTION_UNROOTED_GLOBAL),
450
+ "unrooted global should be set only during CC");
451
+ if(nsXPConnect::GetXPConnect()->GetRequestDepth(acx) == 0)
452
+ {
453
+ JS_ClearNewbornRoots(acx);
454
+ if(acx->globalObject)
455
+ {
456
+ JS_ToggleOptions(acx, JSOPTION_UNROOTED_GLOBAL);
457
+ ++mUnrootedGlobalCount;
458
+ }
459
+ }
460
+ }
461
+ }
462
+
463
+ #ifdef DEBUG_CC
464
+ void XPCJSRuntime::RootContextGlobals()
465
+ {
466
+ JSContext *iter = nsnull, *acx;
467
+ while((acx = JS_ContextIterator(GetJSRuntime(), &iter)))
468
+ {
469
+ if(JS_HAS_OPTION(acx, JSOPTION_UNROOTED_GLOBAL))
470
+ {
471
+ JS_ToggleOptions(acx, JSOPTION_UNROOTED_GLOBAL);
472
+ --mUnrootedGlobalCount;
473
+ }
474
+ }
475
+ NS_ASSERTION(mUnrootedGlobalCount == 0, "bad state");
476
+ }
477
+ #endif
478
+
479
+ // static
480
+ JSBool XPCJSRuntime::GCCallback(JSContext *cx, JSGCStatus status)
481
+ {
482
+ nsVoidArray* dyingWrappedJSArray;
483
+
484
+ XPCJSRuntime* self = nsXPConnect::GetRuntimeInstance();
485
+ if(self)
486
+ {
487
+ switch(status)
488
+ {
489
+ case JSGC_BEGIN:
490
+ {
491
+ if(!NS_IsMainThread())
492
+ {
493
+ return JS_FALSE;
494
+ }
495
+ break;
496
+ }
497
+ case JSGC_MARK_END:
498
+ {
499
+ NS_ASSERTION(!self->mDoingFinalization, "bad state");
500
+
501
+ // mThreadRunningGC indicates that GC is running
502
+ { // scoped lock
503
+ XPCAutoLock lock(self->GetMapLock());
504
+ NS_ASSERTION(!self->mThreadRunningGC, "bad state");
505
+ self->mThreadRunningGC = PR_GetCurrentThread();
506
+ }
507
+
508
+ dyingWrappedJSArray = &self->mWrappedJSToReleaseArray;
509
+
510
+ {
511
+ JSDyingJSObjectData data = {cx, dyingWrappedJSArray};
512
+
513
+ // Add any wrappers whose JSObjects are to be finalized to
514
+ // this array. Note that this is a nsVoidArray because
515
+ // we do not want to be changing the refcount of these wrappers.
516
+ // We add them to the array now and Release the array members
517
+ // later to avoid the posibility of doing any JS GCThing
518
+ // allocations during the gc cycle.
519
+ self->mWrappedJSMap->
520
+ Enumerate(WrappedJSDyingJSObjectFinder, &data);
521
+ }
522
+
523
+ // Do cleanup in NativeInterfaces. This part just finds
524
+ // member cloned function objects that are about to be
525
+ // collected. It does not deal with collection of interfaces or
526
+ // sets at this point.
527
+ CX_AND_XPCRT_Data data = {cx, self};
528
+
529
+ self->mIID2NativeInterfaceMap->
530
+ Enumerate(NativeInterfaceGC, &data);
531
+
532
+ // Find dying scopes...
533
+ XPCWrappedNativeScope::FinishedMarkPhaseOfGC(cx, self);
534
+
535
+ self->mDoingFinalization = JS_TRUE;
536
+ break;
537
+ }
538
+ case JSGC_FINALIZE_END:
539
+ {
540
+ NS_ASSERTION(self->mDoingFinalization, "bad state");
541
+ self->mDoingFinalization = JS_FALSE;
542
+
543
+ // Release all the members whose JSObjects are now known
544
+ // to be dead.
545
+
546
+ dyingWrappedJSArray = &self->mWrappedJSToReleaseArray;
547
+ while(1)
548
+ {
549
+ nsXPCWrappedJS* wrapper;
550
+ PRInt32 count = dyingWrappedJSArray->Count();
551
+ if(!count)
552
+ {
553
+ dyingWrappedJSArray->Compact();
554
+ break;
555
+ }
556
+ wrapper = static_cast<nsXPCWrappedJS*>
557
+ (dyingWrappedJSArray->ElementAt(count-1));
558
+ dyingWrappedJSArray->RemoveElementAt(count-1);
559
+ NS_RELEASE(wrapper);
560
+ }
561
+
562
+
563
+ #ifdef XPC_REPORT_NATIVE_INTERFACE_AND_SET_FLUSHING
564
+ printf("--------------------------------------------------------------\n");
565
+ int setsBefore = (int) self->mNativeSetMap->Count();
566
+ int ifacesBefore = (int) self->mIID2NativeInterfaceMap->Count();
567
+ #endif
568
+
569
+ // We use this occasion to mark and sweep NativeInterfaces,
570
+ // NativeSets, and the WrappedNativeJSClasses...
571
+
572
+ // Do the marking...
573
+ XPCWrappedNativeScope::MarkAllWrappedNativesAndProtos();
574
+
575
+ self->mDetachedWrappedNativeProtoMap->
576
+ Enumerate(DetachedWrappedNativeProtoMarker, nsnull);
577
+
578
+ DOM_MarkInterfaces();
579
+
580
+ // Mark the sets used in the call contexts. There is a small
581
+ // chance that a wrapper's set will change *while* a call is
582
+ // happening which uses that wrapper's old interfface set. So,
583
+ // we need to do this marking to avoid collecting those sets
584
+ // that might no longer be otherwise reachable from the wrappers
585
+ // or the wrapperprotos.
586
+
587
+ // Skip this part if XPConnect is shutting down. We get into
588
+ // bad locking problems with the thread iteration otherwise.
589
+ if(!self->GetXPConnect()->IsShuttingDown())
590
+ {
591
+ PRLock* threadLock = XPCPerThreadData::GetLock();
592
+ if(threadLock)
593
+ { // scoped lock
594
+ nsAutoLock lock(threadLock);
595
+
596
+ XPCPerThreadData* iterp = nsnull;
597
+ XPCPerThreadData* thread;
598
+
599
+ while(nsnull != (thread =
600
+ XPCPerThreadData::IterateThreads(&iterp)))
601
+ {
602
+ // Mark those AutoMarkingPtr lists!
603
+ thread->MarkAutoRootsAfterJSFinalize();
604
+
605
+ XPCCallContext* ccxp = thread->GetCallContext();
606
+ while(ccxp)
607
+ {
608
+ // Deal with the strictness of callcontext that
609
+ // complains if you ask for a set when
610
+ // it is in a state where the set could not
611
+ // possibly be valid.
612
+ if(ccxp->CanGetSet())
613
+ {
614
+ XPCNativeSet* set = ccxp->GetSet();
615
+ if(set)
616
+ set->Mark();
617
+ }
618
+ if(ccxp->CanGetInterface())
619
+ {
620
+ XPCNativeInterface* iface = ccxp->GetInterface();
621
+ if(iface)
622
+ iface->Mark();
623
+ }
624
+ ccxp = ccxp->GetPrevCallContext();
625
+ }
626
+ }
627
+ }
628
+ }
629
+
630
+ // Do the sweeping...
631
+
632
+ // We don't want to sweep the JSClasses at shutdown time.
633
+ // At this point there may be JSObjects using them that have
634
+ // been removed from the other maps.
635
+ if(!self->GetXPConnect()->IsShuttingDown())
636
+ {
637
+ self->mNativeScriptableSharedMap->
638
+ Enumerate(JSClassSweeper, nsnull);
639
+ }
640
+
641
+ self->mClassInfo2NativeSetMap->
642
+ Enumerate(NativeUnMarkedSetRemover, nsnull);
643
+
644
+ self->mNativeSetMap->
645
+ Enumerate(NativeSetSweeper, nsnull);
646
+
647
+ CX_AND_XPCRT_Data data = {cx, self};
648
+
649
+ self->mIID2NativeInterfaceMap->
650
+ Enumerate(NativeInterfaceSweeper, &data);
651
+
652
+ #ifdef DEBUG
653
+ XPCWrappedNativeScope::ASSERT_NoInterfaceSetsAreMarked();
654
+ #endif
655
+
656
+ #ifdef XPC_REPORT_NATIVE_INTERFACE_AND_SET_FLUSHING
657
+ int setsAfter = (int) self->mNativeSetMap->Count();
658
+ int ifacesAfter = (int) self->mIID2NativeInterfaceMap->Count();
659
+
660
+ printf("\n");
661
+ printf("XPCNativeSets: before: %d collected: %d remaining: %d\n",
662
+ setsBefore, setsBefore - setsAfter, setsAfter);
663
+ printf("XPCNativeInterfaces: before: %d collected: %d remaining: %d\n",
664
+ ifacesBefore, ifacesBefore - ifacesAfter, ifacesAfter);
665
+ printf("--------------------------------------------------------------\n");
666
+ #endif
667
+
668
+ // Sweep scopes needing cleanup
669
+ XPCWrappedNativeScope::FinishedFinalizationPhaseOfGC(cx);
670
+
671
+ // Now we are going to recycle any unused WrappedNativeTearoffs.
672
+ // We do this by iterating all the live callcontexts (on all
673
+ // threads!) and marking the tearoffs in use. And then we
674
+ // iterate over all the WrappedNative wrappers and sweep their
675
+ // tearoffs.
676
+ //
677
+ // This allows us to perhaps minimize the growth of the
678
+ // tearoffs. And also makes us not hold references to interfaces
679
+ // on our wrapped natives that we are not actually using.
680
+ //
681
+ // XXX We may decide to not do this on *every* gc cycle.
682
+
683
+ // Skip this part if XPConnect is shutting down. We get into
684
+ // bad locking problems with the thread iteration otherwise.
685
+ if(!self->GetXPConnect()->IsShuttingDown())
686
+ {
687
+ PRLock* threadLock = XPCPerThreadData::GetLock();
688
+ if(threadLock)
689
+ {
690
+ // Do the marking...
691
+
692
+ { // scoped lock
693
+ nsAutoLock lock(threadLock);
694
+
695
+ XPCPerThreadData* iterp = nsnull;
696
+ XPCPerThreadData* thread;
697
+
698
+ while(nsnull != (thread =
699
+ XPCPerThreadData::IterateThreads(&iterp)))
700
+ {
701
+ XPCCallContext* ccxp = thread->GetCallContext();
702
+ while(ccxp)
703
+ {
704
+ // Deal with the strictness of callcontext that
705
+ // complains if you ask for a tearoff when
706
+ // it is in a state where the tearoff could not
707
+ // possibly be valid.
708
+ if(ccxp->CanGetTearOff())
709
+ {
710
+ XPCWrappedNativeTearOff* to =
711
+ ccxp->GetTearOff();
712
+ if(to)
713
+ to->Mark();
714
+ }
715
+ ccxp = ccxp->GetPrevCallContext();
716
+ }
717
+ }
718
+ }
719
+
720
+ // Do the sweeping...
721
+ XPCWrappedNativeScope::SweepAllWrappedNativeTearOffs();
722
+ }
723
+ }
724
+
725
+ // Now we need to kill the 'Dying' XPCWrappedNativeProtos.
726
+ // We transfered these native objects to this table when their
727
+ // JSObject's were finalized. We did not destroy them immediately
728
+ // at that point because the ordering of JS finalization is not
729
+ // deterministic and we did not yet know if any wrappers that
730
+ // might still be referencing the protos where still yet to be
731
+ // finalized and destroyed. We *do* know that the protos'
732
+ // JSObjects would not have been finalized if there were any
733
+ // wrappers that referenced the proto but where not themselves
734
+ // slated for finalization in this gc cycle. So... at this point
735
+ // we know that any and all wrappers that might have been
736
+ // referencing the protos in the dying list are themselves dead.
737
+ // So, we can safely delete all the protos in the list.
738
+
739
+ self->mDyingWrappedNativeProtoMap->
740
+ Enumerate(DyingProtoKiller, nsnull);
741
+
742
+
743
+ // mThreadRunningGC indicates that GC is running.
744
+ // Clear it and notify waiters.
745
+ { // scoped lock
746
+ XPCAutoLock lock(self->GetMapLock());
747
+ NS_ASSERTION(self->mThreadRunningGC == PR_GetCurrentThread(), "bad state");
748
+ self->mThreadRunningGC = nsnull;
749
+ xpc_NotifyAll(self->GetMapLock());
750
+ }
751
+
752
+ break;
753
+ }
754
+ case JSGC_END:
755
+ {
756
+ // NOTE that this event happens outside of the gc lock in
757
+ // the js engine. So this could be simultaneous with the
758
+ // events above.
759
+
760
+ // Do any deferred released of native objects.
761
+ nsVoidArray* array = &self->mNativesToReleaseArray;
762
+ #ifdef XPC_TRACK_DEFERRED_RELEASES
763
+ printf("XPC - Begin deferred Release of %d nsISupports pointers\n",
764
+ array->Count());
765
+ #endif
766
+ while(1)
767
+ {
768
+ nsISupports* obj;
769
+ {
770
+ PRInt32 count = array->Count();
771
+ if(!count)
772
+ {
773
+ array->Compact();
774
+ break;
775
+ }
776
+ obj = reinterpret_cast<nsISupports*>
777
+ (array->ElementAt(count-1));
778
+ array->RemoveElementAt(count-1);
779
+ }
780
+ NS_RELEASE(obj);
781
+ }
782
+ #ifdef XPC_TRACK_DEFERRED_RELEASES
783
+ printf("XPC - End deferred Releases\n");
784
+ #endif
785
+ break;
786
+ }
787
+ default:
788
+ break;
789
+ }
790
+ }
791
+
792
+ return JS_TRUE;
793
+ }
794
+
795
+ // Auto JS GC lock helper.
796
+ class AutoLockJSGC
797
+ {
798
+ public:
799
+ AutoLockJSGC(JSRuntime* rt) : mJSRuntime(rt) { JS_LOCK_GC(mJSRuntime); }
800
+ ~AutoLockJSGC() { JS_UNLOCK_GC(mJSRuntime); }
801
+ private:
802
+ JSRuntime* mJSRuntime;
803
+
804
+ // Disable copy or assignment semantics.
805
+ AutoLockJSGC(const AutoLockJSGC&);
806
+ void operator=(const AutoLockJSGC&);
807
+ };
808
+
809
+ //static
810
+ void
811
+ XPCJSRuntime::WatchdogMain(void *arg)
812
+ {
813
+ XPCJSRuntime* self = static_cast<XPCJSRuntime*>(arg);
814
+
815
+ // Lock lasts until we return
816
+ AutoLockJSGC lock(self->mJSRuntime);
817
+
818
+ while (self->mWatchdogThread)
819
+ {
820
+ #ifdef DEBUG
821
+ PRStatus status =
822
+ #endif
823
+ PR_WaitCondVar(self->mWatchdogWakeup, PR_TicksPerSecond());
824
+ JS_ASSERT(status == PR_SUCCESS);
825
+
826
+ JSContext* cx = nsnull;
827
+ while((cx = js_NextActiveContext(self->mJSRuntime, cx)))
828
+ {
829
+ JS_TriggerOperationCallback(cx);
830
+ }
831
+ }
832
+
833
+ /* Wake up the main thread waiting for the watchdog to terminate. */
834
+ PR_NotifyCondVar(self->mWatchdogWakeup);
835
+ }
836
+
837
+
838
+ /***************************************************************************/
839
+
840
+ #ifdef XPC_CHECK_WRAPPERS_AT_SHUTDOWN
841
+ static JSDHashOperator
842
+ DEBUG_WrapperChecker(JSDHashTable *table, JSDHashEntryHdr *hdr,
843
+ uint32 number, void *arg)
844
+ {
845
+ XPCWrappedNative* wrapper = (XPCWrappedNative*)((JSDHashEntryStub*)hdr)->key;
846
+ NS_ASSERTION(!wrapper->IsValid(), "found a 'valid' wrapper!");
847
+ ++ *((int*)arg);
848
+ return JS_DHASH_NEXT;
849
+ }
850
+ #endif
851
+
852
+ static JSDHashOperator
853
+ WrappedJSShutdownMarker(JSDHashTable *table, JSDHashEntryHdr *hdr,
854
+ uint32 number, void *arg)
855
+ {
856
+ JSRuntime* rt = (JSRuntime*) arg;
857
+ nsXPCWrappedJS* wrapper = ((JSObject2WrappedJSMap::Entry*)hdr)->value;
858
+ NS_ASSERTION(wrapper, "found a null JS wrapper!");
859
+ NS_ASSERTION(wrapper->IsValid(), "found an invalid JS wrapper!");
860
+ wrapper->SystemIsBeingShutDown(rt);
861
+ return JS_DHASH_NEXT;
862
+ }
863
+
864
+ static JSDHashOperator
865
+ DetachedWrappedNativeProtoShutdownMarker(JSDHashTable *table, JSDHashEntryHdr *hdr,
866
+ uint32 number, void *arg)
867
+ {
868
+ XPCWrappedNativeProto* proto =
869
+ (XPCWrappedNativeProto*)((JSDHashEntryStub*)hdr)->key;
870
+
871
+ proto->SystemIsBeingShutDown((JSContext*)arg);
872
+ return JS_DHASH_NEXT;
873
+ }
874
+
875
+ void XPCJSRuntime::SystemIsBeingShutDown(JSContext* cx)
876
+ {
877
+ DOM_ClearInterfaces();
878
+
879
+ if(mDetachedWrappedNativeProtoMap)
880
+ mDetachedWrappedNativeProtoMap->
881
+ Enumerate(DetachedWrappedNativeProtoShutdownMarker, cx);
882
+ }
883
+
884
+ XPCJSRuntime::~XPCJSRuntime()
885
+ {
886
+ if (mWatchdogWakeup)
887
+ {
888
+ // If the watchdog thread is running, tell it to terminate waking it
889
+ // up if necessary and wait until it signals that it finished. As we
890
+ // must release the lock before calling PR_DestroyCondVar, we use an
891
+ // extra block here.
892
+ {
893
+ AutoLockJSGC lock(mJSRuntime);
894
+ if (mWatchdogThread) {
895
+ mWatchdogThread = nsnull;
896
+ PR_NotifyCondVar(mWatchdogWakeup);
897
+ PR_WaitCondVar(mWatchdogWakeup, PR_INTERVAL_NO_TIMEOUT);
898
+ }
899
+ }
900
+ PR_DestroyCondVar(mWatchdogWakeup);
901
+ mWatchdogWakeup = nsnull;
902
+ }
903
+
904
+ #ifdef XPC_DUMP_AT_SHUTDOWN
905
+ {
906
+ // count the total JSContexts in use
907
+ JSContext* iter = nsnull;
908
+ int count = 0;
909
+ while(JS_ContextIterator(mJSRuntime, &iter))
910
+ count ++;
911
+ if(count)
912
+ printf("deleting XPCJSRuntime with %d live JSContexts\n", count);
913
+ }
914
+ #endif
915
+
916
+ // clean up and destroy maps...
917
+ if(mWrappedJSMap)
918
+ {
919
+ #ifdef XPC_DUMP_AT_SHUTDOWN
920
+ uint32 count = mWrappedJSMap->Count();
921
+ if(count)
922
+ printf("deleting XPCJSRuntime with %d live wrapped JSObject\n", (int)count);
923
+ #endif
924
+ mWrappedJSMap->Enumerate(WrappedJSShutdownMarker, mJSRuntime);
925
+ delete mWrappedJSMap;
926
+ }
927
+
928
+ if(mWrappedJSClassMap)
929
+ {
930
+ #ifdef XPC_DUMP_AT_SHUTDOWN
931
+ uint32 count = mWrappedJSClassMap->Count();
932
+ if(count)
933
+ printf("deleting XPCJSRuntime with %d live nsXPCWrappedJSClass\n", (int)count);
934
+ #endif
935
+ delete mWrappedJSClassMap;
936
+ }
937
+
938
+ if(mIID2NativeInterfaceMap)
939
+ {
940
+ #ifdef XPC_DUMP_AT_SHUTDOWN
941
+ uint32 count = mIID2NativeInterfaceMap->Count();
942
+ if(count)
943
+ printf("deleting XPCJSRuntime with %d live XPCNativeInterfaces\n", (int)count);
944
+ #endif
945
+ delete mIID2NativeInterfaceMap;
946
+ }
947
+
948
+ if(mClassInfo2NativeSetMap)
949
+ {
950
+ #ifdef XPC_DUMP_AT_SHUTDOWN
951
+ uint32 count = mClassInfo2NativeSetMap->Count();
952
+ if(count)
953
+ printf("deleting XPCJSRuntime with %d live XPCNativeSets\n", (int)count);
954
+ #endif
955
+ delete mClassInfo2NativeSetMap;
956
+ }
957
+
958
+ if(mNativeSetMap)
959
+ {
960
+ #ifdef XPC_DUMP_AT_SHUTDOWN
961
+ uint32 count = mNativeSetMap->Count();
962
+ if(count)
963
+ printf("deleting XPCJSRuntime with %d live XPCNativeSets\n", (int)count);
964
+ #endif
965
+ delete mNativeSetMap;
966
+ }
967
+
968
+ if(mMapLock)
969
+ XPCAutoLock::DestroyLock(mMapLock);
970
+
971
+ if(mThisTranslatorMap)
972
+ {
973
+ #ifdef XPC_DUMP_AT_SHUTDOWN
974
+ uint32 count = mThisTranslatorMap->Count();
975
+ if(count)
976
+ printf("deleting XPCJSRuntime with %d live ThisTranslator\n", (int)count);
977
+ #endif
978
+ delete mThisTranslatorMap;
979
+ }
980
+
981
+ #ifdef XPC_CHECK_WRAPPERS_AT_SHUTDOWN
982
+ if(DEBUG_WrappedNativeHashtable)
983
+ {
984
+ int LiveWrapperCount = 0;
985
+ JS_DHashTableEnumerate(DEBUG_WrappedNativeHashtable,
986
+ DEBUG_WrapperChecker, &LiveWrapperCount);
987
+ if(LiveWrapperCount)
988
+ printf("deleting XPCJSRuntime with %d live XPCWrappedNative (found in wrapper check)\n", (int)LiveWrapperCount);
989
+ JS_DHashTableDestroy(DEBUG_WrappedNativeHashtable);
990
+ }
991
+ #endif
992
+
993
+ if(mNativeScriptableSharedMap)
994
+ {
995
+ #ifdef XPC_DUMP_AT_SHUTDOWN
996
+ uint32 count = mNativeScriptableSharedMap->Count();
997
+ if(count)
998
+ printf("deleting XPCJSRuntime with %d live XPCNativeScriptableShared\n", (int)count);
999
+ #endif
1000
+ delete mNativeScriptableSharedMap;
1001
+ }
1002
+
1003
+ if(mDyingWrappedNativeProtoMap)
1004
+ {
1005
+ #ifdef XPC_DUMP_AT_SHUTDOWN
1006
+ uint32 count = mDyingWrappedNativeProtoMap->Count();
1007
+ if(count)
1008
+ printf("deleting XPCJSRuntime with %d live but dying XPCWrappedNativeProto\n", (int)count);
1009
+ #endif
1010
+ delete mDyingWrappedNativeProtoMap;
1011
+ }
1012
+
1013
+ if(mDetachedWrappedNativeProtoMap)
1014
+ {
1015
+ #ifdef XPC_DUMP_AT_SHUTDOWN
1016
+ uint32 count = mDetachedWrappedNativeProtoMap->Count();
1017
+ if(count)
1018
+ printf("deleting XPCJSRuntime with %d live detached XPCWrappedNativeProto\n", (int)count);
1019
+ #endif
1020
+ delete mDetachedWrappedNativeProtoMap;
1021
+ }
1022
+
1023
+ if(mExplicitNativeWrapperMap)
1024
+ {
1025
+ #ifdef XPC_DUMP_AT_SHUTDOWN
1026
+ uint32 count = mExplicitNativeWrapperMap->Count();
1027
+ if(count)
1028
+ printf("deleting XPCJSRuntime with %d live explicit XPCNativeWrapper\n", (int)count);
1029
+ #endif
1030
+ delete mExplicitNativeWrapperMap;
1031
+ }
1032
+
1033
+ // unwire the readable/JSString sharing magic
1034
+ XPCStringConvert::ShutdownDOMStringFinalizer();
1035
+
1036
+ XPCConvert::RemoveXPCOMUCStringFinalizer();
1037
+
1038
+ if(mJSHolders.ops)
1039
+ {
1040
+ JS_DHashTableFinish(&mJSHolders);
1041
+ mJSHolders.ops = nsnull;
1042
+ }
1043
+
1044
+ if(mJSRuntime)
1045
+ {
1046
+ JS_DestroyRuntime(mJSRuntime);
1047
+ JS_ShutDown();
1048
+ #ifdef DEBUG_shaver_off
1049
+ fprintf(stderr, "nJRSI: destroyed runtime %p\n", (void *)mJSRuntime);
1050
+ #endif
1051
+ }
1052
+
1053
+ XPCPerThreadData::ShutDown();
1054
+ }
1055
+
1056
+ XPCJSRuntime::XPCJSRuntime(nsXPConnect* aXPConnect)
1057
+ : mXPConnect(aXPConnect),
1058
+ mJSRuntime(nsnull),
1059
+ mWrappedJSMap(JSObject2WrappedJSMap::newMap(XPC_JS_MAP_SIZE)),
1060
+ mWrappedJSClassMap(IID2WrappedJSClassMap::newMap(XPC_JS_CLASS_MAP_SIZE)),
1061
+ mIID2NativeInterfaceMap(IID2NativeInterfaceMap::newMap(XPC_NATIVE_INTERFACE_MAP_SIZE)),
1062
+ mClassInfo2NativeSetMap(ClassInfo2NativeSetMap::newMap(XPC_NATIVE_SET_MAP_SIZE)),
1063
+ mNativeSetMap(NativeSetMap::newMap(XPC_NATIVE_SET_MAP_SIZE)),
1064
+ mThisTranslatorMap(IID2ThisTranslatorMap::newMap(XPC_THIS_TRANSLATOR_MAP_SIZE)),
1065
+ mNativeScriptableSharedMap(XPCNativeScriptableSharedMap::newMap(XPC_NATIVE_JSCLASS_MAP_SIZE)),
1066
+ mDyingWrappedNativeProtoMap(XPCWrappedNativeProtoMap::newMap(XPC_DYING_NATIVE_PROTO_MAP_SIZE)),
1067
+ mDetachedWrappedNativeProtoMap(XPCWrappedNativeProtoMap::newMap(XPC_DETACHED_NATIVE_PROTO_MAP_SIZE)),
1068
+ mExplicitNativeWrapperMap(XPCNativeWrapperMap::newMap(XPC_NATIVE_WRAPPER_MAP_SIZE)),
1069
+ mMapLock(XPCAutoLock::NewLock("XPCJSRuntime::mMapLock")),
1070
+ mThreadRunningGC(nsnull),
1071
+ mWrappedJSToReleaseArray(),
1072
+ mNativesToReleaseArray(),
1073
+ mDoingFinalization(JS_FALSE),
1074
+ mVariantRoots(nsnull),
1075
+ mWrappedJSRoots(nsnull),
1076
+ mObjectHolderRoots(nsnull),
1077
+ mUnrootedGlobalCount(0),
1078
+ mWatchdogWakeup(nsnull),
1079
+ mWatchdogThread(nsnull)
1080
+ {
1081
+ #ifdef XPC_CHECK_WRAPPERS_AT_SHUTDOWN
1082
+ DEBUG_WrappedNativeHashtable =
1083
+ JS_NewDHashTable(JS_DHashGetStubOps(), nsnull,
1084
+ sizeof(JSDHashEntryStub), 128);
1085
+ #endif
1086
+
1087
+ DOM_InitInterfaces();
1088
+
1089
+ // these jsids filled in later when we have a JSContext to work with.
1090
+ mStrIDs[0] = 0;
1091
+
1092
+ mJSRuntime = JS_NewRuntime(32L * 1024L * 1024L); // pref ?
1093
+ if(mJSRuntime)
1094
+ {
1095
+ // Unconstrain the runtime's threshold on nominal heap size, to avoid
1096
+ // triggering GC too often if operating continuously near an arbitrary
1097
+ // finite threshold (0xffffffff is infinity for uint32 parameters).
1098
+ // This leaves the maximum-JS_malloc-bytes threshold still in effect
1099
+ // to cause period, and we hope hygienic, last-ditch GCs from within
1100
+ // the GC's allocator.
1101
+ JS_SetGCParameter(mJSRuntime, JSGC_MAX_BYTES, 0xffffffff);
1102
+ JS_SetContextCallback(mJSRuntime, ContextCallback);
1103
+ JS_SetGCCallbackRT(mJSRuntime, GCCallback);
1104
+ JS_SetExtraGCRoots(mJSRuntime, TraceJS, this);
1105
+ mWatchdogWakeup = JS_NEW_CONDVAR(mJSRuntime->gcLock);
1106
+ }
1107
+
1108
+ if(!JS_DHashTableInit(&mJSHolders, JS_DHashGetStubOps(), nsnull,
1109
+ sizeof(ObjectHolder), 512))
1110
+ mJSHolders.ops = nsnull;
1111
+
1112
+ // Install a JavaScript 'debugger' keyword handler in debug builds only
1113
+ #ifdef DEBUG
1114
+ if(mJSRuntime && !JS_GetGlobalDebugHooks(mJSRuntime)->debuggerHandler)
1115
+ xpc_InstallJSDebuggerKeywordHandler(mJSRuntime);
1116
+ #endif
1117
+
1118
+ AutoLockJSGC lock(mJSRuntime);
1119
+
1120
+ mWatchdogThread = PR_CreateThread(PR_USER_THREAD, WatchdogMain, this,
1121
+ PR_PRIORITY_NORMAL, PR_LOCAL_THREAD,
1122
+ PR_UNJOINABLE_THREAD, 0);
1123
+ }
1124
+
1125
+ // static
1126
+ XPCJSRuntime*
1127
+ XPCJSRuntime::newXPCJSRuntime(nsXPConnect* aXPConnect)
1128
+ {
1129
+ NS_PRECONDITION(aXPConnect,"bad param");
1130
+
1131
+ XPCJSRuntime* self = new XPCJSRuntime(aXPConnect);
1132
+
1133
+ if(self &&
1134
+ self->GetJSRuntime() &&
1135
+ self->GetWrappedJSMap() &&
1136
+ self->GetWrappedJSClassMap() &&
1137
+ self->GetIID2NativeInterfaceMap() &&
1138
+ self->GetClassInfo2NativeSetMap() &&
1139
+ self->GetNativeSetMap() &&
1140
+ self->GetThisTranslatorMap() &&
1141
+ self->GetNativeScriptableSharedMap() &&
1142
+ self->GetDyingWrappedNativeProtoMap() &&
1143
+ self->GetExplicitNativeWrapperMap() &&
1144
+ self->GetMapLock() &&
1145
+ self->mWatchdogThread)
1146
+ {
1147
+ return self;
1148
+ }
1149
+ delete self;
1150
+ return nsnull;
1151
+ }
1152
+
1153
+ JSBool
1154
+ XPCJSRuntime::OnJSContextNew(JSContext *cx)
1155
+ {
1156
+ // if it is our first context then we need to generate our string ids
1157
+ JSBool ok = JS_TRUE;
1158
+ if(!mStrIDs[0])
1159
+ {
1160
+ JS_SetGCParameterForThread(cx, JSGC_MAX_CODE_CACHE_BYTES, 16 * 1024 * 1024);
1161
+ JSAutoRequest ar(cx);
1162
+ for(uintN i = 0; i < IDX_TOTAL_COUNT; i++)
1163
+ {
1164
+ JSString* str = JS_InternString(cx, mStrings[i]);
1165
+ if(!str || !JS_ValueToId(cx, STRING_TO_JSVAL(str), &mStrIDs[i]))
1166
+ {
1167
+ mStrIDs[0] = 0;
1168
+ ok = JS_FALSE;
1169
+ break;
1170
+ }
1171
+ mStrJSVals[i] = STRING_TO_JSVAL(str);
1172
+ }
1173
+ }
1174
+ if (!ok)
1175
+ return JS_FALSE;
1176
+
1177
+ XPCPerThreadData* tls = XPCPerThreadData::GetData(cx);
1178
+ if(!tls)
1179
+ return JS_FALSE;
1180
+
1181
+ XPCContext* xpc = new XPCContext(this, cx);
1182
+ if (!xpc)
1183
+ return JS_FALSE;
1184
+
1185
+ JS_SetThreadStackLimit(cx, tls->GetStackLimit());
1186
+ JS_SetScriptStackQuota(cx, 100*1024*1024);
1187
+ return JS_TRUE;
1188
+ }
1189
+
1190
+ JSBool
1191
+ XPCJSRuntime::DeferredRelease(nsISupports* obj)
1192
+ {
1193
+ NS_ASSERTION(obj, "bad param");
1194
+
1195
+ if(!mNativesToReleaseArray.Count())
1196
+ {
1197
+ // This array sometimes has 1000's
1198
+ // of entries, and usually has 50-200 entries. Avoid lots
1199
+ // of incremental grows. We compact it down when we're done.
1200
+ mNativesToReleaseArray.SizeTo(256);
1201
+ }
1202
+ return mNativesToReleaseArray.AppendElement(obj);
1203
+ }
1204
+
1205
+ /***************************************************************************/
1206
+
1207
+ #ifdef DEBUG
1208
+ static JSDHashOperator
1209
+ WrappedJSClassMapDumpEnumerator(JSDHashTable *table, JSDHashEntryHdr *hdr,
1210
+ uint32 number, void *arg)
1211
+ {
1212
+ ((IID2WrappedJSClassMap::Entry*)hdr)->value->DebugDump(*(PRInt16*)arg);
1213
+ return JS_DHASH_NEXT;
1214
+ }
1215
+ static JSDHashOperator
1216
+ WrappedJSMapDumpEnumerator(JSDHashTable *table, JSDHashEntryHdr *hdr,
1217
+ uint32 number, void *arg)
1218
+ {
1219
+ ((JSObject2WrappedJSMap::Entry*)hdr)->value->DebugDump(*(PRInt16*)arg);
1220
+ return JS_DHASH_NEXT;
1221
+ }
1222
+ static JSDHashOperator
1223
+ NativeSetDumpEnumerator(JSDHashTable *table, JSDHashEntryHdr *hdr,
1224
+ uint32 number, void *arg)
1225
+ {
1226
+ ((NativeSetMap::Entry*)hdr)->key_value->DebugDump(*(PRInt16*)arg);
1227
+ return JS_DHASH_NEXT;
1228
+ }
1229
+ #endif
1230
+
1231
+ void
1232
+ XPCJSRuntime::DebugDump(PRInt16 depth)
1233
+ {
1234
+ #ifdef DEBUG
1235
+ depth--;
1236
+ XPC_LOG_ALWAYS(("XPCJSRuntime @ %x", this));
1237
+ XPC_LOG_INDENT();
1238
+ XPC_LOG_ALWAYS(("mXPConnect @ %x", mXPConnect));
1239
+ XPC_LOG_ALWAYS(("mJSRuntime @ %x", mJSRuntime));
1240
+ XPC_LOG_ALWAYS(("mMapLock @ %x", mMapLock));
1241
+
1242
+ XPC_LOG_ALWAYS(("mWrappedJSToReleaseArray @ %x with %d wrappers(s)", \
1243
+ &mWrappedJSToReleaseArray,
1244
+ mWrappedJSToReleaseArray.Count()));
1245
+
1246
+ int cxCount = 0;
1247
+ JSContext* iter = nsnull;
1248
+ while(JS_ContextIterator(mJSRuntime, &iter))
1249
+ ++cxCount;
1250
+ XPC_LOG_ALWAYS(("%d JS context(s)", cxCount));
1251
+
1252
+ iter = nsnull;
1253
+ while(JS_ContextIterator(mJSRuntime, &iter))
1254
+ {
1255
+ XPCContext *xpc = XPCContext::GetXPCContext(iter);
1256
+ XPC_LOG_INDENT();
1257
+ xpc->DebugDump(depth);
1258
+ XPC_LOG_OUTDENT();
1259
+ }
1260
+
1261
+ XPC_LOG_ALWAYS(("mWrappedJSClassMap @ %x with %d wrapperclasses(s)", \
1262
+ mWrappedJSClassMap, mWrappedJSClassMap ? \
1263
+ mWrappedJSClassMap->Count() : 0));
1264
+ // iterate wrappersclasses...
1265
+ if(depth && mWrappedJSClassMap && mWrappedJSClassMap->Count())
1266
+ {
1267
+ XPC_LOG_INDENT();
1268
+ mWrappedJSClassMap->Enumerate(WrappedJSClassMapDumpEnumerator, &depth);
1269
+ XPC_LOG_OUTDENT();
1270
+ }
1271
+ XPC_LOG_ALWAYS(("mWrappedJSMap @ %x with %d wrappers(s)", \
1272
+ mWrappedJSMap, mWrappedJSMap ? \
1273
+ mWrappedJSMap->Count() : 0));
1274
+ // iterate wrappers...
1275
+ if(depth && mWrappedJSMap && mWrappedJSMap->Count())
1276
+ {
1277
+ XPC_LOG_INDENT();
1278
+ mWrappedJSMap->Enumerate(WrappedJSMapDumpEnumerator, &depth);
1279
+ XPC_LOG_OUTDENT();
1280
+ }
1281
+
1282
+ XPC_LOG_ALWAYS(("mIID2NativeInterfaceMap @ %x with %d interface(s)", \
1283
+ mIID2NativeInterfaceMap, mIID2NativeInterfaceMap ? \
1284
+ mIID2NativeInterfaceMap->Count() : 0));
1285
+
1286
+ XPC_LOG_ALWAYS(("mClassInfo2NativeSetMap @ %x with %d sets(s)", \
1287
+ mClassInfo2NativeSetMap, mClassInfo2NativeSetMap ? \
1288
+ mClassInfo2NativeSetMap->Count() : 0));
1289
+
1290
+ XPC_LOG_ALWAYS(("mThisTranslatorMap @ %x with %d translator(s)", \
1291
+ mThisTranslatorMap, mThisTranslatorMap ? \
1292
+ mThisTranslatorMap->Count() : 0));
1293
+
1294
+ XPC_LOG_ALWAYS(("mNativeSetMap @ %x with %d sets(s)", \
1295
+ mNativeSetMap, mNativeSetMap ? \
1296
+ mNativeSetMap->Count() : 0));
1297
+
1298
+ // iterate sets...
1299
+ if(depth && mNativeSetMap && mNativeSetMap->Count())
1300
+ {
1301
+ XPC_LOG_INDENT();
1302
+ mNativeSetMap->Enumerate(NativeSetDumpEnumerator, &depth);
1303
+ XPC_LOG_OUTDENT();
1304
+ }
1305
+
1306
+ XPC_LOG_OUTDENT();
1307
+ #endif
1308
+ }
1309
+
1310
+ /***************************************************************************/
1311
+
1312
+ void
1313
+ XPCRootSetElem::AddToRootSet(JSRuntime* rt, XPCRootSetElem** listHead)
1314
+ {
1315
+ NS_ASSERTION(!mSelfp, "Must be not linked");
1316
+
1317
+ AutoLockJSGC lock(rt);
1318
+ mSelfp = listHead;
1319
+ mNext = *listHead;
1320
+ if(mNext)
1321
+ {
1322
+ NS_ASSERTION(mNext->mSelfp == listHead, "Must be list start");
1323
+ mNext->mSelfp = &mNext;
1324
+ }
1325
+ *listHead = this;
1326
+ }
1327
+
1328
+ void
1329
+ XPCRootSetElem::RemoveFromRootSet(JSRuntime* rt)
1330
+ {
1331
+ NS_ASSERTION(mSelfp, "Must be linked");
1332
+
1333
+ AutoLockJSGC lock(rt);
1334
+ NS_ASSERTION(*mSelfp == this, "Link invariant");
1335
+ *mSelfp = mNext;
1336
+ if(mNext)
1337
+ mNext->mSelfp = mSelfp;
1338
+ #ifdef DEBUG
1339
+ mSelfp = nsnull;
1340
+ mNext = nsnull;
1341
+ #endif
1342
+ }