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,42 @@
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 SpiderMonkey JavaScript 1.8 code, released
18
+ * March 4, 2008.
19
+ *
20
+ * The Initial Developer of the Original Code is
21
+ * Igor Bukanov <igor@mir2.org>
22
+ *
23
+ * Contributor(s):
24
+ * Brendan Eich <brendan@mozilla.org
25
+ *
26
+ * Alternatively, the contents of this file may be used under the terms of
27
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
28
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
+ * in which case the provisions of the GPL or the LGPL are applicable instead
30
+ * of those above. If you wish to allow use of your version of this file only
31
+ * under the terms of either the GPL or the LGPL, and not to allow others to
32
+ * use your version of this file under the terms of the MPL, indicate your
33
+ * decision by deleting the provisions above and replace them with the notice
34
+ * and other provisions required by the GPL or the LGPL. If you do not delete
35
+ * the provisions above, a recipient may use your version of this file under
36
+ * the terms of any one of the MPL, the GPL or the LGPL.
37
+ *
38
+ * ***** END LICENSE BLOCK ***** */
39
+
40
+ #define jsinvoke_cpp___
41
+
42
+ #include "jsinterp.cpp"
@@ -0,0 +1,1040 @@
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
+ * JavaScript iterators.
43
+ */
44
+ #include "jsstddef.h"
45
+ #include <string.h> /* for memcpy */
46
+ #include "jstypes.h"
47
+ #include "jsutil.h"
48
+ #include "jsarena.h"
49
+ #include "jsapi.h"
50
+ #include "jsarray.h"
51
+ #include "jsatom.h"
52
+ #include "jsbool.h"
53
+ #include "jscntxt.h"
54
+ #include "jsversion.h"
55
+ #include "jsexn.h"
56
+ #include "jsfun.h"
57
+ #include "jsgc.h"
58
+ #include "jsinterp.h"
59
+ #include "jsiter.h"
60
+ #include "jslock.h"
61
+ #include "jsnum.h"
62
+ #include "jsobj.h"
63
+ #include "jsopcode.h"
64
+ #include "jsscan.h"
65
+ #include "jsscope.h"
66
+ #include "jsscript.h"
67
+ #include "jsstaticcheck.h"
68
+ #include "jstracer.h"
69
+
70
+ #if JS_HAS_XML_SUPPORT
71
+ #include "jsxml.h"
72
+ #endif
73
+
74
+ #if JSSLOT_ITER_FLAGS >= JS_INITIAL_NSLOTS
75
+ #error JS_INITIAL_NSLOTS must be greater than JSSLOT_ITER_FLAGS.
76
+ #endif
77
+
78
+ #if JS_HAS_GENERATORS
79
+
80
+ static JS_REQUIRES_STACK JSBool
81
+ CloseGenerator(JSContext *cx, JSObject *genobj);
82
+
83
+ #endif
84
+
85
+ /*
86
+ * Shared code to close iterator's state either through an explicit call or
87
+ * when GC detects that the iterator is no longer reachable.
88
+ */
89
+ void
90
+ js_CloseNativeIterator(JSContext *cx, JSObject *iterobj)
91
+ {
92
+ jsval state;
93
+ JSObject *iterable;
94
+
95
+ JS_ASSERT(STOBJ_GET_CLASS(iterobj) == &js_IteratorClass);
96
+
97
+ /* Avoid double work if js_CloseNativeIterator was called on obj. */
98
+ state = STOBJ_GET_SLOT(iterobj, JSSLOT_ITER_STATE);
99
+ if (JSVAL_IS_NULL(state))
100
+ return;
101
+
102
+ /* Protect against failure to fully initialize obj. */
103
+ iterable = STOBJ_GET_PARENT(iterobj);
104
+ if (iterable) {
105
+ #if JS_HAS_XML_SUPPORT
106
+ uintN flags = JSVAL_TO_INT(STOBJ_GET_SLOT(iterobj, JSSLOT_ITER_FLAGS));
107
+ if ((flags & JSITER_FOREACH) && OBJECT_IS_XML(cx, iterable)) {
108
+ js_EnumerateXMLValues(cx, iterable, JSENUMERATE_DESTROY, &state,
109
+ NULL, NULL);
110
+ } else
111
+ #endif
112
+ OBJ_ENUMERATE(cx, iterable, JSENUMERATE_DESTROY, &state, NULL);
113
+ }
114
+ STOBJ_SET_SLOT(iterobj, JSSLOT_ITER_STATE, JSVAL_NULL);
115
+ }
116
+
117
+ JSClass js_IteratorClass = {
118
+ "Iterator",
119
+ JSCLASS_HAS_RESERVED_SLOTS(2) | /* slots for state and flags */
120
+ JSCLASS_HAS_CACHED_PROTO(JSProto_Iterator),
121
+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
122
+ JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
123
+ JSCLASS_NO_OPTIONAL_MEMBERS
124
+ };
125
+
126
+ static JSBool
127
+ InitNativeIterator(JSContext *cx, JSObject *iterobj, JSObject *obj, uintN flags)
128
+ {
129
+ jsval state;
130
+ JSBool ok;
131
+
132
+ JS_ASSERT(STOBJ_GET_CLASS(iterobj) == &js_IteratorClass);
133
+
134
+ /* Initialize iterobj in case of enumerate hook failure. */
135
+ STOBJ_SET_PARENT(iterobj, obj);
136
+ STOBJ_SET_SLOT(iterobj, JSSLOT_ITER_STATE, JSVAL_NULL);
137
+ STOBJ_SET_SLOT(iterobj, JSSLOT_ITER_FLAGS, INT_TO_JSVAL(flags));
138
+ if (!js_RegisterCloseableIterator(cx, iterobj))
139
+ return JS_FALSE;
140
+ if (!obj)
141
+ return JS_TRUE;
142
+
143
+ ok =
144
+ #if JS_HAS_XML_SUPPORT
145
+ ((flags & JSITER_FOREACH) && OBJECT_IS_XML(cx, obj))
146
+ ? js_EnumerateXMLValues(cx, obj, JSENUMERATE_INIT, &state, NULL, NULL)
147
+ :
148
+ #endif
149
+ OBJ_ENUMERATE(cx, obj, JSENUMERATE_INIT, &state, NULL);
150
+ if (!ok)
151
+ return JS_FALSE;
152
+
153
+ STOBJ_SET_SLOT(iterobj, JSSLOT_ITER_STATE, state);
154
+ if (flags & JSITER_ENUMERATE) {
155
+ /*
156
+ * The enumerating iterator needs the original object to suppress
157
+ * enumeration of deleted or shadowed prototype properties. Since the
158
+ * enumerator never escapes to scripts, we use the prototype slot to
159
+ * store the original object.
160
+ */
161
+ JS_ASSERT(obj != iterobj);
162
+ STOBJ_SET_PROTO(iterobj, obj);
163
+ }
164
+ return JS_TRUE;
165
+ }
166
+
167
+ static JSBool
168
+ Iterator(JSContext *cx, JSObject *iterobj, uintN argc, jsval *argv, jsval *rval)
169
+ {
170
+ JSBool keyonly;
171
+ uintN flags;
172
+ JSObject *obj;
173
+
174
+ keyonly = js_ValueToBoolean(argv[1]);
175
+ flags = keyonly ? 0 : JSITER_FOREACH;
176
+
177
+ if (JS_IsConstructing(cx)) {
178
+ /* XXX work around old valueOf call hidden beneath js_ValueToObject */
179
+ if (!JSVAL_IS_PRIMITIVE(argv[0])) {
180
+ obj = JSVAL_TO_OBJECT(argv[0]);
181
+ } else {
182
+ obj = js_ValueToNonNullObject(cx, argv[0]);
183
+ if (!obj)
184
+ return JS_FALSE;
185
+ argv[0] = OBJECT_TO_JSVAL(obj);
186
+ }
187
+ return InitNativeIterator(cx, iterobj, obj, flags);
188
+ }
189
+
190
+ *rval = argv[0];
191
+ return js_ValueToIterator(cx, flags, rval);
192
+ }
193
+
194
+ static JSBool
195
+ NewKeyValuePair(JSContext *cx, jsid key, jsval val, jsval *rval)
196
+ {
197
+ jsval vec[2];
198
+ JSTempValueRooter tvr;
199
+ JSObject *aobj;
200
+
201
+ vec[0] = ID_TO_VALUE(key);
202
+ vec[1] = val;
203
+
204
+ JS_PUSH_TEMP_ROOT(cx, 2, vec, &tvr);
205
+ aobj = js_NewArrayObject(cx, 2, vec);
206
+ *rval = OBJECT_TO_JSVAL(aobj);
207
+ JS_POP_TEMP_ROOT(cx, &tvr);
208
+
209
+ return aobj != NULL;
210
+ }
211
+
212
+ static JSBool
213
+ IteratorNextImpl(JSContext *cx, JSObject *obj, jsval *rval)
214
+ {
215
+ JSObject *iterable;
216
+ jsval state;
217
+ uintN flags;
218
+ JSBool foreach, ok;
219
+ jsid id;
220
+
221
+ JS_ASSERT(OBJ_GET_CLASS(cx, obj) == &js_IteratorClass);
222
+
223
+ iterable = OBJ_GET_PARENT(cx, obj);
224
+ JS_ASSERT(iterable);
225
+ state = STOBJ_GET_SLOT(obj, JSSLOT_ITER_STATE);
226
+ if (JSVAL_IS_NULL(state))
227
+ goto stop;
228
+
229
+ flags = JSVAL_TO_INT(STOBJ_GET_SLOT(obj, JSSLOT_ITER_FLAGS));
230
+ JS_ASSERT(!(flags & JSITER_ENUMERATE));
231
+ foreach = (flags & JSITER_FOREACH) != 0;
232
+ ok =
233
+ #if JS_HAS_XML_SUPPORT
234
+ (foreach && OBJECT_IS_XML(cx, iterable))
235
+ ? js_EnumerateXMLValues(cx, iterable, JSENUMERATE_NEXT, &state,
236
+ &id, rval)
237
+ :
238
+ #endif
239
+ OBJ_ENUMERATE(cx, iterable, JSENUMERATE_NEXT, &state, &id);
240
+ if (!ok)
241
+ return JS_FALSE;
242
+
243
+ STOBJ_SET_SLOT(obj, JSSLOT_ITER_STATE, state);
244
+ if (JSVAL_IS_NULL(state))
245
+ goto stop;
246
+
247
+ if (foreach) {
248
+ #if JS_HAS_XML_SUPPORT
249
+ if (!OBJECT_IS_XML(cx, iterable) &&
250
+ !OBJ_GET_PROPERTY(cx, iterable, id, rval)) {
251
+ return JS_FALSE;
252
+ }
253
+ #endif
254
+ if (!NewKeyValuePair(cx, id, *rval, rval))
255
+ return JS_FALSE;
256
+ } else {
257
+ *rval = ID_TO_VALUE(id);
258
+ }
259
+ return JS_TRUE;
260
+
261
+ stop:
262
+ JS_ASSERT(STOBJ_GET_SLOT(obj, JSSLOT_ITER_STATE) == JSVAL_NULL);
263
+ *rval = JSVAL_HOLE;
264
+ return JS_TRUE;
265
+ }
266
+
267
+ JSBool
268
+ js_ThrowStopIteration(JSContext *cx)
269
+ {
270
+ jsval v;
271
+
272
+ JS_ASSERT(!JS_IsExceptionPending(cx));
273
+ if (js_FindClassObject(cx, NULL, INT_TO_JSID(JSProto_StopIteration), &v))
274
+ JS_SetPendingException(cx, v);
275
+ return JS_FALSE;
276
+ }
277
+
278
+ static JSBool
279
+ iterator_next(JSContext *cx, uintN argc, jsval *vp)
280
+ {
281
+ JSObject *obj;
282
+
283
+ obj = JS_THIS_OBJECT(cx, vp);
284
+ if (!JS_InstanceOf(cx, obj, &js_IteratorClass, vp + 2))
285
+ return JS_FALSE;
286
+
287
+ if (!IteratorNextImpl(cx, obj, vp))
288
+ return JS_FALSE;
289
+
290
+ if (*vp == JSVAL_HOLE) {
291
+ *vp = JSVAL_NULL;
292
+ js_ThrowStopIteration(cx);
293
+ return JS_FALSE;
294
+ }
295
+ return JS_TRUE;
296
+ }
297
+
298
+ static JSBool
299
+ iterator_self(JSContext *cx, uintN argc, jsval *vp)
300
+ {
301
+ *vp = JS_THIS(cx, vp);
302
+ return !JSVAL_IS_NULL(*vp);
303
+ }
304
+
305
+ #define JSPROP_ROPERM (JSPROP_READONLY | JSPROP_PERMANENT)
306
+
307
+ static JSFunctionSpec iterator_methods[] = {
308
+ JS_FN(js_iterator_str, iterator_self, 0,JSPROP_ROPERM),
309
+ JS_FN(js_next_str, iterator_next, 0,JSPROP_ROPERM),
310
+ JS_FS_END
311
+ };
312
+
313
+ uintN
314
+ js_GetNativeIteratorFlags(JSContext *cx, JSObject *iterobj)
315
+ {
316
+ if (OBJ_GET_CLASS(cx, iterobj) != &js_IteratorClass)
317
+ return 0;
318
+ return JSVAL_TO_INT(STOBJ_GET_SLOT(iterobj, JSSLOT_ITER_FLAGS));
319
+ }
320
+
321
+ /*
322
+ * Call ToObject(v).__iterator__(keyonly) if ToObject(v).__iterator__ exists.
323
+ * Otherwise construct the default iterator.
324
+ */
325
+ JS_FRIEND_API(JSBool)
326
+ js_ValueToIterator(JSContext *cx, uintN flags, jsval *vp)
327
+ {
328
+ JSObject *obj;
329
+ JSTempValueRooter tvr;
330
+ JSAtom *atom;
331
+ JSClass *clasp;
332
+ JSExtendedClass *xclasp;
333
+ JSBool ok;
334
+ JSObject *iterobj;
335
+ jsval arg;
336
+
337
+ JS_ASSERT(!(flags & ~(JSITER_ENUMERATE |
338
+ JSITER_FOREACH |
339
+ JSITER_KEYVALUE)));
340
+
341
+ /* JSITER_KEYVALUE must always come with JSITER_FOREACH */
342
+ JS_ASSERT(!(flags & JSITER_KEYVALUE) || (flags & JSITER_FOREACH));
343
+
344
+ /* XXX work around old valueOf call hidden beneath js_ValueToObject */
345
+ if (!JSVAL_IS_PRIMITIVE(*vp)) {
346
+ obj = JSVAL_TO_OBJECT(*vp);
347
+ } else {
348
+ /*
349
+ * Enumerating over null and undefined gives an empty enumerator.
350
+ * This is contrary to ECMA-262 9.9 ToObject, invoked from step 3 of
351
+ * the first production in 12.6.4 and step 4 of the second production,
352
+ * but it's "web JS" compatible.
353
+ */
354
+ if ((flags & JSITER_ENUMERATE)) {
355
+ if (!js_ValueToObject(cx, *vp, &obj))
356
+ return JS_FALSE;
357
+ if (!obj)
358
+ goto default_iter;
359
+ } else {
360
+ obj = js_ValueToNonNullObject(cx, *vp);
361
+ if (!obj)
362
+ return JS_FALSE;
363
+ }
364
+ }
365
+
366
+ JS_ASSERT(obj);
367
+ JS_PUSH_TEMP_ROOT_OBJECT(cx, obj, &tvr);
368
+
369
+ clasp = OBJ_GET_CLASS(cx, obj);
370
+ if ((clasp->flags & JSCLASS_IS_EXTENDED) &&
371
+ (xclasp = (JSExtendedClass *) clasp)->iteratorObject) {
372
+ iterobj = xclasp->iteratorObject(cx, obj, !(flags & JSITER_FOREACH));
373
+ if (!iterobj)
374
+ goto bad;
375
+ *vp = OBJECT_TO_JSVAL(iterobj);
376
+ } else {
377
+ atom = cx->runtime->atomState.iteratorAtom;
378
+ if (!js_GetMethod(cx, obj, ATOM_TO_JSID(atom), false, vp))
379
+ goto bad;
380
+ if (JSVAL_IS_VOID(*vp)) {
381
+ default_iter:
382
+ /*
383
+ * Fail over to the default enumerating native iterator.
384
+ *
385
+ * Create iterobj with a NULL parent to ensure that we use the
386
+ * correct scope chain to lookup the iterator's constructor. Since
387
+ * we use the parent slot to keep track of the iterable, we must
388
+ * fix it up after.
389
+ */
390
+ iterobj = js_NewObject(cx, &js_IteratorClass, NULL, NULL, 0);
391
+ if (!iterobj)
392
+ goto bad;
393
+
394
+ /* Store in *vp to protect it from GC (callers must root vp). */
395
+ *vp = OBJECT_TO_JSVAL(iterobj);
396
+
397
+ if (!InitNativeIterator(cx, iterobj, obj, flags))
398
+ goto bad;
399
+ } else {
400
+ js_LeaveTrace(cx);
401
+ arg = BOOLEAN_TO_JSVAL((flags & JSITER_FOREACH) == 0);
402
+ if (!js_InternalInvoke(cx, obj, *vp, JSINVOKE_ITERATOR, 1, &arg,
403
+ vp)) {
404
+ goto bad;
405
+ }
406
+ if (JSVAL_IS_PRIMITIVE(*vp)) {
407
+ js_ReportValueError(cx, JSMSG_BAD_ITERATOR_RETURN,
408
+ JSDVG_SEARCH_STACK, *vp, NULL);
409
+ goto bad;
410
+ }
411
+ }
412
+ }
413
+
414
+ ok = JS_TRUE;
415
+ out:
416
+ if (obj)
417
+ JS_POP_TEMP_ROOT(cx, &tvr);
418
+ return ok;
419
+ bad:
420
+ ok = JS_FALSE;
421
+ goto out;
422
+ }
423
+
424
+ JS_FRIEND_API(JSBool) JS_FASTCALL
425
+ js_CloseIterator(JSContext *cx, jsval v)
426
+ {
427
+ JSObject *obj;
428
+ JSClass *clasp;
429
+
430
+ JS_ASSERT(!JSVAL_IS_PRIMITIVE(v));
431
+ obj = JSVAL_TO_OBJECT(v);
432
+ clasp = OBJ_GET_CLASS(cx, obj);
433
+
434
+ if (clasp == &js_IteratorClass) {
435
+ js_CloseNativeIterator(cx, obj);
436
+ }
437
+ #if JS_HAS_GENERATORS
438
+ else if (clasp == &js_GeneratorClass) {
439
+ JS_ASSERT_NOT_ON_TRACE(cx);
440
+ if (!CloseGenerator(cx, obj))
441
+ return JS_FALSE;
442
+ }
443
+ #endif
444
+ return JS_TRUE;
445
+ }
446
+
447
+ static JSBool
448
+ CallEnumeratorNext(JSContext *cx, JSObject *iterobj, uintN flags, jsval *rval)
449
+ {
450
+ JSObject *obj, *origobj;
451
+ jsval state;
452
+ JSBool foreach;
453
+ jsid id;
454
+ JSObject *obj2;
455
+ JSBool cond;
456
+ JSClass *clasp;
457
+ JSExtendedClass *xclasp;
458
+ JSProperty *prop;
459
+ JSString *str;
460
+
461
+ JS_ASSERT(flags & JSITER_ENUMERATE);
462
+ JS_ASSERT(STOBJ_GET_CLASS(iterobj) == &js_IteratorClass);
463
+
464
+ obj = STOBJ_GET_PARENT(iterobj);
465
+ origobj = STOBJ_GET_PROTO(iterobj);
466
+ state = STOBJ_GET_SLOT(iterobj, JSSLOT_ITER_STATE);
467
+ if (JSVAL_IS_NULL(state))
468
+ goto stop;
469
+
470
+ foreach = (flags & JSITER_FOREACH) != 0;
471
+ #if JS_HAS_XML_SUPPORT
472
+ /*
473
+ * Treat an XML object specially only when it starts the prototype chain.
474
+ * Otherwise we need to do the usual deleted and shadowed property checks.
475
+ */
476
+ if (obj == origobj && OBJECT_IS_XML(cx, obj)) {
477
+ if (foreach) {
478
+ if (!js_EnumerateXMLValues(cx, obj, JSENUMERATE_NEXT, &state,
479
+ &id, rval)) {
480
+ return JS_FALSE;
481
+ }
482
+ } else {
483
+ if (!OBJ_ENUMERATE(cx, obj, JSENUMERATE_NEXT, &state, &id))
484
+ return JS_FALSE;
485
+ }
486
+ STOBJ_SET_SLOT(iterobj, JSSLOT_ITER_STATE, state);
487
+ if (JSVAL_IS_NULL(state))
488
+ goto stop;
489
+ } else
490
+ #endif
491
+ {
492
+ restart:
493
+ if (!OBJ_ENUMERATE(cx, obj, JSENUMERATE_NEXT, &state, &id))
494
+ return JS_FALSE;
495
+
496
+ STOBJ_SET_SLOT(iterobj, JSSLOT_ITER_STATE, state);
497
+ if (JSVAL_IS_NULL(state)) {
498
+ #if JS_HAS_XML_SUPPORT
499
+ if (OBJECT_IS_XML(cx, obj)) {
500
+ /*
501
+ * We just finished enumerating an XML obj that is present on
502
+ * the prototype chain of a non-XML origobj. Stop further
503
+ * prototype chain searches because XML objects don't
504
+ * enumerate prototypes.
505
+ */
506
+ JS_ASSERT(origobj != obj);
507
+ JS_ASSERT(!OBJECT_IS_XML(cx, origobj));
508
+ } else
509
+ #endif
510
+ {
511
+ obj = OBJ_GET_PROTO(cx, obj);
512
+ if (obj) {
513
+ STOBJ_SET_PARENT(iterobj, obj);
514
+ if (!OBJ_ENUMERATE(cx, obj, JSENUMERATE_INIT, &state, NULL))
515
+ return JS_FALSE;
516
+ STOBJ_SET_SLOT(iterobj, JSSLOT_ITER_STATE, state);
517
+ if (!JSVAL_IS_NULL(state))
518
+ goto restart;
519
+ }
520
+ }
521
+ goto stop;
522
+ }
523
+
524
+ /* Skip properties not in obj when looking from origobj. */
525
+ if (!OBJ_LOOKUP_PROPERTY(cx, origobj, id, &obj2, &prop))
526
+ return JS_FALSE;
527
+ if (!prop)
528
+ goto restart;
529
+ OBJ_DROP_PROPERTY(cx, obj2, prop);
530
+
531
+ /*
532
+ * If the id was found in a prototype object or an unrelated object
533
+ * (specifically, not in an inner object for obj), skip it. This step
534
+ * means that all OBJ_LOOKUP_PROPERTY implementations must return an
535
+ * object further along on the prototype chain, or else possibly an
536
+ * object returned by the JSExtendedClass.outerObject optional hook.
537
+ */
538
+ if (obj != obj2) {
539
+ cond = JS_FALSE;
540
+ clasp = OBJ_GET_CLASS(cx, obj2);
541
+ if (clasp->flags & JSCLASS_IS_EXTENDED) {
542
+ xclasp = (JSExtendedClass *) clasp;
543
+ cond = xclasp->outerObject &&
544
+ xclasp->outerObject(cx, obj2) == obj;
545
+ }
546
+ if (!cond)
547
+ goto restart;
548
+ }
549
+
550
+ if (foreach) {
551
+ /* Get property querying the original object. */
552
+ if (!OBJ_GET_PROPERTY(cx, origobj, id, rval))
553
+ return JS_FALSE;
554
+ }
555
+ }
556
+
557
+ if (foreach) {
558
+ if (flags & JSITER_KEYVALUE) {
559
+ if (!NewKeyValuePair(cx, id, *rval, rval))
560
+ return JS_FALSE;
561
+ }
562
+ } else {
563
+ /* Make rval a string for uniformity and compatibility. */
564
+ str = js_ValueToString(cx, ID_TO_VALUE(id));
565
+ if (!str)
566
+ return JS_FALSE;
567
+ *rval = STRING_TO_JSVAL(str);
568
+ }
569
+ return JS_TRUE;
570
+
571
+ stop:
572
+ JS_ASSERT(STOBJ_GET_SLOT(iterobj, JSSLOT_ITER_STATE) == JSVAL_NULL);
573
+ *rval = JSVAL_HOLE;
574
+ return JS_TRUE;
575
+ }
576
+
577
+ JS_FRIEND_API(JSBool)
578
+ js_CallIteratorNext(JSContext *cx, JSObject *iterobj, jsval *rval)
579
+ {
580
+ uintN flags;
581
+
582
+ /* Fast path for native iterators */
583
+ if (OBJ_GET_CLASS(cx, iterobj) == &js_IteratorClass) {
584
+ flags = JSVAL_TO_INT(STOBJ_GET_SLOT(iterobj, JSSLOT_ITER_FLAGS));
585
+ if (flags & JSITER_ENUMERATE)
586
+ return CallEnumeratorNext(cx, iterobj, flags, rval);
587
+
588
+ /*
589
+ * Call next directly as all the methods of the native iterator are
590
+ * read-only and permanent.
591
+ */
592
+ if (!IteratorNextImpl(cx, iterobj, rval))
593
+ return JS_FALSE;
594
+ } else {
595
+ jsid id = ATOM_TO_JSID(cx->runtime->atomState.nextAtom);
596
+
597
+ if (!JS_GetMethodById(cx, iterobj, id, &iterobj, rval))
598
+ return JS_FALSE;
599
+ if (!js_InternalCall(cx, iterobj, *rval, 0, NULL, rval)) {
600
+ /* Check for StopIteration. */
601
+ if (!cx->throwing || !js_ValueIsStopIteration(cx->exception))
602
+ return JS_FALSE;
603
+
604
+ /* Inline JS_ClearPendingException(cx). */
605
+ cx->throwing = JS_FALSE;
606
+ cx->exception = JSVAL_VOID;
607
+ *rval = JSVAL_HOLE;
608
+ return JS_TRUE;
609
+ }
610
+ }
611
+
612
+ return JS_TRUE;
613
+ }
614
+
615
+ static JSBool
616
+ stopiter_hasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
617
+ {
618
+ *bp = js_ValueIsStopIteration(v);
619
+ return JS_TRUE;
620
+ }
621
+
622
+ JSClass js_StopIterationClass = {
623
+ js_StopIteration_str,
624
+ JSCLASS_HAS_CACHED_PROTO(JSProto_StopIteration),
625
+ JS_PropertyStub, JS_PropertyStub,
626
+ JS_PropertyStub, JS_PropertyStub,
627
+ JS_EnumerateStub, JS_ResolveStub,
628
+ JS_ConvertStub, JS_FinalizeStub,
629
+ NULL, NULL,
630
+ NULL, NULL,
631
+ NULL, stopiter_hasInstance,
632
+ NULL, NULL
633
+ };
634
+
635
+ #if JS_HAS_GENERATORS
636
+
637
+ static void
638
+ generator_finalize(JSContext *cx, JSObject *obj)
639
+ {
640
+ JSGenerator *gen;
641
+
642
+ gen = (JSGenerator *) JS_GetPrivate(cx, obj);
643
+ if (gen) {
644
+ /*
645
+ * gen can be open on shutdown when close hooks are ignored or when
646
+ * the embedding cancels scheduled close hooks.
647
+ */
648
+ JS_ASSERT(gen->state == JSGEN_NEWBORN || gen->state == JSGEN_CLOSED ||
649
+ gen->state == JSGEN_OPEN);
650
+ JS_free(cx, gen);
651
+ }
652
+ }
653
+
654
+ static void
655
+ generator_trace(JSTracer *trc, JSObject *obj)
656
+ {
657
+ JSGenerator *gen;
658
+
659
+ gen = (JSGenerator *) JS_GetPrivate(trc->context, obj);
660
+ if (!gen)
661
+ return;
662
+
663
+ /*
664
+ * js_TraceStackFrame does not recursively trace the down-linked frame
665
+ * chain, so we insist that gen->frame has no parent to trace when the
666
+ * generator is not running.
667
+ */
668
+ JS_ASSERT_IF(gen->state != JSGEN_RUNNING && gen->state != JSGEN_CLOSING,
669
+ !gen->frame.down);
670
+
671
+ /*
672
+ * FIXME be 390950. Generator's frame is a part of the JS stack when the
673
+ * generator is running or closing. Thus tracing the frame in this case
674
+ * here duplicates the work done in js_TraceContext.
675
+ */
676
+ js_TraceStackFrame(trc, &gen->frame);
677
+ }
678
+
679
+ JS_FRIEND_DATA(JSClass) js_GeneratorClass = {
680
+ js_Generator_str,
681
+ JSCLASS_HAS_PRIVATE | JSCLASS_IS_ANONYMOUS |
682
+ JSCLASS_MARK_IS_TRACE | JSCLASS_HAS_CACHED_PROTO(JSProto_Generator),
683
+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
684
+ JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, generator_finalize,
685
+ NULL, NULL, NULL, NULL,
686
+ NULL, NULL, JS_CLASS_TRACE(generator_trace), NULL
687
+ };
688
+
689
+ /*
690
+ * Called from the JSOP_GENERATOR case in the interpreter, with fp referring
691
+ * to the frame by which the generator function was activated. Create a new
692
+ * JSGenerator object, which contains its own JSStackFrame that we populate
693
+ * from *fp. We know that upon return, the JSOP_GENERATOR opcode will return
694
+ * from the activation in fp, so we can steal away fp->callobj and fp->argsobj
695
+ * if they are non-null.
696
+ */
697
+ JSObject *
698
+ js_NewGenerator(JSContext *cx, JSStackFrame *fp)
699
+ {
700
+ JSObject *obj;
701
+ uintN argc, nargs, nslots;
702
+ JSGenerator *gen;
703
+ jsval *slots;
704
+
705
+ /* After the following return, failing control flow must goto bad. */
706
+ obj = js_NewObject(cx, &js_GeneratorClass, NULL, NULL, 0);
707
+ if (!obj)
708
+ return NULL;
709
+
710
+ /* Load and compute stack slot counts. */
711
+ argc = fp->argc;
712
+ nargs = JS_MAX(argc, fp->fun->nargs);
713
+ nslots = 2 + nargs + fp->script->nslots;
714
+
715
+ /* Allocate obj's private data struct. */
716
+ gen = (JSGenerator *)
717
+ JS_malloc(cx, sizeof(JSGenerator) + (nslots - 1) * sizeof(jsval));
718
+ if (!gen)
719
+ goto bad;
720
+
721
+ gen->obj = obj;
722
+
723
+ /* Steal away objects reflecting fp and point them at gen->frame. */
724
+ gen->frame.callobj = fp->callobj;
725
+ if (fp->callobj) {
726
+ JS_SetPrivate(cx, fp->callobj, &gen->frame);
727
+ fp->callobj = NULL;
728
+ }
729
+ gen->frame.argsobj = fp->argsobj;
730
+ if (fp->argsobj) {
731
+ JS_SetPrivate(cx, fp->argsobj, &gen->frame);
732
+ fp->argsobj = NULL;
733
+ }
734
+
735
+ /* These two references can be shared with fp until it goes away. */
736
+ gen->frame.varobj = fp->varobj;
737
+ gen->frame.thisp = fp->thisp;
738
+
739
+ /* Copy call-invariant script and function references. */
740
+ gen->frame.script = fp->script;
741
+ gen->frame.callee = fp->callee;
742
+ gen->frame.fun = fp->fun;
743
+
744
+ /* Use slots to carve space out of gen->slots. */
745
+ slots = gen->slots;
746
+ gen->arena.next = NULL;
747
+ gen->arena.base = (jsuword) slots;
748
+ gen->arena.limit = gen->arena.avail = (jsuword) (slots + nslots);
749
+
750
+ /* Copy rval, argv and vars. */
751
+ gen->frame.rval = fp->rval;
752
+ memcpy(slots, fp->argv - 2, (2 + nargs) * sizeof(jsval));
753
+ gen->frame.argc = nargs;
754
+ gen->frame.argv = slots + 2;
755
+ slots += 2 + nargs;
756
+ memcpy(slots, fp->slots, fp->script->nfixed * sizeof(jsval));
757
+
758
+ /* Initialize or copy virtual machine state. */
759
+ gen->frame.down = NULL;
760
+ gen->frame.annotation = NULL;
761
+ gen->frame.scopeChain = fp->scopeChain;
762
+
763
+ gen->frame.imacpc = NULL;
764
+ gen->frame.slots = slots;
765
+ JS_ASSERT(StackBase(fp) == fp->regs->sp);
766
+ gen->savedRegs.sp = slots + fp->script->nfixed;
767
+ gen->savedRegs.pc = fp->regs->pc;
768
+ gen->frame.regs = &gen->savedRegs;
769
+
770
+ /* Copy remaining state (XXX sharp* and xml* should be local vars). */
771
+ gen->frame.sharpDepth = 0;
772
+ gen->frame.sharpArray = NULL;
773
+ gen->frame.flags = (fp->flags & ~JSFRAME_ROOTED_ARGV) | JSFRAME_GENERATOR;
774
+ gen->frame.dormantNext = NULL;
775
+ gen->frame.xmlNamespace = NULL;
776
+ /* JSOP_GENERATOR appears in the prologue, outside all blocks. */
777
+ JS_ASSERT(!fp->blockChain);
778
+ gen->frame.blockChain = NULL;
779
+
780
+ /* Note that gen is newborn. */
781
+ gen->state = JSGEN_NEWBORN;
782
+
783
+ if (!JS_SetPrivate(cx, obj, gen)) {
784
+ JS_free(cx, gen);
785
+ goto bad;
786
+ }
787
+ return obj;
788
+
789
+ bad:
790
+ cx->weakRoots.newborn[GCX_OBJECT] = NULL;
791
+ return NULL;
792
+ }
793
+
794
+ typedef enum JSGeneratorOp {
795
+ JSGENOP_NEXT,
796
+ JSGENOP_SEND,
797
+ JSGENOP_THROW,
798
+ JSGENOP_CLOSE
799
+ } JSGeneratorOp;
800
+
801
+ /*
802
+ * Start newborn or restart yielding generator and perform the requested
803
+ * operation inside its frame.
804
+ */
805
+ static JS_REQUIRES_STACK JSBool
806
+ SendToGenerator(JSContext *cx, JSGeneratorOp op, JSObject *obj,
807
+ JSGenerator *gen, jsval arg)
808
+ {
809
+ JSStackFrame *fp;
810
+ JSArena *arena;
811
+ JSBool ok;
812
+
813
+ if (gen->state == JSGEN_RUNNING || gen->state == JSGEN_CLOSING) {
814
+ js_ReportValueError(cx, JSMSG_NESTING_GENERATOR,
815
+ JSDVG_SEARCH_STACK, OBJECT_TO_JSVAL(obj),
816
+ JS_GetFunctionId(gen->frame.fun));
817
+ return JS_FALSE;
818
+ }
819
+
820
+ JS_ASSERT(gen->state == JSGEN_NEWBORN || gen->state == JSGEN_OPEN);
821
+ switch (op) {
822
+ case JSGENOP_NEXT:
823
+ case JSGENOP_SEND:
824
+ if (gen->state == JSGEN_OPEN) {
825
+ /*
826
+ * Store the argument to send as the result of the yield
827
+ * expression.
828
+ */
829
+ gen->savedRegs.sp[-1] = arg;
830
+ }
831
+ gen->state = JSGEN_RUNNING;
832
+ break;
833
+
834
+ case JSGENOP_THROW:
835
+ JS_SetPendingException(cx, arg);
836
+ gen->state = JSGEN_RUNNING;
837
+ break;
838
+
839
+ default:
840
+ JS_ASSERT(op == JSGENOP_CLOSE);
841
+ JS_SetPendingException(cx, JSVAL_ARETURN);
842
+ gen->state = JSGEN_CLOSING;
843
+ break;
844
+ }
845
+
846
+ /* Extend the current stack pool with gen->arena. */
847
+ arena = cx->stackPool.current;
848
+ JS_ASSERT(!arena->next);
849
+ JS_ASSERT(!gen->arena.next);
850
+ JS_ASSERT(cx->stackPool.current != &gen->arena);
851
+ cx->stackPool.current = arena->next = &gen->arena;
852
+
853
+ /* Push gen->frame around the interpreter activation. */
854
+ fp = js_GetTopStackFrame(cx);
855
+ cx->fp = &gen->frame;
856
+ gen->frame.down = fp;
857
+ ok = js_Interpret(cx);
858
+ cx->fp = fp;
859
+ gen->frame.down = NULL;
860
+
861
+ /* Retract the stack pool and sanitize gen->arena. */
862
+ JS_ASSERT(!gen->arena.next);
863
+ JS_ASSERT(arena->next == &gen->arena);
864
+ JS_ASSERT(cx->stackPool.current == &gen->arena);
865
+ cx->stackPool.current = arena;
866
+ arena->next = NULL;
867
+
868
+ if (gen->frame.flags & JSFRAME_YIELDING) {
869
+ /* Yield cannot fail, throw or be called on closing. */
870
+ JS_ASSERT(ok);
871
+ JS_ASSERT(!cx->throwing);
872
+ JS_ASSERT(gen->state == JSGEN_RUNNING);
873
+ JS_ASSERT(op != JSGENOP_CLOSE);
874
+ gen->frame.flags &= ~JSFRAME_YIELDING;
875
+ gen->state = JSGEN_OPEN;
876
+ return JS_TRUE;
877
+ }
878
+
879
+ gen->frame.rval = JSVAL_VOID;
880
+ gen->state = JSGEN_CLOSED;
881
+ if (ok) {
882
+ /* Returned, explicitly or by falling off the end. */
883
+ if (op == JSGENOP_CLOSE)
884
+ return JS_TRUE;
885
+ return js_ThrowStopIteration(cx);
886
+ }
887
+
888
+ /*
889
+ * An error, silent termination by operation callback or an exception.
890
+ * Propagate the condition to the caller.
891
+ */
892
+ return JS_FALSE;
893
+ }
894
+
895
+ static JS_REQUIRES_STACK JSBool
896
+ CloseGenerator(JSContext *cx, JSObject *obj)
897
+ {
898
+ JSGenerator *gen;
899
+
900
+ JS_ASSERT(STOBJ_GET_CLASS(obj) == &js_GeneratorClass);
901
+ gen = (JSGenerator *) JS_GetPrivate(cx, obj);
902
+ if (!gen) {
903
+ /* Generator prototype object. */
904
+ return JS_TRUE;
905
+ }
906
+
907
+ if (gen->state == JSGEN_CLOSED)
908
+ return JS_TRUE;
909
+
910
+ return SendToGenerator(cx, JSGENOP_CLOSE, obj, gen, JSVAL_VOID);
911
+ }
912
+
913
+ /*
914
+ * Common subroutine of generator_(next|send|throw|close) methods.
915
+ */
916
+ static JSBool
917
+ generator_op(JSContext *cx, JSGeneratorOp op, jsval *vp, uintN argc)
918
+ {
919
+ JSObject *obj;
920
+ JSGenerator *gen;
921
+ jsval arg;
922
+
923
+ js_LeaveTrace(cx);
924
+
925
+ obj = JS_THIS_OBJECT(cx, vp);
926
+ if (!JS_InstanceOf(cx, obj, &js_GeneratorClass, vp + 2))
927
+ return JS_FALSE;
928
+
929
+ gen = (JSGenerator *) JS_GetPrivate(cx, obj);
930
+ if (gen == NULL) {
931
+ /* This happens when obj is the generator prototype. See bug 352885. */
932
+ goto closed_generator;
933
+ }
934
+
935
+ if (gen->state == JSGEN_NEWBORN) {
936
+ switch (op) {
937
+ case JSGENOP_NEXT:
938
+ case JSGENOP_THROW:
939
+ break;
940
+
941
+ case JSGENOP_SEND:
942
+ if (argc >= 1 && !JSVAL_IS_VOID(vp[2])) {
943
+ js_ReportValueError(cx, JSMSG_BAD_GENERATOR_SEND,
944
+ JSDVG_SEARCH_STACK, vp[2], NULL);
945
+ return JS_FALSE;
946
+ }
947
+ break;
948
+
949
+ default:
950
+ JS_ASSERT(op == JSGENOP_CLOSE);
951
+ gen->state = JSGEN_CLOSED;
952
+ return JS_TRUE;
953
+ }
954
+ } else if (gen->state == JSGEN_CLOSED) {
955
+ closed_generator:
956
+ switch (op) {
957
+ case JSGENOP_NEXT:
958
+ case JSGENOP_SEND:
959
+ return js_ThrowStopIteration(cx);
960
+ case JSGENOP_THROW:
961
+ JS_SetPendingException(cx, argc >= 1 ? vp[2] : JSVAL_VOID);
962
+ return JS_FALSE;
963
+ default:
964
+ JS_ASSERT(op == JSGENOP_CLOSE);
965
+ return JS_TRUE;
966
+ }
967
+ }
968
+
969
+ arg = ((op == JSGENOP_SEND || op == JSGENOP_THROW) && argc != 0)
970
+ ? vp[2]
971
+ : JSVAL_VOID;
972
+ if (!SendToGenerator(cx, op, obj, gen, arg))
973
+ return JS_FALSE;
974
+ *vp = gen->frame.rval;
975
+ return JS_TRUE;
976
+ }
977
+
978
+ static JSBool
979
+ generator_send(JSContext *cx, uintN argc, jsval *vp)
980
+ {
981
+ return generator_op(cx, JSGENOP_SEND, vp, argc);
982
+ }
983
+
984
+ static JSBool
985
+ generator_next(JSContext *cx, uintN argc, jsval *vp)
986
+ {
987
+ return generator_op(cx, JSGENOP_NEXT, vp, argc);
988
+ }
989
+
990
+ static JSBool
991
+ generator_throw(JSContext *cx, uintN argc, jsval *vp)
992
+ {
993
+ return generator_op(cx, JSGENOP_THROW, vp, argc);
994
+ }
995
+
996
+ static JSBool
997
+ generator_close(JSContext *cx, uintN argc, jsval *vp)
998
+ {
999
+ return generator_op(cx, JSGENOP_CLOSE, vp, argc);
1000
+ }
1001
+
1002
+ static JSFunctionSpec generator_methods[] = {
1003
+ JS_FN(js_iterator_str, iterator_self, 0,JSPROP_ROPERM),
1004
+ JS_FN(js_next_str, generator_next, 0,JSPROP_ROPERM),
1005
+ JS_FN(js_send_str, generator_send, 1,JSPROP_ROPERM),
1006
+ JS_FN(js_throw_str, generator_throw, 1,JSPROP_ROPERM),
1007
+ JS_FN(js_close_str, generator_close, 0,JSPROP_ROPERM),
1008
+ JS_FS_END
1009
+ };
1010
+
1011
+ #endif /* JS_HAS_GENERATORS */
1012
+
1013
+ JSObject *
1014
+ js_InitIteratorClasses(JSContext *cx, JSObject *obj)
1015
+ {
1016
+ JSObject *proto, *stop;
1017
+
1018
+ /* Idempotency required: we initialize several things, possibly lazily. */
1019
+ if (!js_GetClassObject(cx, obj, JSProto_StopIteration, &stop))
1020
+ return NULL;
1021
+ if (stop)
1022
+ return stop;
1023
+
1024
+ proto = JS_InitClass(cx, obj, NULL, &js_IteratorClass, Iterator, 2,
1025
+ NULL, iterator_methods, NULL, NULL);
1026
+ if (!proto)
1027
+ return NULL;
1028
+ STOBJ_SET_SLOT(proto, JSSLOT_ITER_STATE, JSVAL_NULL);
1029
+
1030
+ #if JS_HAS_GENERATORS
1031
+ /* Initialize the generator internals if configured. */
1032
+ if (!JS_InitClass(cx, obj, NULL, &js_GeneratorClass, NULL, 0,
1033
+ NULL, generator_methods, NULL, NULL)) {
1034
+ return NULL;
1035
+ }
1036
+ #endif
1037
+
1038
+ return JS_InitClass(cx, obj, NULL, &js_StopIterationClass, NULL, 0,
1039
+ NULL, NULL, NULL, NULL);
1040
+ }