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,1337 @@
1
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
+ * vim: set ts=8 sw=4 et tw=78:
3
+ *
4
+ * ***** BEGIN LICENSE BLOCK *****
5
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6
+ *
7
+ * The contents of this file are subject to the Mozilla Public License Version
8
+ * 1.1 (the "License"); you may not use this file except in compliance with
9
+ * the License. You may obtain a copy of the License at
10
+ * http://www.mozilla.org/MPL/
11
+ *
12
+ * Software distributed under the License is distributed on an "AS IS" basis,
13
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14
+ * for the specific language governing rights and limitations under the
15
+ * License.
16
+ *
17
+ * The Original Code is Mozilla Communicator client code, released
18
+ * March 31, 1998.
19
+ *
20
+ * The Initial Developer of the Original Code is
21
+ * Netscape Communications Corporation.
22
+ * Portions created by the Initial Developer are Copyright (C) 1998
23
+ * the Initial Developer. All Rights Reserved.
24
+ *
25
+ * Contributor(s):
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
+ /*
42
+ * JS standard exception implementation.
43
+ */
44
+
45
+ #include "jsstddef.h"
46
+ #include <stdlib.h>
47
+ #include <string.h>
48
+ #include "jstypes.h"
49
+ #include "jsbit.h"
50
+ #include "jsutil.h" /* Added by JSIFY */
51
+ #include "jsprf.h"
52
+ #include "jsapi.h"
53
+ #include "jscntxt.h"
54
+ #include "jsversion.h"
55
+ #include "jsdbgapi.h"
56
+ #include "jsexn.h"
57
+ #include "jsfun.h"
58
+ #include "jsinterp.h"
59
+ #include "jsnum.h"
60
+ #include "jsobj.h"
61
+ #include "jsopcode.h"
62
+ #include "jsscope.h"
63
+ #include "jsscript.h"
64
+ #include "jsstaticcheck.h"
65
+
66
+ /* Forward declarations for js_ErrorClass's initializer. */
67
+ static JSBool
68
+ Exception(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
69
+
70
+ static void
71
+ exn_trace(JSTracer *trc, JSObject *obj);
72
+
73
+ static void
74
+ exn_finalize(JSContext *cx, JSObject *obj);
75
+
76
+ static JSBool
77
+ exn_enumerate(JSContext *cx, JSObject *obj);
78
+
79
+ static JSBool
80
+ exn_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
81
+ JSObject **objp);
82
+
83
+ JSClass js_ErrorClass = {
84
+ js_Error_str,
85
+ JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE | JSCLASS_MARK_IS_TRACE |
86
+ JSCLASS_HAS_CACHED_PROTO(JSProto_Error),
87
+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
88
+ exn_enumerate, (JSResolveOp)exn_resolve, JS_ConvertStub, exn_finalize,
89
+ NULL, NULL, NULL, Exception,
90
+ NULL, NULL, JS_CLASS_TRACE(exn_trace), NULL
91
+ };
92
+
93
+ typedef struct JSStackTraceElem {
94
+ JSString *funName;
95
+ size_t argc;
96
+ const char *filename;
97
+ uintN ulineno;
98
+ } JSStackTraceElem;
99
+
100
+ typedef struct JSExnPrivate {
101
+ /* A copy of the JSErrorReport originally generated. */
102
+ JSErrorReport *errorReport;
103
+ JSString *message;
104
+ JSString *filename;
105
+ uintN lineno;
106
+ size_t stackDepth;
107
+ JSStackTraceElem stackElems[1];
108
+ } JSExnPrivate;
109
+
110
+ static JSString *
111
+ StackTraceToString(JSContext *cx, JSExnPrivate *priv);
112
+
113
+ static JSErrorReport *
114
+ CopyErrorReport(JSContext *cx, JSErrorReport *report)
115
+ {
116
+ /*
117
+ * We use a single malloc block to make a deep copy of JSErrorReport with
118
+ * the following layout:
119
+ * JSErrorReport
120
+ * array of copies of report->messageArgs
121
+ * jschar array with characters for all messageArgs
122
+ * jschar array with characters for ucmessage
123
+ * jschar array with characters for uclinebuf and uctokenptr
124
+ * char array with characters for linebuf and tokenptr
125
+ * char array with characters for filename
126
+ * Such layout together with the properties enforced by the following
127
+ * asserts does not need any extra alignment padding.
128
+ */
129
+ JS_STATIC_ASSERT(sizeof(JSErrorReport) % sizeof(const char *) == 0);
130
+ JS_STATIC_ASSERT(sizeof(const char *) % sizeof(jschar) == 0);
131
+
132
+ size_t filenameSize;
133
+ size_t linebufSize;
134
+ size_t uclinebufSize;
135
+ size_t ucmessageSize;
136
+ size_t i, argsArraySize, argsCopySize, argSize;
137
+ size_t mallocSize;
138
+ JSErrorReport *copy;
139
+ uint8 *cursor;
140
+
141
+ #define JS_CHARS_SIZE(jschars) ((js_strlen(jschars) + 1) * sizeof(jschar))
142
+
143
+ filenameSize = report->filename ? strlen(report->filename) + 1 : 0;
144
+ linebufSize = report->linebuf ? strlen(report->linebuf) + 1 : 0;
145
+ uclinebufSize = report->uclinebuf ? JS_CHARS_SIZE(report->uclinebuf) : 0;
146
+ ucmessageSize = 0;
147
+ argsArraySize = 0;
148
+ argsCopySize = 0;
149
+ if (report->ucmessage) {
150
+ ucmessageSize = JS_CHARS_SIZE(report->ucmessage);
151
+ if (report->messageArgs) {
152
+ for (i = 0; report->messageArgs[i]; ++i)
153
+ argsCopySize += JS_CHARS_SIZE(report->messageArgs[i]);
154
+
155
+ /* Non-null messageArgs should have at least one non-null arg. */
156
+ JS_ASSERT(i != 0);
157
+ argsArraySize = (i + 1) * sizeof(const jschar *);
158
+ }
159
+ }
160
+
161
+ /*
162
+ * The mallocSize can not overflow since it represents the sum of the
163
+ * sizes of already allocated objects.
164
+ */
165
+ mallocSize = sizeof(JSErrorReport) + argsArraySize + argsCopySize +
166
+ ucmessageSize + uclinebufSize + linebufSize + filenameSize;
167
+ cursor = (uint8 *)JS_malloc(cx, mallocSize);
168
+ if (!cursor)
169
+ return NULL;
170
+
171
+ copy = (JSErrorReport *)cursor;
172
+ memset(cursor, 0, sizeof(JSErrorReport));
173
+ cursor += sizeof(JSErrorReport);
174
+
175
+ if (argsArraySize != 0) {
176
+ copy->messageArgs = (const jschar **)cursor;
177
+ cursor += argsArraySize;
178
+ for (i = 0; report->messageArgs[i]; ++i) {
179
+ copy->messageArgs[i] = (const jschar *)cursor;
180
+ argSize = JS_CHARS_SIZE(report->messageArgs[i]);
181
+ memcpy(cursor, report->messageArgs[i], argSize);
182
+ cursor += argSize;
183
+ }
184
+ copy->messageArgs[i] = NULL;
185
+ JS_ASSERT(cursor == (uint8 *)copy->messageArgs[0] + argsCopySize);
186
+ }
187
+
188
+ if (report->ucmessage) {
189
+ copy->ucmessage = (const jschar *)cursor;
190
+ memcpy(cursor, report->ucmessage, ucmessageSize);
191
+ cursor += ucmessageSize;
192
+ }
193
+
194
+ if (report->uclinebuf) {
195
+ copy->uclinebuf = (const jschar *)cursor;
196
+ memcpy(cursor, report->uclinebuf, uclinebufSize);
197
+ cursor += uclinebufSize;
198
+ if (report->uctokenptr) {
199
+ copy->uctokenptr = copy->uclinebuf + (report->uctokenptr -
200
+ report->uclinebuf);
201
+ }
202
+ }
203
+
204
+ if (report->linebuf) {
205
+ copy->linebuf = (const char *)cursor;
206
+ memcpy(cursor, report->linebuf, linebufSize);
207
+ cursor += linebufSize;
208
+ if (report->tokenptr) {
209
+ copy->tokenptr = copy->linebuf + (report->tokenptr -
210
+ report->linebuf);
211
+ }
212
+ }
213
+
214
+ if (report->filename) {
215
+ copy->filename = (const char *)cursor;
216
+ memcpy(cursor, report->filename, filenameSize);
217
+ }
218
+ JS_ASSERT(cursor + filenameSize == (uint8 *)copy + mallocSize);
219
+
220
+ /* Copy non-pointer members. */
221
+ copy->lineno = report->lineno;
222
+ copy->errorNumber = report->errorNumber;
223
+
224
+ /* Note that this is before it gets flagged with JSREPORT_EXCEPTION */
225
+ copy->flags = report->flags;
226
+
227
+ #undef JS_CHARS_SIZE
228
+ return copy;
229
+ }
230
+
231
+ static jsval *
232
+ GetStackTraceValueBuffer(JSExnPrivate *priv)
233
+ {
234
+ /*
235
+ * We use extra memory after JSExnPrivateInfo.stackElems to store jsvals
236
+ * that helps to produce more informative stack traces. The following
237
+ * assert allows us to assume that no gap after stackElems is necessary to
238
+ * align the buffer properly.
239
+ */
240
+ JS_STATIC_ASSERT(sizeof(JSStackTraceElem) % sizeof(jsval) == 0);
241
+
242
+ return (jsval *)(priv->stackElems + priv->stackDepth);
243
+ }
244
+
245
+ static JSBool
246
+ InitExnPrivate(JSContext *cx, JSObject *exnObject, JSString *message,
247
+ JSString *filename, uintN lineno, JSErrorReport *report)
248
+ {
249
+ JSSecurityCallbacks *callbacks;
250
+ JSCheckAccessOp checkAccess;
251
+ JSErrorReporter older;
252
+ JSExceptionState *state;
253
+ jsval callerid, v;
254
+ JSStackFrame *fp, *fpstop;
255
+ size_t stackDepth, valueCount, size;
256
+ JSBool overflow;
257
+ JSExnPrivate *priv;
258
+ JSStackTraceElem *elem;
259
+ jsval *values;
260
+
261
+ JS_ASSERT(OBJ_GET_CLASS(cx, exnObject) == &js_ErrorClass);
262
+
263
+ /*
264
+ * Prepare stack trace data.
265
+ *
266
+ * Set aside any error reporter for cx and save its exception state
267
+ * so we can suppress any checkAccess failures. Such failures should stop
268
+ * the backtrace procedure, not result in a failure of this constructor.
269
+ */
270
+ callbacks = JS_GetSecurityCallbacks(cx);
271
+ checkAccess = callbacks
272
+ ? callbacks->checkObjectAccess
273
+ : NULL;
274
+ older = JS_SetErrorReporter(cx, NULL);
275
+ state = JS_SaveExceptionState(cx);
276
+
277
+ callerid = ATOM_KEY(cx->runtime->atomState.callerAtom);
278
+ stackDepth = 0;
279
+ valueCount = 0;
280
+ for (fp = js_GetTopStackFrame(cx); fp; fp = fp->down) {
281
+ if (fp->fun && fp->argv) {
282
+ v = JSVAL_NULL;
283
+ if (checkAccess &&
284
+ !checkAccess(cx, fp->callee, callerid, JSACC_READ, &v)) {
285
+ break;
286
+ }
287
+ valueCount += fp->argc;
288
+ }
289
+ ++stackDepth;
290
+ }
291
+ JS_RestoreExceptionState(cx, state);
292
+ JS_SetErrorReporter(cx, older);
293
+ fpstop = fp;
294
+
295
+ size = offsetof(JSExnPrivate, stackElems);
296
+ overflow = (stackDepth > ((size_t)-1 - size) / sizeof(JSStackTraceElem));
297
+ size += stackDepth * sizeof(JSStackTraceElem);
298
+ overflow |= (valueCount > ((size_t)-1 - size) / sizeof(jsval));
299
+ size += valueCount * sizeof(jsval);
300
+ if (overflow) {
301
+ js_ReportAllocationOverflow(cx);
302
+ return JS_FALSE;
303
+ }
304
+ priv = (JSExnPrivate *)JS_malloc(cx, size);
305
+ if (!priv)
306
+ return JS_FALSE;
307
+
308
+ /*
309
+ * We initialize errorReport with a copy of report after setting the
310
+ * private slot, to prevent GC accessing a junk value we clear the field
311
+ * here.
312
+ */
313
+ priv->errorReport = NULL;
314
+ priv->message = message;
315
+ priv->filename = filename;
316
+ priv->lineno = lineno;
317
+ priv->stackDepth = stackDepth;
318
+
319
+ values = GetStackTraceValueBuffer(priv);
320
+ elem = priv->stackElems;
321
+ for (fp = js_GetTopStackFrame(cx); fp != fpstop; fp = fp->down) {
322
+ if (!fp->fun) {
323
+ elem->funName = NULL;
324
+ elem->argc = 0;
325
+ } else {
326
+ elem->funName = fp->fun->atom
327
+ ? ATOM_TO_STRING(fp->fun->atom)
328
+ : cx->runtime->emptyString;
329
+ elem->argc = fp->argc;
330
+ memcpy(values, fp->argv, fp->argc * sizeof(jsval));
331
+ values += fp->argc;
332
+ }
333
+ elem->ulineno = 0;
334
+ elem->filename = NULL;
335
+ if (fp->script) {
336
+ elem->filename = fp->script->filename;
337
+ if (fp->regs)
338
+ elem->ulineno = js_FramePCToLineNumber(cx, fp);
339
+ }
340
+ ++elem;
341
+ }
342
+ JS_ASSERT(priv->stackElems + stackDepth == elem);
343
+ JS_ASSERT(GetStackTraceValueBuffer(priv) + valueCount == values);
344
+
345
+ STOBJ_SET_SLOT(exnObject, JSSLOT_PRIVATE, PRIVATE_TO_JSVAL(priv));
346
+
347
+ if (report) {
348
+ /*
349
+ * Construct a new copy of the error report struct. We can't use the
350
+ * error report struct that was passed in, because it's allocated on
351
+ * the stack, and also because it may point to transient data in the
352
+ * JSTokenStream.
353
+ */
354
+ priv->errorReport = CopyErrorReport(cx, report);
355
+ if (!priv->errorReport) {
356
+ /* The finalizer realeases priv since it is in the private slot. */
357
+ return JS_FALSE;
358
+ }
359
+ }
360
+
361
+ return JS_TRUE;
362
+ }
363
+
364
+ static JSExnPrivate *
365
+ GetExnPrivate(JSContext *cx, JSObject *obj)
366
+ {
367
+ jsval privateValue;
368
+ JSExnPrivate *priv;
369
+
370
+ JS_ASSERT(OBJ_GET_CLASS(cx, obj) == &js_ErrorClass);
371
+ privateValue = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE);
372
+ if (JSVAL_IS_VOID(privateValue))
373
+ return NULL;
374
+ priv = (JSExnPrivate *)JSVAL_TO_PRIVATE(privateValue);
375
+ JS_ASSERT(priv);
376
+ return priv;
377
+ }
378
+
379
+ static void
380
+ exn_trace(JSTracer *trc, JSObject *obj)
381
+ {
382
+ JSExnPrivate *priv;
383
+ JSStackTraceElem *elem;
384
+ size_t vcount, i;
385
+ jsval *vp, v;
386
+
387
+ priv = GetExnPrivate(trc->context, obj);
388
+ if (priv) {
389
+ if (priv->message)
390
+ JS_CALL_STRING_TRACER(trc, priv->message, "exception message");
391
+ if (priv->filename)
392
+ JS_CALL_STRING_TRACER(trc, priv->filename, "exception filename");
393
+
394
+ elem = priv->stackElems;
395
+ for (vcount = i = 0; i != priv->stackDepth; ++i, ++elem) {
396
+ if (elem->funName) {
397
+ JS_CALL_STRING_TRACER(trc, elem->funName,
398
+ "stack trace function name");
399
+ }
400
+ if (IS_GC_MARKING_TRACER(trc) && elem->filename)
401
+ js_MarkScriptFilename(elem->filename);
402
+ vcount += elem->argc;
403
+ }
404
+ vp = GetStackTraceValueBuffer(priv);
405
+ for (i = 0; i != vcount; ++i, ++vp) {
406
+ v = *vp;
407
+ JS_CALL_VALUE_TRACER(trc, v, "stack trace argument");
408
+ }
409
+ }
410
+ }
411
+
412
+ static void
413
+ exn_finalize(JSContext *cx, JSObject *obj)
414
+ {
415
+ JSExnPrivate *priv;
416
+
417
+ priv = GetExnPrivate(cx, obj);
418
+ if (priv) {
419
+ if (priv->errorReport)
420
+ JS_free(cx, priv->errorReport);
421
+ JS_free(cx, priv);
422
+ }
423
+ }
424
+
425
+ static JSBool
426
+ exn_enumerate(JSContext *cx, JSObject *obj)
427
+ {
428
+ JSAtomState *atomState;
429
+ uintN i;
430
+ JSAtom *atom;
431
+ JSObject *pobj;
432
+ JSProperty *prop;
433
+
434
+ JS_STATIC_ASSERT(sizeof(JSAtomState) <= (size_t)(uint16)-1);
435
+ static const uint16 offsets[] = {
436
+ (uint16)offsetof(JSAtomState, messageAtom),
437
+ (uint16)offsetof(JSAtomState, fileNameAtom),
438
+ (uint16)offsetof(JSAtomState, lineNumberAtom),
439
+ (uint16)offsetof(JSAtomState, stackAtom),
440
+ };
441
+
442
+ atomState = &cx->runtime->atomState;
443
+ for (i = 0; i != JS_ARRAY_LENGTH(offsets); ++i) {
444
+ atom = *(JSAtom **)((uint8 *)atomState + offsets[i]);
445
+ if (!js_LookupProperty(cx, obj, ATOM_TO_JSID(atom), &pobj, &prop))
446
+ return JS_FALSE;
447
+ if (prop)
448
+ OBJ_DROP_PROPERTY(cx, pobj, prop);
449
+ }
450
+ return JS_TRUE;
451
+ }
452
+
453
+ static JSBool
454
+ exn_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
455
+ JSObject **objp)
456
+ {
457
+ JSExnPrivate *priv;
458
+ JSString *str;
459
+ JSAtom *atom;
460
+ JSString *stack;
461
+ const char *prop;
462
+ jsval v;
463
+
464
+ *objp = NULL;
465
+ priv = GetExnPrivate(cx, obj);
466
+ if (priv && JSVAL_IS_STRING(id)) {
467
+ str = JSVAL_TO_STRING(id);
468
+
469
+ atom = cx->runtime->atomState.messageAtom;
470
+ if (str == ATOM_TO_STRING(atom)) {
471
+ prop = js_message_str;
472
+ v = STRING_TO_JSVAL(priv->message);
473
+ goto define;
474
+ }
475
+
476
+ atom = cx->runtime->atomState.fileNameAtom;
477
+ if (str == ATOM_TO_STRING(atom)) {
478
+ prop = js_fileName_str;
479
+ v = STRING_TO_JSVAL(priv->filename);
480
+ goto define;
481
+ }
482
+
483
+ atom = cx->runtime->atomState.lineNumberAtom;
484
+ if (str == ATOM_TO_STRING(atom)) {
485
+ prop = js_lineNumber_str;
486
+ v = INT_TO_JSVAL(priv->lineno);
487
+ goto define;
488
+ }
489
+
490
+ atom = cx->runtime->atomState.stackAtom;
491
+ if (str == ATOM_TO_STRING(atom)) {
492
+ stack = StackTraceToString(cx, priv);
493
+ if (!stack)
494
+ return JS_FALSE;
495
+
496
+ /* Allow to GC all things that were used to build stack trace. */
497
+ priv->stackDepth = 0;
498
+ prop = js_stack_str;
499
+ v = STRING_TO_JSVAL(stack);
500
+ goto define;
501
+ }
502
+ }
503
+ return JS_TRUE;
504
+
505
+ define:
506
+ if (!JS_DefineProperty(cx, obj, prop, v, NULL, NULL, JSPROP_ENUMERATE))
507
+ return JS_FALSE;
508
+ *objp = obj;
509
+ return JS_TRUE;
510
+ }
511
+
512
+ JSErrorReport *
513
+ js_ErrorFromException(JSContext *cx, jsval exn)
514
+ {
515
+ JSObject *obj;
516
+ JSExnPrivate *priv;
517
+
518
+ if (JSVAL_IS_PRIMITIVE(exn))
519
+ return NULL;
520
+ obj = JSVAL_TO_OBJECT(exn);
521
+ if (OBJ_GET_CLASS(cx, obj) != &js_ErrorClass)
522
+ return NULL;
523
+ priv = GetExnPrivate(cx, obj);
524
+ if (!priv)
525
+ return NULL;
526
+ return priv->errorReport;
527
+ }
528
+
529
+ static JSString *
530
+ ValueToShortSource(JSContext *cx, jsval v)
531
+ {
532
+ JSString *str;
533
+
534
+ /* Avoid toSource bloat and fallibility for object types. */
535
+ if (JSVAL_IS_PRIMITIVE(v)) {
536
+ str = js_ValueToSource(cx, v);
537
+ } else if (VALUE_IS_FUNCTION(cx, v)) {
538
+ /*
539
+ * XXX Avoid function decompilation bloat for now.
540
+ */
541
+ str = JS_GetFunctionId(JS_ValueToFunction(cx, v));
542
+ if (!str && !(str = js_ValueToSource(cx, v))) {
543
+ /*
544
+ * Continue to soldier on if the function couldn't be
545
+ * converted into a string.
546
+ */
547
+ JS_ClearPendingException(cx);
548
+ str = JS_NewStringCopyZ(cx, "[unknown function]");
549
+ }
550
+ } else {
551
+ /*
552
+ * XXX Avoid toString on objects, it takes too long and uses too much
553
+ * memory, for too many classes (see Mozilla bug 166743).
554
+ */
555
+ char buf[100];
556
+ JS_snprintf(buf, sizeof buf, "[object %s]",
557
+ OBJ_GET_CLASS(cx, JSVAL_TO_OBJECT(v))->name);
558
+ str = JS_NewStringCopyZ(cx, buf);
559
+ }
560
+ return str;
561
+ }
562
+
563
+ static JSString *
564
+ StackTraceToString(JSContext *cx, JSExnPrivate *priv)
565
+ {
566
+ jschar *stackbuf;
567
+ size_t stacklen, stackmax;
568
+ JSStackTraceElem *elem, *endElem;
569
+ jsval *values;
570
+ size_t i;
571
+ JSString *str;
572
+ const char *cp;
573
+ char ulnbuf[11];
574
+
575
+ /* After this point, failing control flow must goto bad. */
576
+ stackbuf = NULL;
577
+ stacklen = stackmax = 0;
578
+
579
+ /* Limit the stackbuf length to a reasonable value to avoid overflow checks. */
580
+ #define STACK_LENGTH_LIMIT JS_BIT(20)
581
+
582
+ #define APPEND_CHAR_TO_STACK(c) \
583
+ JS_BEGIN_MACRO \
584
+ if (stacklen == stackmax) { \
585
+ void *ptr_; \
586
+ if (stackmax >= STACK_LENGTH_LIMIT) \
587
+ goto done; \
588
+ stackmax = stackmax ? 2 * stackmax : 64; \
589
+ ptr_ = JS_realloc(cx, stackbuf, (stackmax+1) * sizeof(jschar)); \
590
+ if (!ptr_) \
591
+ goto bad; \
592
+ stackbuf = (jschar *) ptr_; \
593
+ } \
594
+ stackbuf[stacklen++] = (c); \
595
+ JS_END_MACRO
596
+
597
+ #define APPEND_STRING_TO_STACK(str) \
598
+ JS_BEGIN_MACRO \
599
+ JSString *str_ = str; \
600
+ jschar *chars_; \
601
+ size_t length_; \
602
+ \
603
+ JSSTRING_CHARS_AND_LENGTH(str_, chars_, length_); \
604
+ if (length_ > stackmax - stacklen) { \
605
+ void *ptr_; \
606
+ if (stackmax >= STACK_LENGTH_LIMIT || \
607
+ length_ >= STACK_LENGTH_LIMIT - stacklen) { \
608
+ goto done; \
609
+ } \
610
+ stackmax = JS_BIT(JS_CeilingLog2(stacklen + length_)); \
611
+ ptr_ = JS_realloc(cx, stackbuf, (stackmax+1) * sizeof(jschar)); \
612
+ if (!ptr_) \
613
+ goto bad; \
614
+ stackbuf = (jschar *) ptr_; \
615
+ } \
616
+ js_strncpy(stackbuf + stacklen, chars_, length_); \
617
+ stacklen += length_; \
618
+ JS_END_MACRO
619
+
620
+ values = GetStackTraceValueBuffer(priv);
621
+ elem = priv->stackElems;
622
+ for (endElem = elem + priv->stackDepth; elem != endElem; elem++) {
623
+ if (elem->funName) {
624
+ APPEND_STRING_TO_STACK(elem->funName);
625
+ APPEND_CHAR_TO_STACK('(');
626
+ for (i = 0; i != elem->argc; i++, values++) {
627
+ if (i > 0)
628
+ APPEND_CHAR_TO_STACK(',');
629
+ str = ValueToShortSource(cx, *values);
630
+ if (!str)
631
+ goto bad;
632
+ APPEND_STRING_TO_STACK(str);
633
+ }
634
+ APPEND_CHAR_TO_STACK(')');
635
+ }
636
+ APPEND_CHAR_TO_STACK('@');
637
+ if (elem->filename) {
638
+ for (cp = elem->filename; *cp; cp++)
639
+ APPEND_CHAR_TO_STACK(*cp);
640
+ }
641
+ APPEND_CHAR_TO_STACK(':');
642
+ JS_snprintf(ulnbuf, sizeof ulnbuf, "%u", elem->ulineno);
643
+ for (cp = ulnbuf; *cp; cp++)
644
+ APPEND_CHAR_TO_STACK(*cp);
645
+ APPEND_CHAR_TO_STACK('\n');
646
+ }
647
+ #undef APPEND_CHAR_TO_STACK
648
+ #undef APPEND_STRING_TO_STACK
649
+ #undef STACK_LENGTH_LIMIT
650
+
651
+ done:
652
+ if (stacklen == 0) {
653
+ JS_ASSERT(!stackbuf);
654
+ return cx->runtime->emptyString;
655
+ }
656
+ if (stacklen < stackmax) {
657
+ /*
658
+ * Realloc can fail when shrinking on some FreeBSD versions, so
659
+ * don't use JS_realloc here; simply let the oversized allocation
660
+ * be owned by the string in that rare case.
661
+ */
662
+ void *shrunk = JS_realloc(cx, stackbuf, (stacklen+1) * sizeof(jschar));
663
+ if (shrunk)
664
+ stackbuf = (jschar *) shrunk;
665
+ }
666
+
667
+ stackbuf[stacklen] = 0;
668
+ str = js_NewString(cx, stackbuf, stacklen);
669
+ if (str)
670
+ return str;
671
+
672
+ bad:
673
+ if (stackbuf)
674
+ JS_free(cx, stackbuf);
675
+ return NULL;
676
+ }
677
+
678
+ /* XXXbe Consolidate the ugly truth that we don't treat filename as UTF-8
679
+ with these two functions. */
680
+ static JSString *
681
+ FilenameToString(JSContext *cx, const char *filename)
682
+ {
683
+ return JS_NewStringCopyZ(cx, filename);
684
+ }
685
+
686
+ static const char *
687
+ StringToFilename(JSContext *cx, JSString *str)
688
+ {
689
+ return js_GetStringBytes(cx, str);
690
+ }
691
+
692
+ static JSBool
693
+ Exception(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
694
+ {
695
+ uint32 lineno;
696
+ JSString *message, *filename;
697
+ JSStackFrame *fp;
698
+
699
+ if (!JS_IsConstructing(cx)) {
700
+ /*
701
+ * ECMA ed. 3, 15.11.1 requires Error, etc., to construct even when
702
+ * called as functions, without operator new. But as we do not give
703
+ * each constructor a distinct JSClass, whose .name member is used by
704
+ * js_NewObject to find the class prototype, we must get the class
705
+ * prototype ourselves.
706
+ */
707
+ if (!OBJ_GET_PROPERTY(cx, JSVAL_TO_OBJECT(argv[-2]),
708
+ ATOM_TO_JSID(cx->runtime->atomState
709
+ .classPrototypeAtom),
710
+ rval))
711
+ return JS_FALSE;
712
+ obj = js_NewObject(cx, &js_ErrorClass, JSVAL_TO_OBJECT(*rval), NULL, 0);
713
+ if (!obj)
714
+ return JS_FALSE;
715
+ *rval = OBJECT_TO_JSVAL(obj);
716
+ }
717
+
718
+ /*
719
+ * If it's a new object of class Exception, then null out the private
720
+ * data so that the finalizer doesn't attempt to free it.
721
+ */
722
+ if (OBJ_GET_CLASS(cx, obj) == &js_ErrorClass)
723
+ STOBJ_SET_SLOT(obj, JSSLOT_PRIVATE, JSVAL_VOID);
724
+
725
+ /* Set the 'message' property. */
726
+ if (argc != 0) {
727
+ message = js_ValueToString(cx, argv[0]);
728
+ if (!message)
729
+ return JS_FALSE;
730
+ argv[0] = STRING_TO_JSVAL(message);
731
+ } else {
732
+ message = cx->runtime->emptyString;
733
+ }
734
+
735
+ /* Set the 'fileName' property. */
736
+ if (argc > 1) {
737
+ filename = js_ValueToString(cx, argv[1]);
738
+ if (!filename)
739
+ return JS_FALSE;
740
+ argv[1] = STRING_TO_JSVAL(filename);
741
+ fp = NULL;
742
+ } else {
743
+ fp = js_GetScriptedCaller(cx, NULL);
744
+ if (fp) {
745
+ filename = FilenameToString(cx, fp->script->filename);
746
+ if (!filename)
747
+ return JS_FALSE;
748
+ } else {
749
+ filename = cx->runtime->emptyString;
750
+ }
751
+ }
752
+
753
+ /* Set the 'lineNumber' property. */
754
+ if (argc > 2) {
755
+ lineno = js_ValueToECMAUint32(cx, &argv[2]);
756
+ if (JSVAL_IS_NULL(argv[2]))
757
+ return JS_FALSE;
758
+ } else {
759
+ if (!fp)
760
+ fp = js_GetScriptedCaller(cx, NULL);
761
+ lineno = (fp && fp->regs) ? js_FramePCToLineNumber(cx, fp) : 0;
762
+ }
763
+
764
+ return (OBJ_GET_CLASS(cx, obj) != &js_ErrorClass) ||
765
+ InitExnPrivate(cx, obj, message, filename, lineno, NULL);
766
+ }
767
+
768
+ /*
769
+ * Convert to string.
770
+ *
771
+ * This method only uses JavaScript-modifiable properties name, message. It
772
+ * is left to the host to check for private data and report filename and line
773
+ * number information along with this message.
774
+ */
775
+ static JSBool
776
+ exn_toString(JSContext *cx, uintN argc, jsval *vp)
777
+ {
778
+ JSObject *obj;
779
+ jsval v;
780
+ JSString *name, *message, *result;
781
+ jschar *chars, *cp;
782
+ size_t name_length, message_length, length;
783
+
784
+ obj = JS_THIS_OBJECT(cx, vp);
785
+ if (!obj ||
786
+ !OBJ_GET_PROPERTY(cx, obj,
787
+ ATOM_TO_JSID(cx->runtime->atomState.nameAtom),
788
+ &v)) {
789
+ return JS_FALSE;
790
+ }
791
+ name = JSVAL_IS_STRING(v) ? JSVAL_TO_STRING(v) : cx->runtime->emptyString;
792
+ *vp = STRING_TO_JSVAL(name);
793
+
794
+ if (!JS_GetProperty(cx, obj, js_message_str, &v))
795
+ return JS_FALSE;
796
+ message = JSVAL_IS_STRING(v) ? JSVAL_TO_STRING(v)
797
+ : cx->runtime->emptyString;
798
+
799
+ if (JSSTRING_LENGTH(message) != 0) {
800
+ name_length = JSSTRING_LENGTH(name);
801
+ message_length = JSSTRING_LENGTH(message);
802
+ length = (name_length ? name_length + 2 : 0) + message_length;
803
+ cp = chars = (jschar *) JS_malloc(cx, (length + 1) * sizeof(jschar));
804
+ if (!chars)
805
+ return JS_FALSE;
806
+
807
+ if (name_length) {
808
+ js_strncpy(cp, JSSTRING_CHARS(name), name_length);
809
+ cp += name_length;
810
+ *cp++ = ':'; *cp++ = ' ';
811
+ }
812
+ js_strncpy(cp, JSSTRING_CHARS(message), message_length);
813
+ cp += message_length;
814
+ *cp = 0;
815
+
816
+ result = js_NewString(cx, chars, length);
817
+ if (!result) {
818
+ JS_free(cx, chars);
819
+ return JS_FALSE;
820
+ }
821
+ } else {
822
+ result = name;
823
+ }
824
+
825
+ *vp = STRING_TO_JSVAL(result);
826
+ return JS_TRUE;
827
+ }
828
+
829
+ #if JS_HAS_TOSOURCE
830
+ /*
831
+ * Return a string that may eval to something similar to the original object.
832
+ */
833
+ static JSBool
834
+ exn_toSource(JSContext *cx, uintN argc, jsval *vp)
835
+ {
836
+ JSObject *obj;
837
+ JSString *name, *message, *filename, *lineno_as_str, *result;
838
+ jsval localroots[3] = {JSVAL_NULL, JSVAL_NULL, JSVAL_NULL};
839
+ JSTempValueRooter tvr;
840
+ JSBool ok;
841
+ uint32 lineno;
842
+ size_t lineno_length, name_length, message_length, filename_length, length;
843
+ jschar *chars, *cp;
844
+
845
+ obj = JS_THIS_OBJECT(cx, vp);
846
+ if (!obj ||
847
+ !OBJ_GET_PROPERTY(cx, obj,
848
+ ATOM_TO_JSID(cx->runtime->atomState.nameAtom),
849
+ vp)) {
850
+ return JS_FALSE;
851
+ }
852
+ name = js_ValueToString(cx, *vp);
853
+ if (!name)
854
+ return JS_FALSE;
855
+ *vp = STRING_TO_JSVAL(name);
856
+
857
+ MUST_FLOW_THROUGH("out");
858
+ JS_PUSH_TEMP_ROOT(cx, 3, localroots, &tvr);
859
+
860
+ #ifdef __GNUC__
861
+ message = filename = NULL;
862
+ #endif
863
+ ok = JS_GetProperty(cx, obj, js_message_str, &localroots[0]) &&
864
+ (message = js_ValueToSource(cx, localroots[0]));
865
+ if (!ok)
866
+ goto out;
867
+ localroots[0] = STRING_TO_JSVAL(message);
868
+
869
+ ok = JS_GetProperty(cx, obj, js_fileName_str, &localroots[1]) &&
870
+ (filename = js_ValueToSource(cx, localroots[1]));
871
+ if (!ok)
872
+ goto out;
873
+ localroots[1] = STRING_TO_JSVAL(filename);
874
+
875
+ ok = JS_GetProperty(cx, obj, js_lineNumber_str, &localroots[2]);
876
+ if (!ok)
877
+ goto out;
878
+ lineno = js_ValueToECMAUint32 (cx, &localroots[2]);
879
+ ok = !JSVAL_IS_NULL(localroots[2]);
880
+ if (!ok)
881
+ goto out;
882
+
883
+ if (lineno != 0) {
884
+ lineno_as_str = js_ValueToString(cx, localroots[2]);
885
+ if (!lineno_as_str) {
886
+ ok = JS_FALSE;
887
+ goto out;
888
+ }
889
+ lineno_length = JSSTRING_LENGTH(lineno_as_str);
890
+ } else {
891
+ lineno_as_str = NULL;
892
+ lineno_length = 0;
893
+ }
894
+
895
+ /* Magic 8, for the characters in ``(new ())''. */
896
+ name_length = JSSTRING_LENGTH(name);
897
+ message_length = JSSTRING_LENGTH(message);
898
+ length = 8 + name_length + message_length;
899
+
900
+ filename_length = JSSTRING_LENGTH(filename);
901
+ if (filename_length != 0) {
902
+ /* append filename as ``, {filename}'' */
903
+ length += 2 + filename_length;
904
+ if (lineno_as_str) {
905
+ /* append lineno as ``, {lineno_as_str}'' */
906
+ length += 2 + lineno_length;
907
+ }
908
+ } else {
909
+ if (lineno_as_str) {
910
+ /*
911
+ * no filename, but have line number,
912
+ * need to append ``, "", {lineno_as_str}''
913
+ */
914
+ length += 6 + lineno_length;
915
+ }
916
+ }
917
+
918
+ cp = chars = (jschar *) JS_malloc(cx, (length + 1) * sizeof(jschar));
919
+ if (!chars) {
920
+ ok = JS_FALSE;
921
+ goto out;
922
+ }
923
+
924
+ *cp++ = '('; *cp++ = 'n'; *cp++ = 'e'; *cp++ = 'w'; *cp++ = ' ';
925
+ js_strncpy(cp, JSSTRING_CHARS(name), name_length);
926
+ cp += name_length;
927
+ *cp++ = '(';
928
+ if (message_length != 0) {
929
+ js_strncpy(cp, JSSTRING_CHARS(message), message_length);
930
+ cp += message_length;
931
+ }
932
+
933
+ if (filename_length != 0) {
934
+ /* append filename as ``, {filename}'' */
935
+ *cp++ = ','; *cp++ = ' ';
936
+ js_strncpy(cp, JSSTRING_CHARS(filename), filename_length);
937
+ cp += filename_length;
938
+ } else {
939
+ if (lineno_as_str) {
940
+ /*
941
+ * no filename, but have line number,
942
+ * need to append ``, "", {lineno_as_str}''
943
+ */
944
+ *cp++ = ','; *cp++ = ' '; *cp++ = '"'; *cp++ = '"';
945
+ }
946
+ }
947
+ if (lineno_as_str) {
948
+ /* append lineno as ``, {lineno_as_str}'' */
949
+ *cp++ = ','; *cp++ = ' ';
950
+ js_strncpy(cp, JSSTRING_CHARS(lineno_as_str), lineno_length);
951
+ cp += lineno_length;
952
+ }
953
+
954
+ *cp++ = ')'; *cp++ = ')'; *cp = 0;
955
+
956
+ result = js_NewString(cx, chars, length);
957
+ if (!result) {
958
+ JS_free(cx, chars);
959
+ ok = JS_FALSE;
960
+ goto out;
961
+ }
962
+ *vp = STRING_TO_JSVAL(result);
963
+ ok = JS_TRUE;
964
+
965
+ out:
966
+ JS_POP_TEMP_ROOT(cx, &tvr);
967
+ return ok;
968
+ }
969
+ #endif
970
+
971
+ static JSFunctionSpec exception_methods[] = {
972
+ #if JS_HAS_TOSOURCE
973
+ JS_FN(js_toSource_str, exn_toSource, 0,0),
974
+ #endif
975
+ JS_FN(js_toString_str, exn_toString, 0,0),
976
+ JS_FS_END
977
+ };
978
+
979
+ /* JSProto_ ordering for exceptions shall match JSEXN_ constants. */
980
+ JS_STATIC_ASSERT(JSEXN_ERR == 0);
981
+ JS_STATIC_ASSERT(JSProto_Error + JSEXN_INTERNALERR == JSProto_InternalError);
982
+ JS_STATIC_ASSERT(JSProto_Error + JSEXN_EVALERR == JSProto_EvalError);
983
+ JS_STATIC_ASSERT(JSProto_Error + JSEXN_RANGEERR == JSProto_RangeError);
984
+ JS_STATIC_ASSERT(JSProto_Error + JSEXN_REFERENCEERR == JSProto_ReferenceError);
985
+ JS_STATIC_ASSERT(JSProto_Error + JSEXN_SYNTAXERR == JSProto_SyntaxError);
986
+ JS_STATIC_ASSERT(JSProto_Error + JSEXN_TYPEERR == JSProto_TypeError);
987
+ JS_STATIC_ASSERT(JSProto_Error + JSEXN_URIERR == JSProto_URIError);
988
+
989
+ static JS_INLINE JSProtoKey
990
+ GetExceptionProtoKey(intN exn)
991
+ {
992
+ JS_ASSERT(JSEXN_ERR <= exn);
993
+ JS_ASSERT(exn < JSEXN_LIMIT);
994
+ return (JSProtoKey) (JSProto_Error + exn);
995
+ }
996
+
997
+ JSObject *
998
+ js_InitExceptionClasses(JSContext *cx, JSObject *obj)
999
+ {
1000
+ jsval roots[3];
1001
+ JSObject *obj_proto, *error_proto;
1002
+ jsval empty;
1003
+
1004
+ /*
1005
+ * If lazy class initialization occurs for any Error subclass, then all
1006
+ * classes are initialized, starting with Error. To avoid reentry and
1007
+ * redundant initialization, we must not pass a null proto parameter to
1008
+ * js_NewObject below, when called for the Error superclass. We need to
1009
+ * ensure that Object.prototype is the proto of Error.prototype.
1010
+ *
1011
+ * See the equivalent code to ensure that parent_proto is non-null when
1012
+ * JS_InitClass calls js_NewObject, in jsapi.c.
1013
+ */
1014
+ if (!js_GetClassPrototype(cx, obj, INT_TO_JSID(JSProto_Object),
1015
+ &obj_proto)) {
1016
+ return NULL;
1017
+ }
1018
+
1019
+ memset(roots, 0, sizeof(roots));
1020
+ JSAutoTempValueRooter tvr(cx, JS_ARRAY_LENGTH(roots), roots);
1021
+
1022
+ #ifdef __GNUC__
1023
+ error_proto = NULL; /* quell GCC overwarning */
1024
+ #endif
1025
+
1026
+ /* Initialize the prototypes first. */
1027
+ for (intN i = JSEXN_ERR; i != JSEXN_LIMIT; i++) {
1028
+ JSObject *proto;
1029
+ JSProtoKey protoKey;
1030
+ JSAtom *atom;
1031
+ JSFunction *fun;
1032
+
1033
+ /* Make the prototype for the current constructor name. */
1034
+ proto = js_NewObject(cx, &js_ErrorClass,
1035
+ (i != JSEXN_ERR) ? error_proto : obj_proto,
1036
+ obj, 0);
1037
+ if (!proto)
1038
+ return NULL;
1039
+ if (i == JSEXN_ERR) {
1040
+ error_proto = proto;
1041
+ roots[0] = OBJECT_TO_JSVAL(proto);
1042
+ } else {
1043
+ // We cannot share the root for error_proto and other prototypes
1044
+ // as error_proto must be rooted until the function returns.
1045
+ roots[1] = OBJECT_TO_JSVAL(proto);
1046
+ }
1047
+
1048
+ /* So exn_finalize knows whether to destroy private data. */
1049
+ STOBJ_SET_SLOT(proto, JSSLOT_PRIVATE, JSVAL_VOID);
1050
+
1051
+ /* Make a constructor function for the current name. */
1052
+ protoKey = GetExceptionProtoKey(i);
1053
+ atom = cx->runtime->atomState.classAtoms[protoKey];
1054
+ fun = js_DefineFunction(cx, obj, atom, Exception, 3, 0);
1055
+ if (!fun)
1056
+ return NULL;
1057
+ roots[2] = OBJECT_TO_JSVAL(FUN_OBJECT(fun));
1058
+
1059
+ /* Make this constructor make objects of class Exception. */
1060
+ FUN_CLASP(fun) = &js_ErrorClass;
1061
+
1062
+ /* Make the prototype and constructor links. */
1063
+ if (!js_SetClassPrototype(cx, FUN_OBJECT(fun), proto,
1064
+ JSPROP_READONLY | JSPROP_PERMANENT)) {
1065
+ return NULL;
1066
+ }
1067
+
1068
+ /* Add the name property to the prototype. */
1069
+ if (!JS_DefineProperty(cx, proto, js_name_str, ATOM_KEY(atom),
1070
+ NULL, NULL, JSPROP_ENUMERATE)) {
1071
+ return NULL;
1072
+ }
1073
+
1074
+ /* Finally, stash the constructor for later uses. */
1075
+ if (!js_SetClassObject(cx, obj, protoKey, FUN_OBJECT(fun)))
1076
+ return NULL;
1077
+ }
1078
+
1079
+ /*
1080
+ * Set default values and add methods. We do it only for Error.prototype
1081
+ * as the rest of exceptions delegate to it.
1082
+ */
1083
+ empty = STRING_TO_JSVAL(cx->runtime->emptyString);
1084
+ if (!JS_DefineProperty(cx, error_proto, js_message_str, empty,
1085
+ NULL, NULL, JSPROP_ENUMERATE) ||
1086
+ !JS_DefineProperty(cx, error_proto, js_fileName_str, empty,
1087
+ NULL, NULL, JSPROP_ENUMERATE) ||
1088
+ !JS_DefineProperty(cx, error_proto, js_lineNumber_str, JSVAL_ZERO,
1089
+ NULL, NULL, JSPROP_ENUMERATE) ||
1090
+ !JS_DefineFunctions(cx, error_proto, exception_methods)) {
1091
+ return NULL;
1092
+ }
1093
+
1094
+ return error_proto;
1095
+ }
1096
+
1097
+ const JSErrorFormatString*
1098
+ js_GetLocalizedErrorMessage(JSContext* cx, void *userRef, const char *locale,
1099
+ const uintN errorNumber)
1100
+ {
1101
+ const JSErrorFormatString *errorString = NULL;
1102
+
1103
+ if (cx->localeCallbacks && cx->localeCallbacks->localeGetErrorMessage) {
1104
+ errorString = cx->localeCallbacks
1105
+ ->localeGetErrorMessage(userRef, locale, errorNumber);
1106
+ }
1107
+ if (!errorString)
1108
+ errorString = js_GetErrorMessage(userRef, locale, errorNumber);
1109
+ return errorString;
1110
+ }
1111
+
1112
+ #if defined ( DEBUG_mccabe ) && defined ( PRINTNAMES )
1113
+ /* For use below... get character strings for error name and exception name */
1114
+ static struct exnname { char *name; char *exception; } errortoexnname[] = {
1115
+ #define MSG_DEF(name, number, count, exception, format) \
1116
+ {#name, #exception},
1117
+ #include "js.msg"
1118
+ #undef MSG_DEF
1119
+ };
1120
+ #endif /* DEBUG */
1121
+
1122
+ JSBool
1123
+ js_ErrorToException(JSContext *cx, const char *message, JSErrorReport *reportp)
1124
+ {
1125
+ JSErrNum errorNumber;
1126
+ const JSErrorFormatString *errorString;
1127
+ JSExnType exn;
1128
+ jsval tv[4];
1129
+ JSTempValueRooter tvr;
1130
+ JSBool ok;
1131
+ JSObject *errProto, *errObject;
1132
+ JSString *messageStr, *filenameStr;
1133
+
1134
+ /*
1135
+ * Tell our caller to report immediately if this report is just a warning.
1136
+ */
1137
+ JS_ASSERT(reportp);
1138
+ if (JSREPORT_IS_WARNING(reportp->flags))
1139
+ return JS_FALSE;
1140
+
1141
+ /* Find the exception index associated with this error. */
1142
+ errorNumber = (JSErrNum) reportp->errorNumber;
1143
+ errorString = js_GetLocalizedErrorMessage(cx, NULL, NULL, errorNumber);
1144
+ exn = errorString ? (JSExnType) errorString->exnType : JSEXN_NONE;
1145
+ JS_ASSERT(exn < JSEXN_LIMIT);
1146
+
1147
+ #if defined( DEBUG_mccabe ) && defined ( PRINTNAMES )
1148
+ /* Print the error name and the associated exception name to stderr */
1149
+ fprintf(stderr, "%s\t%s\n",
1150
+ errortoexnname[errorNumber].name,
1151
+ errortoexnname[errorNumber].exception);
1152
+ #endif
1153
+
1154
+ /*
1155
+ * Return false (no exception raised) if no exception is associated
1156
+ * with the given error number.
1157
+ */
1158
+ if (exn == JSEXN_NONE)
1159
+ return JS_FALSE;
1160
+
1161
+ /*
1162
+ * Prevent runaway recursion, via cx->generatingError. If an out-of-memory
1163
+ * error occurs, no exception object will be created, but we don't assume
1164
+ * that OOM is the only kind of error that subroutines of this function
1165
+ * called below might raise.
1166
+ */
1167
+ if (cx->generatingError)
1168
+ return JS_FALSE;
1169
+
1170
+ MUST_FLOW_THROUGH("out");
1171
+ cx->generatingError = JS_TRUE;
1172
+
1173
+ /* Protect the newly-created strings below from nesting GCs. */
1174
+ memset(tv, 0, sizeof tv);
1175
+ JS_PUSH_TEMP_ROOT(cx, JS_ARRAY_LENGTH(tv), tv, &tvr);
1176
+
1177
+ /*
1178
+ * Try to get an appropriate prototype by looking up the corresponding
1179
+ * exception constructor name in the scope chain of the current context's
1180
+ * top stack frame, or in the global object if no frame is active.
1181
+ */
1182
+ ok = js_GetClassPrototype(cx, NULL, INT_TO_JSID(GetExceptionProtoKey(exn)),
1183
+ &errProto);
1184
+ if (!ok)
1185
+ goto out;
1186
+ tv[0] = OBJECT_TO_JSVAL(errProto);
1187
+
1188
+ errObject = js_NewObject(cx, &js_ErrorClass, errProto, NULL, 0);
1189
+ if (!errObject) {
1190
+ ok = JS_FALSE;
1191
+ goto out;
1192
+ }
1193
+ tv[1] = OBJECT_TO_JSVAL(errObject);
1194
+
1195
+ messageStr = JS_NewStringCopyZ(cx, message);
1196
+ if (!messageStr) {
1197
+ ok = JS_FALSE;
1198
+ goto out;
1199
+ }
1200
+ tv[2] = STRING_TO_JSVAL(messageStr);
1201
+
1202
+ filenameStr = JS_NewStringCopyZ(cx, reportp->filename);
1203
+ if (!filenameStr) {
1204
+ ok = JS_FALSE;
1205
+ goto out;
1206
+ }
1207
+ tv[3] = STRING_TO_JSVAL(filenameStr);
1208
+
1209
+ ok = InitExnPrivate(cx, errObject, messageStr, filenameStr,
1210
+ reportp->lineno, reportp);
1211
+ if (!ok)
1212
+ goto out;
1213
+
1214
+ JS_SetPendingException(cx, OBJECT_TO_JSVAL(errObject));
1215
+
1216
+ /* Flag the error report passed in to indicate an exception was raised. */
1217
+ reportp->flags |= JSREPORT_EXCEPTION;
1218
+
1219
+ out:
1220
+ JS_POP_TEMP_ROOT(cx, &tvr);
1221
+ cx->generatingError = JS_FALSE;
1222
+ return ok;
1223
+ }
1224
+
1225
+ JSBool
1226
+ js_ReportUncaughtException(JSContext *cx)
1227
+ {
1228
+ jsval exn;
1229
+ JSObject *exnObject;
1230
+ jsval roots[5];
1231
+ JSTempValueRooter tvr;
1232
+ JSErrorReport *reportp, report;
1233
+ JSString *str;
1234
+ const char *bytes;
1235
+ JSBool ok;
1236
+
1237
+ if (!JS_IsExceptionPending(cx))
1238
+ return JS_TRUE;
1239
+
1240
+ if (!JS_GetPendingException(cx, &exn))
1241
+ return JS_FALSE;
1242
+
1243
+ memset(roots, 0, sizeof roots);
1244
+ JS_PUSH_TEMP_ROOT(cx, JS_ARRAY_LENGTH(roots), roots, &tvr);
1245
+
1246
+ /*
1247
+ * Because js_ValueToString below could error and an exception object
1248
+ * could become unrooted, we must root exnObject. Later, if exnObject is
1249
+ * non-null, we need to root other intermediates, so allocate an operand
1250
+ * stack segment to protect all of these values.
1251
+ */
1252
+ if (JSVAL_IS_PRIMITIVE(exn)) {
1253
+ exnObject = NULL;
1254
+ } else {
1255
+ exnObject = JSVAL_TO_OBJECT(exn);
1256
+ roots[0] = exn;
1257
+ }
1258
+
1259
+ JS_ClearPendingException(cx);
1260
+ reportp = js_ErrorFromException(cx, exn);
1261
+
1262
+ /* XXX L10N angels cry once again (see also jsemit.c, /L10N gaffes/) */
1263
+ str = js_ValueToString(cx, exn);
1264
+ if (!str) {
1265
+ bytes = "unknown (can't convert to string)";
1266
+ } else {
1267
+ roots[1] = STRING_TO_JSVAL(str);
1268
+ bytes = js_GetStringBytes(cx, str);
1269
+ if (!bytes) {
1270
+ ok = JS_FALSE;
1271
+ goto out;
1272
+ }
1273
+ }
1274
+ ok = JS_TRUE;
1275
+
1276
+ if (!reportp &&
1277
+ exnObject &&
1278
+ OBJ_GET_CLASS(cx, exnObject) == &js_ErrorClass) {
1279
+ const char *filename;
1280
+ uint32 lineno;
1281
+
1282
+ ok = JS_GetProperty(cx, exnObject, js_message_str, &roots[2]);
1283
+ if (!ok)
1284
+ goto out;
1285
+ if (JSVAL_IS_STRING(roots[2])) {
1286
+ bytes = js_GetStringBytes(cx, JSVAL_TO_STRING(roots[2]));
1287
+ if (!bytes) {
1288
+ ok = JS_FALSE;
1289
+ goto out;
1290
+ }
1291
+ }
1292
+
1293
+ ok = JS_GetProperty(cx, exnObject, js_fileName_str, &roots[3]);
1294
+ if (!ok)
1295
+ goto out;
1296
+ str = js_ValueToString(cx, roots[3]);
1297
+ if (!str) {
1298
+ ok = JS_FALSE;
1299
+ goto out;
1300
+ }
1301
+ filename = StringToFilename(cx, str);
1302
+ if (!filename) {
1303
+ ok = JS_FALSE;
1304
+ goto out;
1305
+ }
1306
+
1307
+ ok = JS_GetProperty(cx, exnObject, js_lineNumber_str, &roots[4]);
1308
+ if (!ok)
1309
+ goto out;
1310
+ lineno = js_ValueToECMAUint32 (cx, &roots[4]);
1311
+ ok = !JSVAL_IS_NULL(roots[4]);
1312
+ if (!ok)
1313
+ goto out;
1314
+
1315
+ reportp = &report;
1316
+ memset(&report, 0, sizeof report);
1317
+ report.filename = filename;
1318
+ report.lineno = (uintN) lineno;
1319
+ }
1320
+
1321
+ if (!reportp) {
1322
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
1323
+ JSMSG_UNCAUGHT_EXCEPTION, bytes);
1324
+ } else {
1325
+ /* Flag the error as an exception. */
1326
+ reportp->flags |= JSREPORT_EXCEPTION;
1327
+
1328
+ /* Pass the exception object. */
1329
+ JS_SetPendingException(cx, exn);
1330
+ js_ReportErrorAgain(cx, bytes, reportp);
1331
+ JS_ClearPendingException(cx);
1332
+ }
1333
+
1334
+ out:
1335
+ JS_POP_TEMP_ROOT(cx, &tvr);
1336
+ return ok;
1337
+ }