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,1932 @@
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 script operations.
43
+ */
44
+ #include "jsstddef.h"
45
+ #include <string.h>
46
+ #include "jstypes.h"
47
+ #include "jsutil.h" /* Added by JSIFY */
48
+ #include "jsprf.h"
49
+ #include "jsapi.h"
50
+ #include "jsatom.h"
51
+ #include "jscntxt.h"
52
+ #include "jsversion.h"
53
+ #include "jsdbgapi.h"
54
+ #include "jsemit.h"
55
+ #include "jsfun.h"
56
+ #include "jsinterp.h"
57
+ #include "jslock.h"
58
+ #include "jsnum.h"
59
+ #include "jsopcode.h"
60
+ #include "jsparse.h"
61
+ #include "jsscope.h"
62
+ #include "jsscript.h"
63
+ #include "jstracer.h"
64
+ #if JS_HAS_XDR
65
+ #include "jsxdrapi.h"
66
+ #endif
67
+
68
+ #if JS_HAS_SCRIPT_OBJECT
69
+
70
+ static const char js_script_exec_str[] = "Script.prototype.exec";
71
+ static const char js_script_compile_str[] = "Script.prototype.compile";
72
+
73
+ /*
74
+ * This routine requires that obj has been locked previously.
75
+ */
76
+ static jsint
77
+ GetScriptExecDepth(JSContext *cx, JSObject *obj)
78
+ {
79
+ jsval v;
80
+
81
+ JS_ASSERT(JS_IS_OBJ_LOCKED(cx, obj));
82
+ v = LOCKED_OBJ_GET_SLOT(obj, JSSLOT_START(&js_ScriptClass));
83
+ return JSVAL_TO_INT(v);
84
+ }
85
+
86
+ static void
87
+ AdjustScriptExecDepth(JSContext *cx, JSObject *obj, jsint delta)
88
+ {
89
+ jsint execDepth;
90
+
91
+ JS_LOCK_OBJ(cx, obj);
92
+ execDepth = GetScriptExecDepth(cx, obj);
93
+ LOCKED_OBJ_SET_SLOT(obj, JSSLOT_START(&js_ScriptClass),
94
+ INT_TO_JSVAL(execDepth + delta));
95
+ JS_UNLOCK_OBJ(cx, obj);
96
+ }
97
+
98
+ #if JS_HAS_TOSOURCE
99
+ static JSBool
100
+ script_toSource(JSContext *cx, uintN argc, jsval *vp)
101
+ {
102
+ JSObject *obj;
103
+ uint32 indent;
104
+ JSScript *script;
105
+ size_t i, j, k, n;
106
+ char buf[16];
107
+ jschar *s, *t;
108
+ JSString *str;
109
+
110
+ obj = JS_THIS_OBJECT(cx, vp);
111
+ if (!JS_InstanceOf(cx, obj, &js_ScriptClass, vp + 2))
112
+ return JS_FALSE;
113
+
114
+ indent = 0;
115
+ if (argc != 0) {
116
+ indent = js_ValueToECMAUint32(cx, &vp[2]);
117
+ if (JSVAL_IS_NULL(vp[2]))
118
+ return JS_FALSE;
119
+ }
120
+
121
+ script = (JSScript *) JS_GetPrivate(cx, obj);
122
+
123
+ /* Let n count the source string length, j the "front porch" length. */
124
+ j = JS_snprintf(buf, sizeof buf, "(new %s(", js_ScriptClass.name);
125
+ n = j + 2;
126
+ if (!script) {
127
+ /* Let k count the constructor argument string length. */
128
+ k = 0;
129
+ s = NULL; /* quell GCC overwarning */
130
+ } else {
131
+ str = JS_DecompileScript(cx, script, "Script.prototype.toSource",
132
+ (uintN)indent);
133
+ if (!str)
134
+ return JS_FALSE;
135
+ str = js_QuoteString(cx, str, '\'');
136
+ if (!str)
137
+ return JS_FALSE;
138
+ JSSTRING_CHARS_AND_LENGTH(str, s, k);
139
+ n += k;
140
+ }
141
+
142
+ /* Allocate the source string and copy into it. */
143
+ t = (jschar *) JS_malloc(cx, (n + 1) * sizeof(jschar));
144
+ if (!t)
145
+ return JS_FALSE;
146
+ for (i = 0; i < j; i++)
147
+ t[i] = buf[i];
148
+ for (j = 0; j < k; i++, j++)
149
+ t[i] = s[j];
150
+ t[i++] = ')';
151
+ t[i++] = ')';
152
+ t[i] = 0;
153
+
154
+ /* Create and return a JS string for t. */
155
+ str = JS_NewUCString(cx, t, n);
156
+ if (!str) {
157
+ JS_free(cx, t);
158
+ return JS_FALSE;
159
+ }
160
+ *vp = STRING_TO_JSVAL(str);
161
+ return JS_TRUE;
162
+ }
163
+ #endif /* JS_HAS_TOSOURCE */
164
+
165
+ static JSBool
166
+ script_toString(JSContext *cx, uintN argc, jsval *vp)
167
+ {
168
+ uint32 indent;
169
+ JSObject *obj;
170
+ JSScript *script;
171
+ JSString *str;
172
+
173
+ indent = 0;
174
+ if (argc != 0) {
175
+ indent = js_ValueToECMAUint32(cx, &vp[2]);
176
+ if (JSVAL_IS_NULL(vp[2]))
177
+ return JS_FALSE;
178
+ }
179
+
180
+ obj = JS_THIS_OBJECT(cx, vp);
181
+ if (!JS_InstanceOf(cx, obj, &js_ScriptClass, vp + 2))
182
+ return JS_FALSE;
183
+ script = (JSScript *) JS_GetPrivate(cx, obj);
184
+ if (!script) {
185
+ *vp = STRING_TO_JSVAL(cx->runtime->emptyString);
186
+ return JS_TRUE;
187
+ }
188
+
189
+ str = JS_DecompileScript(cx, script, "Script.prototype.toString",
190
+ (uintN)indent);
191
+ if (!str)
192
+ return JS_FALSE;
193
+ *vp = STRING_TO_JSVAL(str);
194
+ return JS_TRUE;
195
+ }
196
+
197
+ static JSBool
198
+ script_compile_sub(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
199
+ jsval *rval)
200
+ {
201
+ JSString *str;
202
+ JSObject *scopeobj;
203
+ jsval v;
204
+ JSScript *script, *oldscript;
205
+ JSStackFrame *caller;
206
+ const char *file;
207
+ uintN line;
208
+ JSPrincipals *principals;
209
+ uint32 tcflags;
210
+ jsint execDepth;
211
+
212
+ /* Make sure obj is a Script object. */
213
+ if (!JS_InstanceOf(cx, obj, &js_ScriptClass, argv))
214
+ return JS_FALSE;
215
+
216
+ /* If no args, leave private undefined and return early. */
217
+ if (argc == 0)
218
+ goto out;
219
+
220
+ /* Otherwise, the first arg is the script source to compile. */
221
+ str = js_ValueToString(cx, argv[0]);
222
+ if (!str)
223
+ return JS_FALSE;
224
+ argv[0] = STRING_TO_JSVAL(str);
225
+
226
+ scopeobj = NULL;
227
+ if (argc >= 2) {
228
+ if (!js_ValueToObject(cx, argv[1], &scopeobj))
229
+ return JS_FALSE;
230
+ argv[1] = OBJECT_TO_JSVAL(scopeobj);
231
+ }
232
+
233
+ /* Compile using the caller's scope chain, which js_Invoke passes to fp. */
234
+ caller = js_GetScriptedCaller(cx, NULL);
235
+ JS_ASSERT(!caller || cx->fp->scopeChain == caller->scopeChain);
236
+
237
+ if (caller) {
238
+ if (!scopeobj) {
239
+ scopeobj = js_GetScopeChain(cx, caller);
240
+ if (!scopeobj)
241
+ return JS_FALSE;
242
+ }
243
+
244
+ principals = JS_EvalFramePrincipals(cx, cx->fp, caller);
245
+ file = js_ComputeFilename(cx, caller, principals, &line);
246
+ } else {
247
+ file = NULL;
248
+ line = 0;
249
+ principals = NULL;
250
+ }
251
+
252
+ /* Ensure we compile this script with the right (inner) principals. */
253
+ scopeobj = js_CheckScopeChainValidity(cx, scopeobj, js_script_compile_str);
254
+ if (!scopeobj)
255
+ return JS_FALSE;
256
+
257
+ /*
258
+ * Compile the new script using the caller's scope chain, a la eval().
259
+ * Unlike jsobj.c:obj_eval, however, we do not pass TCF_COMPILE_N_GO in
260
+ * tcflags and use NULL for the callerFrame argument, because compilation
261
+ * is here separated from execution, and the run-time scope chain may not
262
+ * match the compile-time. TCF_COMPILE_N_GO is tested in jsemit.c and
263
+ * jsparse.c to optimize based on identity of run- and compile-time scope.
264
+ */
265
+ tcflags = 0;
266
+ script = JSCompiler::compileScript(cx, scopeobj, NULL, principals, tcflags,
267
+ JSSTRING_CHARS(str), JSSTRING_LENGTH(str),
268
+ NULL, file, line);
269
+ if (!script)
270
+ return JS_FALSE;
271
+
272
+ JS_LOCK_OBJ(cx, obj);
273
+ execDepth = GetScriptExecDepth(cx, obj);
274
+
275
+ /*
276
+ * execDepth must be 0 to allow compilation here, otherwise the JSScript
277
+ * struct can be released while running.
278
+ */
279
+ if (execDepth > 0) {
280
+ JS_UNLOCK_OBJ(cx, obj);
281
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
282
+ JSMSG_COMPILE_EXECED_SCRIPT);
283
+ return JS_FALSE;
284
+ }
285
+
286
+ /* Swap script for obj's old script, if any. */
287
+ v = LOCKED_OBJ_GET_SLOT(obj, JSSLOT_PRIVATE);
288
+ oldscript = (JSScript*) (!JSVAL_IS_VOID(v) ? JSVAL_TO_PRIVATE(v) : NULL);
289
+ LOCKED_OBJ_SET_SLOT(obj, JSSLOT_PRIVATE, PRIVATE_TO_JSVAL(script));
290
+ JS_UNLOCK_OBJ(cx, obj);
291
+
292
+ if (oldscript)
293
+ js_DestroyScript(cx, oldscript);
294
+
295
+ script->u.object = obj;
296
+ js_CallNewScriptHook(cx, script, NULL);
297
+
298
+ out:
299
+ /* Return the object. */
300
+ *rval = OBJECT_TO_JSVAL(obj);
301
+ return JS_TRUE;
302
+ }
303
+
304
+ static JSBool
305
+ script_compile(JSContext *cx, uintN argc, jsval *vp)
306
+ {
307
+ return script_compile_sub(cx, JS_THIS_OBJECT(cx, vp), argc, vp + 2, vp);
308
+ }
309
+
310
+ static JSBool
311
+ script_exec_sub(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
312
+ jsval *rval)
313
+ {
314
+ JSObject *scopeobj;
315
+ JSStackFrame *caller;
316
+ JSPrincipals *principals;
317
+ JSScript *script;
318
+ JSBool ok;
319
+
320
+ if (!JS_InstanceOf(cx, obj, &js_ScriptClass, argv))
321
+ return JS_FALSE;
322
+
323
+ scopeobj = NULL;
324
+ if (argc != 0) {
325
+ if (!js_ValueToObject(cx, argv[0], &scopeobj))
326
+ return JS_FALSE;
327
+ argv[0] = OBJECT_TO_JSVAL(scopeobj);
328
+ }
329
+
330
+ /*
331
+ * Emulate eval() by using caller's this, var object, sharp array, etc.,
332
+ * all propagated by js_Execute via a non-null fourth (down) argument to
333
+ * js_Execute. If there is no scripted caller, js_Execute uses its second
334
+ * (chain) argument to set the exec frame's varobj, thisp, and scopeChain.
335
+ *
336
+ * Unlike eval, which the compiler detects, Script.prototype.exec may be
337
+ * called from a lightweight function, or even from native code (in which
338
+ * case fp->varobj and fp->scopeChain are null). If exec is called from
339
+ * a lightweight function, we will need to get a Call object representing
340
+ * its frame, to act as the var object and scope chain head.
341
+ */
342
+ caller = js_GetScriptedCaller(cx, NULL);
343
+ if (caller && !caller->varobj) {
344
+ /* Called from a lightweight function. */
345
+ JS_ASSERT(caller->fun && !JSFUN_HEAVYWEIGHT_TEST(caller->fun->flags));
346
+
347
+ /* Scope chain links from Call object to caller's scope chain. */
348
+ if (!js_GetCallObject(cx, caller))
349
+ return JS_FALSE;
350
+ }
351
+
352
+ if (!scopeobj) {
353
+ /* No scope object passed in: try to use the caller's scope chain. */
354
+ if (caller) {
355
+ /*
356
+ * Load caller->scopeChain after the conditional js_GetCallObject
357
+ * call above, which resets scopeChain as well as varobj.
358
+ */
359
+ scopeobj = js_GetScopeChain(cx, caller);
360
+ if (!scopeobj)
361
+ return JS_FALSE;
362
+ } else {
363
+ /*
364
+ * Called from native code, so we don't know what scope object to
365
+ * use. We could use the caller's scope chain (see above), but Script.prototype.exec
366
+ * might be a shared/sealed "superglobal" method. A more general
367
+ * approach would use cx->globalObject, which will be the same as
368
+ * exec.__parent__ in the non-superglobal case. In the superglobal
369
+ * case it's the right object: the global, not the superglobal.
370
+ */
371
+ scopeobj = cx->globalObject;
372
+ }
373
+ }
374
+
375
+ scopeobj = js_CheckScopeChainValidity(cx, scopeobj, js_script_exec_str);
376
+ if (!scopeobj)
377
+ return JS_FALSE;
378
+
379
+ /* Keep track of nesting depth for the script. */
380
+ AdjustScriptExecDepth(cx, obj, 1);
381
+
382
+ /* Must get to out label after this */
383
+ script = (JSScript *) JS_GetPrivate(cx, obj);
384
+ if (!script) {
385
+ ok = JS_FALSE;
386
+ goto out;
387
+ }
388
+
389
+ /* Belt-and-braces: check that this script object has access to scopeobj. */
390
+ principals = script->principals;
391
+ ok = js_CheckPrincipalsAccess(cx, scopeobj, principals,
392
+ CLASS_ATOM(cx, Script));
393
+ if (!ok)
394
+ goto out;
395
+
396
+ ok = js_Execute(cx, scopeobj, script, caller, JSFRAME_EVAL, rval);
397
+
398
+ out:
399
+ AdjustScriptExecDepth(cx, obj, -1);
400
+ return ok;
401
+ }
402
+
403
+ static JSBool
404
+ script_exec(JSContext *cx, uintN argc, jsval *vp)
405
+ {
406
+ return script_exec_sub(cx, JS_THIS_OBJECT(cx, vp), argc, vp + 2, vp);
407
+ }
408
+
409
+ #endif /* JS_HAS_SCRIPT_OBJECT */
410
+
411
+ #if JS_HAS_XDR
412
+
413
+ JSBool
414
+ js_XDRScript(JSXDRState *xdr, JSScript **scriptp, JSBool *hasMagic)
415
+ {
416
+ JSContext *cx;
417
+ JSScript *script, *oldscript;
418
+ JSBool ok;
419
+ jsbytecode *code;
420
+ uint32 length, lineno, nslots, magic;
421
+ uint32 natoms, nsrcnotes, ntrynotes, nobjects, nupvars, nregexps, i;
422
+ uint32 prologLength, version;
423
+ JSTempValueRooter tvr;
424
+ JSPrincipals *principals;
425
+ uint32 encodeable;
426
+ JSBool filenameWasSaved;
427
+ jssrcnote *notes, *sn;
428
+ JSSecurityCallbacks *callbacks;
429
+
430
+ cx = xdr->cx;
431
+ script = *scriptp;
432
+ nsrcnotes = ntrynotes = natoms = nobjects = nupvars = nregexps = 0;
433
+ filenameWasSaved = JS_FALSE;
434
+ notes = NULL;
435
+
436
+ if (xdr->mode == JSXDR_ENCODE)
437
+ magic = JSXDR_MAGIC_SCRIPT_CURRENT;
438
+ if (!JS_XDRUint32(xdr, &magic))
439
+ return JS_FALSE;
440
+ if (magic != JSXDR_MAGIC_SCRIPT_CURRENT) {
441
+ /* We do not provide binary compatibility with older scripts. */
442
+ if (!hasMagic) {
443
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
444
+ JSMSG_BAD_SCRIPT_MAGIC);
445
+ return JS_FALSE;
446
+ }
447
+ *hasMagic = JS_FALSE;
448
+ return JS_TRUE;
449
+ }
450
+ if (hasMagic)
451
+ *hasMagic = JS_TRUE;
452
+
453
+ if (xdr->mode == JSXDR_ENCODE) {
454
+ length = script->length;
455
+ prologLength = PTRDIFF(script->main, script->code, jsbytecode);
456
+ JS_ASSERT((int16)script->version != JSVERSION_UNKNOWN);
457
+ version = (uint32)script->version | (script->nfixed << 16);
458
+ lineno = (uint32)script->lineno;
459
+ nslots = (uint32)script->nslots;
460
+ nslots = (uint32)((script->staticLevel << 16) | script->nslots);
461
+ natoms = (uint32)script->atomMap.length;
462
+
463
+ /* Count the srcnotes, keeping notes pointing at the first one. */
464
+ notes = SCRIPT_NOTES(script);
465
+ for (sn = notes; !SN_IS_TERMINATOR(sn); sn = SN_NEXT(sn))
466
+ continue;
467
+ nsrcnotes = PTRDIFF(sn, notes, jssrcnote);
468
+ nsrcnotes++; /* room for the terminator */
469
+
470
+ if (script->objectsOffset != 0)
471
+ nobjects = JS_SCRIPT_OBJECTS(script)->length;
472
+ if (script->upvarsOffset != 0)
473
+ nupvars = JS_SCRIPT_UPVARS(script)->length;
474
+ if (script->regexpsOffset != 0)
475
+ nregexps = JS_SCRIPT_REGEXPS(script)->length;
476
+ if (script->trynotesOffset != 0)
477
+ ntrynotes = JS_SCRIPT_TRYNOTES(script)->length;
478
+ }
479
+
480
+ if (!JS_XDRUint32(xdr, &length))
481
+ return JS_FALSE;
482
+ if (!JS_XDRUint32(xdr, &prologLength))
483
+ return JS_FALSE;
484
+ if (!JS_XDRUint32(xdr, &version))
485
+ return JS_FALSE;
486
+
487
+ /*
488
+ * To fuse allocations, we need srcnote, atom, objects, upvar, regexp,
489
+ * and trynote counts early.
490
+ */
491
+ if (!JS_XDRUint32(xdr, &natoms))
492
+ return JS_FALSE;
493
+ if (!JS_XDRUint32(xdr, &nsrcnotes))
494
+ return JS_FALSE;
495
+ if (!JS_XDRUint32(xdr, &ntrynotes))
496
+ return JS_FALSE;
497
+ if (!JS_XDRUint32(xdr, &nobjects))
498
+ return JS_FALSE;
499
+ if (!JS_XDRUint32(xdr, &nupvars))
500
+ return JS_FALSE;
501
+ if (!JS_XDRUint32(xdr, &nregexps))
502
+ return JS_FALSE;
503
+
504
+ if (xdr->mode == JSXDR_DECODE) {
505
+ script = js_NewScript(cx, length, nsrcnotes, natoms, nobjects, nupvars,
506
+ nregexps, ntrynotes);
507
+ if (!script)
508
+ return JS_FALSE;
509
+
510
+ script->main += prologLength;
511
+ script->version = JSVersion(version & 0xffff);
512
+ script->nfixed = uint16(version >> 16);
513
+
514
+ /* If we know nsrcnotes, we allocated space for notes in script. */
515
+ notes = SCRIPT_NOTES(script);
516
+ *scriptp = script;
517
+ JS_PUSH_TEMP_ROOT_SCRIPT(cx, script, &tvr);
518
+ }
519
+
520
+ /*
521
+ * Control hereafter must goto error on failure, in order for the
522
+ * DECODE case to destroy script.
523
+ */
524
+ oldscript = xdr->script;
525
+ code = script->code;
526
+ if (xdr->mode == JSXDR_ENCODE) {
527
+ code = js_UntrapScriptCode(cx, script);
528
+ if (!code)
529
+ goto error;
530
+ }
531
+
532
+ xdr->script = script;
533
+ ok = JS_XDRBytes(xdr, (char *) code, length * sizeof(jsbytecode));
534
+
535
+ if (code != script->code)
536
+ JS_free(cx, code);
537
+
538
+ if (!ok)
539
+ goto error;
540
+
541
+ if (!JS_XDRBytes(xdr, (char *)notes, nsrcnotes * sizeof(jssrcnote)) ||
542
+ !JS_XDRCStringOrNull(xdr, (char **)&script->filename) ||
543
+ !JS_XDRUint32(xdr, &lineno) ||
544
+ !JS_XDRUint32(xdr, &nslots)) {
545
+ goto error;
546
+ }
547
+
548
+ callbacks = JS_GetSecurityCallbacks(cx);
549
+ if (xdr->mode == JSXDR_ENCODE) {
550
+ principals = script->principals;
551
+ encodeable = callbacks && callbacks->principalsTranscoder;
552
+ if (!JS_XDRUint32(xdr, &encodeable))
553
+ goto error;
554
+ if (encodeable &&
555
+ !callbacks->principalsTranscoder(xdr, &principals)) {
556
+ goto error;
557
+ }
558
+ } else {
559
+ if (!JS_XDRUint32(xdr, &encodeable))
560
+ goto error;
561
+ if (encodeable) {
562
+ if (!(callbacks && callbacks->principalsTranscoder)) {
563
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
564
+ JSMSG_CANT_DECODE_PRINCIPALS);
565
+ goto error;
566
+ }
567
+ if (!callbacks->principalsTranscoder(xdr, &principals))
568
+ goto error;
569
+ script->principals = principals;
570
+ }
571
+ }
572
+
573
+ if (xdr->mode == JSXDR_DECODE) {
574
+ const char *filename = script->filename;
575
+ if (filename) {
576
+ filename = js_SaveScriptFilename(cx, filename);
577
+ if (!filename)
578
+ goto error;
579
+ JS_free(cx, (void *) script->filename);
580
+ script->filename = filename;
581
+ filenameWasSaved = JS_TRUE;
582
+ }
583
+ script->lineno = (uintN)lineno;
584
+ script->nslots = (uint16)nslots;
585
+ script->staticLevel = (uint16)(nslots >> 16);
586
+ }
587
+
588
+ for (i = 0; i != natoms; ++i) {
589
+ if (!js_XDRAtom(xdr, &script->atomMap.vector[i]))
590
+ goto error;
591
+ }
592
+
593
+ /*
594
+ * Here looping from 0-to-length to xdr objects is essential. It ensures
595
+ * that block objects from the script->objects array will be written and
596
+ * restored in the outer-to-inner order. js_XDRBlockObject relies on this
597
+ * to restore the parent chain.
598
+ */
599
+ for (i = 0; i != nobjects; ++i) {
600
+ JSObject **objp = &JS_SCRIPT_OBJECTS(script)->vector[i];
601
+ uint32 isBlock;
602
+ if (xdr->mode == JSXDR_ENCODE) {
603
+ JSClass *clasp = STOBJ_GET_CLASS(*objp);
604
+ JS_ASSERT(clasp == &js_FunctionClass ||
605
+ clasp == &js_BlockClass);
606
+ isBlock = (clasp == &js_BlockClass) ? 1 : 0;
607
+ }
608
+ if (!JS_XDRUint32(xdr, &isBlock))
609
+ goto error;
610
+ if (isBlock == 0) {
611
+ if (!js_XDRFunctionObject(xdr, objp))
612
+ goto error;
613
+ } else {
614
+ JS_ASSERT(isBlock == 1);
615
+ if (!js_XDRBlockObject(xdr, objp))
616
+ goto error;
617
+ }
618
+ }
619
+ for (i = 0; i != nupvars; ++i) {
620
+ if (!JS_XDRUint32(xdr, &JS_SCRIPT_UPVARS(script)->vector[i]))
621
+ goto error;
622
+ }
623
+ for (i = 0; i != nregexps; ++i) {
624
+ if (!js_XDRRegExpObject(xdr, &JS_SCRIPT_REGEXPS(script)->vector[i]))
625
+ goto error;
626
+ }
627
+
628
+ if (ntrynotes != 0) {
629
+ /*
630
+ * We combine tn->kind and tn->stackDepth when serializing as XDR is not
631
+ * efficient when serializing small integer types.
632
+ */
633
+ JSTryNote *tn, *tnfirst;
634
+ uint32 kindAndDepth;
635
+ JS_STATIC_ASSERT(sizeof(tn->kind) == sizeof(uint8));
636
+ JS_STATIC_ASSERT(sizeof(tn->stackDepth) == sizeof(uint16));
637
+
638
+ tnfirst = JS_SCRIPT_TRYNOTES(script)->vector;
639
+ JS_ASSERT(JS_SCRIPT_TRYNOTES(script)->length == ntrynotes);
640
+ tn = tnfirst + ntrynotes;
641
+ do {
642
+ --tn;
643
+ if (xdr->mode == JSXDR_ENCODE) {
644
+ kindAndDepth = ((uint32)tn->kind << 16)
645
+ | (uint32)tn->stackDepth;
646
+ }
647
+ if (!JS_XDRUint32(xdr, &kindAndDepth) ||
648
+ !JS_XDRUint32(xdr, &tn->start) ||
649
+ !JS_XDRUint32(xdr, &tn->length)) {
650
+ goto error;
651
+ }
652
+ if (xdr->mode == JSXDR_DECODE) {
653
+ tn->kind = (uint8)(kindAndDepth >> 16);
654
+ tn->stackDepth = (uint16)kindAndDepth;
655
+ }
656
+ } while (tn != tnfirst);
657
+ }
658
+
659
+ xdr->script = oldscript;
660
+ if (xdr->mode == JSXDR_DECODE)
661
+ JS_POP_TEMP_ROOT(cx, &tvr);
662
+ return JS_TRUE;
663
+
664
+ error:
665
+ if (xdr->mode == JSXDR_DECODE) {
666
+ JS_POP_TEMP_ROOT(cx, &tvr);
667
+ if (script->filename && !filenameWasSaved) {
668
+ JS_free(cx, (void *) script->filename);
669
+ script->filename = NULL;
670
+ }
671
+ js_DestroyScript(cx, script);
672
+ *scriptp = NULL;
673
+ }
674
+ xdr->script = oldscript;
675
+ return JS_FALSE;
676
+ }
677
+
678
+ #if JS_HAS_SCRIPT_OBJECT && JS_HAS_XDR_FREEZE_THAW
679
+ /*
680
+ * These cannot be exposed to web content, and chrome does not need them, so
681
+ * we take them out of the Mozilla client altogether. Fortunately, there is
682
+ * no way to serialize a native function (see fun_xdrObject in jsfun.c).
683
+ */
684
+
685
+ static JSBool
686
+ script_freeze(JSContext *cx, uintN argc, jsval *vp)
687
+ {
688
+ JSObject *obj;
689
+ JSXDRState *xdr;
690
+ JSScript *script;
691
+ JSBool ok, hasMagic;
692
+ uint32 len;
693
+ void *buf;
694
+ JSString *str;
695
+
696
+ obj = JS_THIS_OBJECT(cx, vp);
697
+ if (!JS_InstanceOf(cx, obj, &js_ScriptClass, vp + 2))
698
+ return JS_FALSE;
699
+ script = (JSScript *) JS_GetPrivate(cx, obj);
700
+ if (!script)
701
+ return JS_TRUE;
702
+
703
+ /* create new XDR */
704
+ xdr = JS_XDRNewMem(cx, JSXDR_ENCODE);
705
+ if (!xdr)
706
+ return JS_FALSE;
707
+
708
+ /* write */
709
+ ok = js_XDRScript(xdr, &script, &hasMagic);
710
+ if (!ok)
711
+ goto out;
712
+ if (!hasMagic) {
713
+ *vp = JSVAL_VOID;
714
+ goto out;
715
+ }
716
+
717
+ buf = JS_XDRMemGetData(xdr, &len);
718
+ if (!buf) {
719
+ ok = JS_FALSE;
720
+ goto out;
721
+ }
722
+
723
+ JS_ASSERT((jsword)buf % sizeof(jschar) == 0);
724
+ len /= sizeof(jschar);
725
+ #if IS_BIG_ENDIAN
726
+ {
727
+ jschar *chars;
728
+ uint32 i;
729
+
730
+ /* Swap bytes in Unichars to keep frozen strings machine-independent. */
731
+ chars = (jschar *)buf;
732
+ for (i = 0; i < len; i++)
733
+ chars[i] = JSXDR_SWAB16(chars[i]);
734
+ }
735
+ #endif
736
+ str = JS_NewUCStringCopyN(cx, (jschar *)buf, len);
737
+ if (!str) {
738
+ ok = JS_FALSE;
739
+ goto out;
740
+ }
741
+
742
+ *vp = STRING_TO_JSVAL(str);
743
+
744
+ out:
745
+ JS_XDRDestroy(xdr);
746
+ return ok;
747
+ }
748
+
749
+ static JSBool
750
+ script_thaw(JSContext *cx, uintN argc, jsval *vp)
751
+ {
752
+ JSObject *obj;
753
+ JSXDRState *xdr;
754
+ JSString *str;
755
+ void *buf;
756
+ uint32 len;
757
+ jsval v;
758
+ JSScript *script, *oldscript;
759
+ JSBool ok, hasMagic;
760
+ jsint execDepth;
761
+
762
+ obj = JS_THIS_OBJECT(cx, vp);
763
+ if (!JS_InstanceOf(cx, obj, &js_ScriptClass, vp + 2))
764
+ return JS_FALSE;
765
+
766
+ if (argc == 0)
767
+ return JS_TRUE;
768
+ str = js_ValueToString(cx, vp[2]);
769
+ if (!str)
770
+ return JS_FALSE;
771
+ vp[2] = STRING_TO_JSVAL(str);
772
+
773
+ /* create new XDR */
774
+ xdr = JS_XDRNewMem(cx, JSXDR_DECODE);
775
+ if (!xdr)
776
+ return JS_FALSE;
777
+
778
+ JSSTRING_CHARS_AND_LENGTH(str, buf, len);
779
+ #if IS_BIG_ENDIAN
780
+ {
781
+ jschar *from, *to;
782
+ uint32 i;
783
+
784
+ /* Swap bytes in Unichars to keep frozen strings machine-independent. */
785
+ from = (jschar *)buf;
786
+ to = (jschar *) JS_malloc(cx, len * sizeof(jschar));
787
+ if (!to) {
788
+ JS_XDRDestroy(xdr);
789
+ return JS_FALSE;
790
+ }
791
+ for (i = 0; i < len; i++)
792
+ to[i] = JSXDR_SWAB16(from[i]);
793
+ buf = (char *)to;
794
+ }
795
+ #endif
796
+ len *= sizeof(jschar);
797
+ JS_XDRMemSetData(xdr, buf, len);
798
+
799
+ /* XXXbe should magic mismatch be error, or false return value? */
800
+ ok = js_XDRScript(xdr, &script, &hasMagic);
801
+ if (!ok)
802
+ goto out;
803
+ if (!hasMagic) {
804
+ *vp = JSVAL_FALSE;
805
+ goto out;
806
+ }
807
+
808
+ JS_LOCK_OBJ(cx, obj);
809
+ execDepth = GetScriptExecDepth(cx, obj);
810
+
811
+ /*
812
+ * execDepth must be 0 to allow compilation here, otherwise the JSScript
813
+ * struct can be released while running.
814
+ */
815
+ if (execDepth > 0) {
816
+ JS_UNLOCK_OBJ(cx, obj);
817
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
818
+ JSMSG_COMPILE_EXECED_SCRIPT);
819
+ goto out;
820
+ }
821
+
822
+ /* Swap script for obj's old script, if any. */
823
+ v = LOCKED_OBJ_GET_SLOT(obj, JSSLOT_PRIVATE);
824
+ oldscript = !JSVAL_IS_VOID(v) ? JSVAL_TO_PRIVATE(v) : NULL;
825
+ LOCKED_OBJ_SET_SLOT(obj, JSSLOT_PRIVATE, PRIVATE_TO_JSVAL(script));
826
+ JS_UNLOCK_OBJ(cx, obj);
827
+
828
+ if (oldscript)
829
+ js_DestroyScript(cx, oldscript);
830
+
831
+ script->u.object = obj;
832
+ js_CallNewScriptHook(cx, script, NULL);
833
+
834
+ out:
835
+ /*
836
+ * We reset the buffer to be NULL so that it doesn't free the chars
837
+ * memory owned by str (vp[2]).
838
+ */
839
+ JS_XDRMemSetData(xdr, NULL, 0);
840
+ JS_XDRDestroy(xdr);
841
+ #if IS_BIG_ENDIAN
842
+ JS_free(cx, buf);
843
+ #endif
844
+ *vp = JSVAL_TRUE;
845
+ return ok;
846
+ }
847
+
848
+ static const char js_thaw_str[] = "thaw";
849
+
850
+ #endif /* JS_HAS_SCRIPT_OBJECT && JS_HAS_XDR_FREEZE_THAW */
851
+ #endif /* JS_HAS_XDR */
852
+
853
+ #if JS_HAS_SCRIPT_OBJECT
854
+
855
+ static JSFunctionSpec script_methods[] = {
856
+ #if JS_HAS_TOSOURCE
857
+ JS_FN(js_toSource_str, script_toSource, 0,0),
858
+ #endif
859
+ JS_FN(js_toString_str, script_toString, 0,0),
860
+ JS_FN("compile", script_compile, 2,0),
861
+ JS_FN("exec", script_exec, 1,0),
862
+ #if JS_HAS_XDR_FREEZE_THAW
863
+ JS_FN("freeze", script_freeze, 0,0),
864
+ JS_FN(js_thaw_str, script_thaw, 1,0),
865
+ #endif /* JS_HAS_XDR_FREEZE_THAW */
866
+ JS_FS_END
867
+ };
868
+
869
+ #endif /* JS_HAS_SCRIPT_OBJECT */
870
+
871
+ static void
872
+ script_finalize(JSContext *cx, JSObject *obj)
873
+ {
874
+ JSScript *script;
875
+
876
+ script = (JSScript *) JS_GetPrivate(cx, obj);
877
+ if (script)
878
+ js_DestroyScript(cx, script);
879
+ }
880
+
881
+ static JSBool
882
+ script_call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
883
+ {
884
+ #if JS_HAS_SCRIPT_OBJECT
885
+ return script_exec_sub(cx, JSVAL_TO_OBJECT(argv[-2]), argc, argv, rval);
886
+ #else
887
+ return JS_FALSE;
888
+ #endif
889
+ }
890
+
891
+ static void
892
+ script_trace(JSTracer *trc, JSObject *obj)
893
+ {
894
+ JSScript *script;
895
+
896
+ script = (JSScript *) JS_GetPrivate(trc->context, obj);
897
+ if (script)
898
+ js_TraceScript(trc, script);
899
+ }
900
+
901
+ #if !JS_HAS_SCRIPT_OBJECT
902
+ #define JSProto_Script JSProto_Object
903
+ #endif
904
+
905
+ JS_FRIEND_DATA(JSClass) js_ScriptClass = {
906
+ js_Script_str,
907
+ JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(1) |
908
+ JSCLASS_MARK_IS_TRACE | JSCLASS_HAS_CACHED_PROTO(JSProto_Script),
909
+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
910
+ JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, script_finalize,
911
+ NULL, NULL, script_call, NULL,/*XXXbe xdr*/
912
+ NULL, NULL, JS_CLASS_TRACE(script_trace), NULL
913
+ };
914
+
915
+ #if JS_HAS_SCRIPT_OBJECT
916
+
917
+ static JSBool
918
+ Script(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
919
+ {
920
+ /* If not constructing, replace obj with a new Script object. */
921
+ if (!JS_IsConstructing(cx)) {
922
+ obj = js_NewObject(cx, &js_ScriptClass, NULL, NULL, 0);
923
+ if (!obj)
924
+ return JS_FALSE;
925
+
926
+ /*
927
+ * script_compile_sub does not use rval to root its temporaries so we
928
+ * can use it to root obj.
929
+ */
930
+ *rval = OBJECT_TO_JSVAL(obj);
931
+ }
932
+
933
+ if (!JS_SetReservedSlot(cx, obj, 0, INT_TO_JSVAL(0)))
934
+ return JS_FALSE;
935
+
936
+ return script_compile_sub(cx, obj, argc, argv, rval);
937
+ }
938
+
939
+ #if JS_HAS_SCRIPT_OBJECT && JS_HAS_XDR_FREEZE_THAW
940
+
941
+ static JSBool
942
+ script_static_thaw(JSContext *cx, uintN argc, jsval *vp)
943
+ {
944
+ JSObject *obj;
945
+
946
+ obj = js_NewObject(cx, &js_ScriptClass, NULL, NULL);
947
+ if (!obj)
948
+ return JS_FALSE;
949
+ vp[1] = OBJECT_TO_JSVAL(obj);
950
+ if (!script_thaw(cx, argc, vp))
951
+ return JS_FALSE;
952
+ *vp = OBJECT_TO_JSVAL(obj);
953
+ return JS_TRUE;
954
+ }
955
+
956
+ static JSFunctionSpec script_static_methods[] = {
957
+ JS_FN(js_thaw_str, script_static_thaw, 1,0),
958
+ JS_FS_END
959
+ };
960
+
961
+ #else /* !JS_HAS_SCRIPT_OBJECT || !JS_HAS_XDR_FREEZE_THAW */
962
+
963
+ #define script_static_methods NULL
964
+
965
+ #endif /* !JS_HAS_SCRIPT_OBJECT || !JS_HAS_XDR_FREEZE_THAW */
966
+
967
+ JSObject *
968
+ js_InitScriptClass(JSContext *cx, JSObject *obj)
969
+ {
970
+ return JS_InitClass(cx, obj, NULL, &js_ScriptClass, Script, 1,
971
+ NULL, script_methods, NULL, script_static_methods);
972
+ }
973
+
974
+ #endif /* JS_HAS_SCRIPT_OBJECT */
975
+
976
+ /*
977
+ * Shared script filename management.
978
+ */
979
+ static int
980
+ js_compare_strings(const void *k1, const void *k2)
981
+ {
982
+ return strcmp((const char *) k1, (const char *) k2) == 0;
983
+ }
984
+
985
+ /* NB: This struct overlays JSHashEntry -- see jshash.h, do not reorganize. */
986
+ typedef struct ScriptFilenameEntry {
987
+ JSHashEntry *next; /* hash chain linkage */
988
+ JSHashNumber keyHash; /* key hash function result */
989
+ const void *key; /* ptr to filename, below */
990
+ uint32 flags; /* user-defined filename prefix flags */
991
+ JSPackedBool mark; /* GC mark flag */
992
+ char filename[3]; /* two or more bytes, NUL-terminated */
993
+ } ScriptFilenameEntry;
994
+
995
+ static void *
996
+ js_alloc_table_space(void *priv, size_t size)
997
+ {
998
+ return malloc(size);
999
+ }
1000
+
1001
+ static void
1002
+ js_free_table_space(void *priv, void *item, size_t size)
1003
+ {
1004
+ free(item);
1005
+ }
1006
+
1007
+ static JSHashEntry *
1008
+ js_alloc_sftbl_entry(void *priv, const void *key)
1009
+ {
1010
+ size_t nbytes = offsetof(ScriptFilenameEntry, filename) +
1011
+ strlen((const char *) key) + 1;
1012
+
1013
+ return (JSHashEntry *) malloc(JS_MAX(nbytes, sizeof(JSHashEntry)));
1014
+ }
1015
+
1016
+ static void
1017
+ js_free_sftbl_entry(void *priv, JSHashEntry *he, uintN flag)
1018
+ {
1019
+ if (flag != HT_FREE_ENTRY)
1020
+ return;
1021
+ free(he);
1022
+ }
1023
+
1024
+ static JSHashAllocOps sftbl_alloc_ops = {
1025
+ js_alloc_table_space, js_free_table_space,
1026
+ js_alloc_sftbl_entry, js_free_sftbl_entry
1027
+ };
1028
+
1029
+ JSBool
1030
+ js_InitRuntimeScriptState(JSRuntime *rt)
1031
+ {
1032
+ #ifdef JS_THREADSAFE
1033
+ JS_ASSERT(!rt->scriptFilenameTableLock);
1034
+ rt->scriptFilenameTableLock = JS_NEW_LOCK();
1035
+ if (!rt->scriptFilenameTableLock)
1036
+ return JS_FALSE;
1037
+ #endif
1038
+ JS_ASSERT(!rt->scriptFilenameTable);
1039
+ rt->scriptFilenameTable =
1040
+ JS_NewHashTable(16, JS_HashString, js_compare_strings, NULL,
1041
+ &sftbl_alloc_ops, NULL);
1042
+ if (!rt->scriptFilenameTable) {
1043
+ js_FinishRuntimeScriptState(rt); /* free lock if threadsafe */
1044
+ return JS_FALSE;
1045
+ }
1046
+ JS_INIT_CLIST(&rt->scriptFilenamePrefixes);
1047
+ return JS_TRUE;
1048
+ }
1049
+
1050
+ typedef struct ScriptFilenamePrefix {
1051
+ JSCList links; /* circular list linkage for easy deletion */
1052
+ const char *name; /* pointer to pinned ScriptFilenameEntry string */
1053
+ size_t length; /* prefix string length, precomputed */
1054
+ uint32 flags; /* user-defined flags to inherit from this prefix */
1055
+ } ScriptFilenamePrefix;
1056
+
1057
+ void
1058
+ js_FinishRuntimeScriptState(JSRuntime *rt)
1059
+ {
1060
+ if (rt->scriptFilenameTable) {
1061
+ JS_HashTableDestroy(rt->scriptFilenameTable);
1062
+ rt->scriptFilenameTable = NULL;
1063
+ }
1064
+ #ifdef JS_THREADSAFE
1065
+ if (rt->scriptFilenameTableLock) {
1066
+ JS_DESTROY_LOCK(rt->scriptFilenameTableLock);
1067
+ rt->scriptFilenameTableLock = NULL;
1068
+ }
1069
+ #endif
1070
+ }
1071
+
1072
+ void
1073
+ js_FreeRuntimeScriptState(JSRuntime *rt)
1074
+ {
1075
+ ScriptFilenamePrefix *sfp;
1076
+
1077
+ if (!rt->scriptFilenameTable)
1078
+ return;
1079
+
1080
+ while (!JS_CLIST_IS_EMPTY(&rt->scriptFilenamePrefixes)) {
1081
+ sfp = (ScriptFilenamePrefix *) rt->scriptFilenamePrefixes.next;
1082
+ JS_REMOVE_LINK(&sfp->links);
1083
+ free(sfp);
1084
+ }
1085
+ js_FinishRuntimeScriptState(rt);
1086
+ }
1087
+
1088
+ #ifdef DEBUG_brendan
1089
+ #define DEBUG_SFTBL
1090
+ #endif
1091
+ #ifdef DEBUG_SFTBL
1092
+ size_t sftbl_savings = 0;
1093
+ #endif
1094
+
1095
+ static ScriptFilenameEntry *
1096
+ SaveScriptFilename(JSRuntime *rt, const char *filename, uint32 flags)
1097
+ {
1098
+ JSHashTable *table;
1099
+ JSHashNumber hash;
1100
+ JSHashEntry **hep;
1101
+ ScriptFilenameEntry *sfe;
1102
+ size_t length;
1103
+ JSCList *head, *link;
1104
+ ScriptFilenamePrefix *sfp;
1105
+
1106
+ table = rt->scriptFilenameTable;
1107
+ hash = JS_HashString(filename);
1108
+ hep = JS_HashTableRawLookup(table, hash, filename);
1109
+ sfe = (ScriptFilenameEntry *) *hep;
1110
+ #ifdef DEBUG_SFTBL
1111
+ if (sfe)
1112
+ sftbl_savings += strlen(sfe->filename);
1113
+ #endif
1114
+
1115
+ if (!sfe) {
1116
+ sfe = (ScriptFilenameEntry *)
1117
+ JS_HashTableRawAdd(table, hep, hash, filename, NULL);
1118
+ if (!sfe)
1119
+ return NULL;
1120
+ sfe->key = strcpy(sfe->filename, filename);
1121
+ sfe->flags = 0;
1122
+ sfe->mark = JS_FALSE;
1123
+ }
1124
+
1125
+ /* If saving a prefix, add it to the set in rt->scriptFilenamePrefixes. */
1126
+ if (flags != 0) {
1127
+ /* Search in case filename was saved already; we must be idempotent. */
1128
+ sfp = NULL;
1129
+ length = strlen(filename);
1130
+ for (head = link = &rt->scriptFilenamePrefixes;
1131
+ link->next != head;
1132
+ link = link->next) {
1133
+ /* Lag link behind sfp to insert in non-increasing length order. */
1134
+ sfp = (ScriptFilenamePrefix *) link->next;
1135
+ if (!strcmp(sfp->name, filename))
1136
+ break;
1137
+ if (sfp->length <= length) {
1138
+ sfp = NULL;
1139
+ break;
1140
+ }
1141
+ sfp = NULL;
1142
+ }
1143
+
1144
+ if (!sfp) {
1145
+ /* No such prefix: add one now. */
1146
+ sfp = (ScriptFilenamePrefix *) malloc(sizeof(ScriptFilenamePrefix));
1147
+ if (!sfp)
1148
+ return NULL;
1149
+ JS_INSERT_AFTER(&sfp->links, link);
1150
+ sfp->name = sfe->filename;
1151
+ sfp->length = length;
1152
+ sfp->flags = 0;
1153
+ }
1154
+
1155
+ /*
1156
+ * Accumulate flags in both sfe and sfp: sfe for later access from the
1157
+ * JS_GetScriptedCallerFilenameFlags debug-API, and sfp so that longer
1158
+ * filename entries can inherit by prefix.
1159
+ */
1160
+ sfe->flags |= flags;
1161
+ sfp->flags |= flags;
1162
+ }
1163
+
1164
+ #ifdef JS_FUNCTION_METERING
1165
+ size_t len = strlen(sfe->filename);
1166
+ if (len >= sizeof rt->lastScriptFilename)
1167
+ len = sizeof rt->lastScriptFilename - 1;
1168
+ memcpy(rt->lastScriptFilename, sfe->filename, len);
1169
+ rt->lastScriptFilename[len] = '\0';
1170
+ #endif
1171
+
1172
+ return sfe;
1173
+ }
1174
+
1175
+ const char *
1176
+ js_SaveScriptFilename(JSContext *cx, const char *filename)
1177
+ {
1178
+ JSRuntime *rt;
1179
+ ScriptFilenameEntry *sfe;
1180
+ JSCList *head, *link;
1181
+ ScriptFilenamePrefix *sfp;
1182
+
1183
+ rt = cx->runtime;
1184
+ JS_ACQUIRE_LOCK(rt->scriptFilenameTableLock);
1185
+ sfe = SaveScriptFilename(rt, filename, 0);
1186
+ if (!sfe) {
1187
+ JS_RELEASE_LOCK(rt->scriptFilenameTableLock);
1188
+ JS_ReportOutOfMemory(cx);
1189
+ return NULL;
1190
+ }
1191
+
1192
+ /*
1193
+ * Try to inherit flags by prefix. We assume there won't be more than a
1194
+ * few (dozen! ;-) prefixes, so linear search is tolerable.
1195
+ * XXXbe every time I've assumed that in the JS engine, I've been wrong!
1196
+ */
1197
+ for (head = &rt->scriptFilenamePrefixes, link = head->next;
1198
+ link != head;
1199
+ link = link->next) {
1200
+ sfp = (ScriptFilenamePrefix *) link;
1201
+ if (!strncmp(sfp->name, filename, sfp->length)) {
1202
+ sfe->flags |= sfp->flags;
1203
+ break;
1204
+ }
1205
+ }
1206
+ JS_RELEASE_LOCK(rt->scriptFilenameTableLock);
1207
+ return sfe->filename;
1208
+ }
1209
+
1210
+ const char *
1211
+ js_SaveScriptFilenameRT(JSRuntime *rt, const char *filename, uint32 flags)
1212
+ {
1213
+ ScriptFilenameEntry *sfe;
1214
+
1215
+ /* This may be called very early, via the jsdbgapi.h entry point. */
1216
+ if (!rt->scriptFilenameTable && !js_InitRuntimeScriptState(rt))
1217
+ return NULL;
1218
+
1219
+ JS_ACQUIRE_LOCK(rt->scriptFilenameTableLock);
1220
+ sfe = SaveScriptFilename(rt, filename, flags);
1221
+ JS_RELEASE_LOCK(rt->scriptFilenameTableLock);
1222
+ if (!sfe)
1223
+ return NULL;
1224
+
1225
+ return sfe->filename;
1226
+ }
1227
+
1228
+ /*
1229
+ * Back up from a saved filename by its offset within its hash table entry.
1230
+ */
1231
+ #define FILENAME_TO_SFE(fn) \
1232
+ ((ScriptFilenameEntry *) ((fn) - offsetof(ScriptFilenameEntry, filename)))
1233
+
1234
+ /*
1235
+ * The sfe->key member, redundant given sfe->filename but required by the old
1236
+ * jshash.c code, here gives us a useful sanity check. This assertion will
1237
+ * very likely botch if someone tries to mark a string that wasn't allocated
1238
+ * as an sfe->filename.
1239
+ */
1240
+ #define ASSERT_VALID_SFE(sfe) JS_ASSERT((sfe)->key == (sfe)->filename)
1241
+
1242
+ uint32
1243
+ js_GetScriptFilenameFlags(const char *filename)
1244
+ {
1245
+ ScriptFilenameEntry *sfe;
1246
+
1247
+ sfe = FILENAME_TO_SFE(filename);
1248
+ ASSERT_VALID_SFE(sfe);
1249
+ return sfe->flags;
1250
+ }
1251
+
1252
+ void
1253
+ js_MarkScriptFilename(const char *filename)
1254
+ {
1255
+ ScriptFilenameEntry *sfe;
1256
+
1257
+ sfe = FILENAME_TO_SFE(filename);
1258
+ ASSERT_VALID_SFE(sfe);
1259
+ sfe->mark = JS_TRUE;
1260
+ }
1261
+
1262
+ static intN
1263
+ js_script_filename_marker(JSHashEntry *he, intN i, void *arg)
1264
+ {
1265
+ ScriptFilenameEntry *sfe = (ScriptFilenameEntry *) he;
1266
+
1267
+ sfe->mark = JS_TRUE;
1268
+ return HT_ENUMERATE_NEXT;
1269
+ }
1270
+
1271
+ void
1272
+ js_MarkScriptFilenames(JSRuntime *rt, JSBool keepAtoms)
1273
+ {
1274
+ JSCList *head, *link;
1275
+ ScriptFilenamePrefix *sfp;
1276
+
1277
+ if (!rt->scriptFilenameTable)
1278
+ return;
1279
+
1280
+ if (keepAtoms) {
1281
+ JS_HashTableEnumerateEntries(rt->scriptFilenameTable,
1282
+ js_script_filename_marker,
1283
+ rt);
1284
+ }
1285
+ for (head = &rt->scriptFilenamePrefixes, link = head->next;
1286
+ link != head;
1287
+ link = link->next) {
1288
+ sfp = (ScriptFilenamePrefix *) link;
1289
+ js_MarkScriptFilename(sfp->name);
1290
+ }
1291
+ }
1292
+
1293
+ static intN
1294
+ js_script_filename_sweeper(JSHashEntry *he, intN i, void *arg)
1295
+ {
1296
+ ScriptFilenameEntry *sfe = (ScriptFilenameEntry *) he;
1297
+
1298
+ if (!sfe->mark)
1299
+ return HT_ENUMERATE_REMOVE;
1300
+ sfe->mark = JS_FALSE;
1301
+ return HT_ENUMERATE_NEXT;
1302
+ }
1303
+
1304
+ void
1305
+ js_SweepScriptFilenames(JSRuntime *rt)
1306
+ {
1307
+ if (!rt->scriptFilenameTable)
1308
+ return;
1309
+
1310
+ JS_HashTableEnumerateEntries(rt->scriptFilenameTable,
1311
+ js_script_filename_sweeper,
1312
+ rt);
1313
+ #ifdef DEBUG_notme
1314
+ #ifdef DEBUG_SFTBL
1315
+ printf("script filename table savings so far: %u\n", sftbl_savings);
1316
+ #endif
1317
+ #endif
1318
+ }
1319
+
1320
+ /*
1321
+ * JSScript data structures memory alignment:
1322
+ *
1323
+ * JSScript
1324
+ * JSObjectArray script objects' descriptor if JSScript.objectsOffset != 0,
1325
+ * use JS_SCRIPT_OBJECTS(script) macro to access it.
1326
+ * JSObjectArray script regexps' descriptor if JSScript.regexpsOffset != 0,
1327
+ * use JS_SCRIPT_REGEXPS(script) macro to access it.
1328
+ * JSTryNoteArray script try notes' descriptor if JSScript.tryNotesOffset
1329
+ * != 0, use JS_SCRIPT_TRYNOTES(script) macro to access it.
1330
+ * JSAtom *a[] array of JSScript.atomMap.length atoms pointed by
1331
+ * JSScript.atomMap.vector if any.
1332
+ * JSObject *o[] array of JS_SCRIPT_OBJECTS(script)->length objects if any
1333
+ * pointed by JS_SCRIPT_OBJECTS(script)->vector.
1334
+ * JSObject *r[] array of JS_SCRIPT_REGEXPS(script)->length regexps if any
1335
+ * pointed by JS_SCRIPT_REGEXPS(script)->vector.
1336
+ * JSTryNote t[] array of JS_SCRIPT_TRYNOTES(script)->length try notes if any
1337
+ * pointed by JS_SCRIPT_TRYNOTES(script)->vector.
1338
+ * jsbytecode b[] script bytecode pointed by JSScript.code.
1339
+ * jssrcnote s[] script source notes, use SCRIPT_NOTES(script) to access it
1340
+ *
1341
+ * The alignment avoids gaps between entries as alignment requirement for each
1342
+ * subsequent structure or array is the same or divides the alignment
1343
+ * requirement for the previous one.
1344
+ *
1345
+ * The followings asserts checks that assuming that the alignment requirement
1346
+ * for JSObjectArray and JSTryNoteArray are sizeof(void *) and for JSTryNote
1347
+ * it is sizeof(uint32) as the structure consists of 3 uint32 fields.
1348
+ */
1349
+ JS_STATIC_ASSERT(sizeof(JSScript) % sizeof(void *) == 0);
1350
+ JS_STATIC_ASSERT(sizeof(JSObjectArray) % sizeof(void *) == 0);
1351
+ JS_STATIC_ASSERT(sizeof(JSTryNoteArray) == sizeof(JSObjectArray));
1352
+ JS_STATIC_ASSERT(sizeof(JSAtom *) == sizeof(JSObject *));
1353
+ JS_STATIC_ASSERT(sizeof(JSObject *) % sizeof(uint32) == 0);
1354
+ JS_STATIC_ASSERT(sizeof(JSTryNote) == 3 * sizeof(uint32));
1355
+ JS_STATIC_ASSERT(sizeof(uint32) % sizeof(jsbytecode) == 0);
1356
+ JS_STATIC_ASSERT(sizeof(jsbytecode) % sizeof(jssrcnote) == 0);
1357
+
1358
+ /*
1359
+ * Check that uint8 offset for object, upvar, regexp, and try note arrays is
1360
+ * sufficient.
1361
+ */
1362
+ JS_STATIC_ASSERT(sizeof(JSScript) + 2 * sizeof(JSObjectArray) +
1363
+ sizeof(JSUpvarArray) < JS_BIT(8));
1364
+
1365
+ JSScript *
1366
+ js_NewScript(JSContext *cx, uint32 length, uint32 nsrcnotes, uint32 natoms,
1367
+ uint32 nobjects, uint32 nupvars, uint32 nregexps,
1368
+ uint32 ntrynotes)
1369
+ {
1370
+ size_t size, vectorSize;
1371
+ JSScript *script;
1372
+ uint8 *cursor;
1373
+
1374
+ size = sizeof(JSScript) +
1375
+ sizeof(JSAtom *) * natoms +
1376
+ length * sizeof(jsbytecode) +
1377
+ nsrcnotes * sizeof(jssrcnote);
1378
+ if (nobjects != 0)
1379
+ size += sizeof(JSObjectArray) + nobjects * sizeof(JSObject *);
1380
+ if (nupvars != 0)
1381
+ size += sizeof(JSUpvarArray) + nupvars * sizeof(uint32);
1382
+ if (nregexps != 0)
1383
+ size += sizeof(JSObjectArray) + nregexps * sizeof(JSObject *);
1384
+ if (ntrynotes != 0)
1385
+ size += sizeof(JSTryNoteArray) + ntrynotes * sizeof(JSTryNote);
1386
+
1387
+ script = (JSScript *) JS_malloc(cx, size);
1388
+ if (!script)
1389
+ return NULL;
1390
+ memset(script, 0, sizeof(JSScript));
1391
+ script->length = length;
1392
+ script->version = cx->version;
1393
+
1394
+ cursor = (uint8 *)script + sizeof(JSScript);
1395
+ if (nobjects != 0) {
1396
+ script->objectsOffset = (uint8)(cursor - (uint8 *)script);
1397
+ cursor += sizeof(JSObjectArray);
1398
+ }
1399
+ if (nupvars != 0) {
1400
+ script->upvarsOffset = (uint8)(cursor - (uint8 *)script);
1401
+ cursor += sizeof(JSUpvarArray);
1402
+ }
1403
+ if (nregexps != 0) {
1404
+ script->regexpsOffset = (uint8)(cursor - (uint8 *)script);
1405
+ cursor += sizeof(JSObjectArray);
1406
+ }
1407
+ if (ntrynotes != 0) {
1408
+ script->trynotesOffset = (uint8)(cursor - (uint8 *)script);
1409
+ cursor += sizeof(JSTryNoteArray);
1410
+ }
1411
+
1412
+ if (natoms != 0) {
1413
+ script->atomMap.length = natoms;
1414
+ script->atomMap.vector = (JSAtom **)cursor;
1415
+ vectorSize = natoms * sizeof(script->atomMap.vector[0]);
1416
+
1417
+ /*
1418
+ * Clear object map's vector so the GC tracing can run when not yet
1419
+ * all atoms are copied to the array.
1420
+ */
1421
+ memset(cursor, 0, vectorSize);
1422
+ cursor += vectorSize;
1423
+ }
1424
+
1425
+ if (nobjects != 0) {
1426
+ JS_SCRIPT_OBJECTS(script)->length = nobjects;
1427
+ JS_SCRIPT_OBJECTS(script)->vector = (JSObject **)cursor;
1428
+ vectorSize = nobjects * sizeof(JS_SCRIPT_OBJECTS(script)->vector[0]);
1429
+ memset(cursor, 0, vectorSize);
1430
+ cursor += vectorSize;
1431
+ }
1432
+
1433
+ if (nupvars != 0) {
1434
+ JS_SCRIPT_UPVARS(script)->length = nupvars;
1435
+ JS_SCRIPT_UPVARS(script)->vector = (uint32 *)cursor;
1436
+ vectorSize = nupvars * sizeof(JS_SCRIPT_UPVARS(script)->vector[0]);
1437
+ memset(cursor, 0, vectorSize);
1438
+ cursor += vectorSize;
1439
+ }
1440
+
1441
+ if (nregexps != 0) {
1442
+ JS_SCRIPT_REGEXPS(script)->length = nregexps;
1443
+ JS_SCRIPT_REGEXPS(script)->vector = (JSObject **)cursor;
1444
+ vectorSize = nregexps * sizeof(JS_SCRIPT_REGEXPS(script)->vector[0]);
1445
+ memset(cursor, 0, vectorSize);
1446
+ cursor += vectorSize;
1447
+ }
1448
+
1449
+ if (ntrynotes != 0) {
1450
+ JS_SCRIPT_TRYNOTES(script)->length = ntrynotes;
1451
+ JS_SCRIPT_TRYNOTES(script)->vector = (JSTryNote *)cursor;
1452
+ vectorSize = ntrynotes * sizeof(JS_SCRIPT_TRYNOTES(script)->vector[0]);
1453
+ #ifdef DEBUG
1454
+ memset(cursor, 0, vectorSize);
1455
+ #endif
1456
+ cursor += vectorSize;
1457
+ }
1458
+
1459
+ script->code = script->main = (jsbytecode *)cursor;
1460
+ JS_ASSERT(cursor +
1461
+ length * sizeof(jsbytecode) +
1462
+ nsrcnotes * sizeof(jssrcnote) ==
1463
+ (uint8 *)script + size);
1464
+
1465
+ #ifdef CHECK_SCRIPT_OWNER
1466
+ script->owner = cx->thread;
1467
+ #endif
1468
+ return script;
1469
+ }
1470
+
1471
+ JSScript *
1472
+ js_NewScriptFromCG(JSContext *cx, JSCodeGenerator *cg)
1473
+ {
1474
+ uint32 mainLength, prologLength, nsrcnotes, nfixed;
1475
+ JSScript *script;
1476
+ const char *filename;
1477
+ JSFunction *fun;
1478
+
1479
+ /* The counts of indexed things must be checked during code generation. */
1480
+ JS_ASSERT(cg->atomList.count <= INDEX_LIMIT);
1481
+ JS_ASSERT(cg->objectList.length <= INDEX_LIMIT);
1482
+ JS_ASSERT(cg->regexpList.length <= INDEX_LIMIT);
1483
+
1484
+ mainLength = CG_OFFSET(cg);
1485
+ prologLength = CG_PROLOG_OFFSET(cg);
1486
+ CG_COUNT_FINAL_SRCNOTES(cg, nsrcnotes);
1487
+ script = js_NewScript(cx, prologLength + mainLength, nsrcnotes,
1488
+ cg->atomList.count, cg->objectList.length,
1489
+ cg->upvarList.count, cg->regexpList.length,
1490
+ cg->ntrynotes);
1491
+ if (!script)
1492
+ return NULL;
1493
+
1494
+ /* Now that we have script, error control flow must go to label bad. */
1495
+ script->main += prologLength;
1496
+ memcpy(script->code, CG_PROLOG_BASE(cg), prologLength * sizeof(jsbytecode));
1497
+ memcpy(script->main, CG_BASE(cg), mainLength * sizeof(jsbytecode));
1498
+ nfixed = (cg->flags & TCF_IN_FUNCTION)
1499
+ ? cg->fun->u.i.nvars
1500
+ : cg->ngvars + cg->regexpList.length;
1501
+ JS_ASSERT(nfixed < SLOTNO_LIMIT);
1502
+ script->nfixed = (uint16) nfixed;
1503
+ js_InitAtomMap(cx, &script->atomMap, &cg->atomList);
1504
+
1505
+ filename = cg->compiler->tokenStream.filename;
1506
+ if (filename) {
1507
+ script->filename = js_SaveScriptFilename(cx, filename);
1508
+ if (!script->filename)
1509
+ goto bad;
1510
+ }
1511
+ script->lineno = cg->firstLine;
1512
+ if (script->nfixed + cg->maxStackDepth >= JS_BIT(16)) {
1513
+ js_ReportCompileErrorNumber(cx, CG_TS(cg), NULL, JSREPORT_ERROR,
1514
+ JSMSG_NEED_DIET, "script");
1515
+ goto bad;
1516
+ }
1517
+ script->nslots = script->nfixed + cg->maxStackDepth;
1518
+ script->staticLevel = cg->staticLevel;
1519
+ script->principals = cg->compiler->principals;
1520
+ if (script->principals)
1521
+ JSPRINCIPALS_HOLD(cx, script->principals);
1522
+
1523
+ if (!js_FinishTakingSrcNotes(cx, cg, SCRIPT_NOTES(script)))
1524
+ goto bad;
1525
+ if (cg->ntrynotes != 0)
1526
+ js_FinishTakingTryNotes(cg, JS_SCRIPT_TRYNOTES(script));
1527
+ if (cg->objectList.length != 0)
1528
+ cg->objectList.finish(JS_SCRIPT_OBJECTS(script));
1529
+ if (cg->regexpList.length != 0)
1530
+ cg->regexpList.finish(JS_SCRIPT_REGEXPS(script));
1531
+ if (cg->flags & TCF_NO_SCRIPT_RVAL)
1532
+ script->flags |= JSSF_NO_SCRIPT_RVAL;
1533
+
1534
+ if (cg->upvarList.count != 0) {
1535
+ JS_ASSERT(cg->upvarList.count <= cg->upvarMap.length);
1536
+ memcpy(JS_SCRIPT_UPVARS(script)->vector, cg->upvarMap.vector,
1537
+ cg->upvarList.count * sizeof(uint32));
1538
+ cg->upvarList.clear();
1539
+ JS_free(cx, cg->upvarMap.vector);
1540
+ cg->upvarMap.vector = NULL;
1541
+ }
1542
+
1543
+ /*
1544
+ * We initialize fun->u.script to be the script constructed above
1545
+ * so that the debugger has a valid FUN_SCRIPT(fun).
1546
+ */
1547
+ fun = NULL;
1548
+ if (cg->flags & TCF_IN_FUNCTION) {
1549
+ fun = cg->fun;
1550
+ JS_ASSERT(FUN_INTERPRETED(fun) && !FUN_SCRIPT(fun));
1551
+ JS_ASSERT_IF(script->upvarsOffset != 0,
1552
+ JS_SCRIPT_UPVARS(script)->length == fun->u.i.nupvars);
1553
+
1554
+ js_FreezeLocalNames(cx, fun);
1555
+ fun->u.i.script = script;
1556
+ #ifdef CHECK_SCRIPT_OWNER
1557
+ script->owner = NULL;
1558
+ #endif
1559
+ if (cg->flags & TCF_FUN_HEAVYWEIGHT)
1560
+ fun->flags |= JSFUN_HEAVYWEIGHT;
1561
+ }
1562
+
1563
+ /* Tell the debugger about this compiled script. */
1564
+ js_CallNewScriptHook(cx, script, fun);
1565
+ return script;
1566
+
1567
+ bad:
1568
+ js_DestroyScript(cx, script);
1569
+ return NULL;
1570
+ }
1571
+
1572
+ JS_FRIEND_API(void)
1573
+ js_CallNewScriptHook(JSContext *cx, JSScript *script, JSFunction *fun)
1574
+ {
1575
+ JSNewScriptHook hook;
1576
+
1577
+ hook = cx->debugHooks->newScriptHook;
1578
+ if (hook) {
1579
+ JS_KEEP_ATOMS(cx->runtime);
1580
+ hook(cx, script->filename, script->lineno, script, fun,
1581
+ cx->debugHooks->newScriptHookData);
1582
+ JS_UNKEEP_ATOMS(cx->runtime);
1583
+ }
1584
+ }
1585
+
1586
+ JS_FRIEND_API(void)
1587
+ js_CallDestroyScriptHook(JSContext *cx, JSScript *script)
1588
+ {
1589
+ JSDestroyScriptHook hook;
1590
+
1591
+ hook = cx->debugHooks->destroyScriptHook;
1592
+ if (hook)
1593
+ hook(cx, script, cx->debugHooks->destroyScriptHookData);
1594
+ }
1595
+
1596
+ void
1597
+ js_DestroyScript(JSContext *cx, JSScript *script)
1598
+ {
1599
+ js_CallDestroyScriptHook(cx, script);
1600
+ JS_ClearScriptTraps(cx, script);
1601
+
1602
+ if (script->principals)
1603
+ JSPRINCIPALS_DROP(cx, script->principals);
1604
+
1605
+ if (JS_GSN_CACHE(cx).code == script->code)
1606
+ JS_PURGE_GSN_CACHE(cx);
1607
+
1608
+ /*
1609
+ * The GC flushes all property caches, so no need to purge just the
1610
+ * entries for this script.
1611
+ *
1612
+ * JS_THREADSAFE note: js_PurgePropertyCacheForScript purges only the
1613
+ * current thread's property cache, so a script not owned by a function
1614
+ * or object, which hands off lifetime management for that script to the
1615
+ * GC, must be used by only one thread over its lifetime.
1616
+ *
1617
+ * This should be an API-compatible change, since a script is never safe
1618
+ * against premature GC if shared among threads without a rooted object
1619
+ * wrapping it to protect the script's mapped atoms against GC. We use
1620
+ * script->owner to enforce this requirement via assertions.
1621
+ */
1622
+ #ifdef CHECK_SCRIPT_OWNER
1623
+ JS_ASSERT_IF(cx->runtime->gcRunning, !script->owner);
1624
+ #endif
1625
+
1626
+ if (!cx->runtime->gcRunning) {
1627
+ JSStackFrame *fp = js_GetTopStackFrame(cx);
1628
+
1629
+ if (!(fp && (fp->flags & JSFRAME_EVAL))) {
1630
+ #ifdef CHECK_SCRIPT_OWNER
1631
+ JS_ASSERT(script->owner == cx->thread);
1632
+ #endif
1633
+ js_PurgePropertyCacheForScript(cx, script);
1634
+ #ifdef JS_TRACER
1635
+ js_PurgeScriptFragments(cx, script);
1636
+ #endif
1637
+ }
1638
+ }
1639
+
1640
+ JS_free(cx, script);
1641
+ }
1642
+
1643
+ void
1644
+ js_TraceScript(JSTracer *trc, JSScript *script)
1645
+ {
1646
+ JSAtomMap *map;
1647
+ uintN i, length;
1648
+ JSAtom **vector;
1649
+ jsval v;
1650
+ JSObjectArray *objarray;
1651
+
1652
+ map = &script->atomMap;
1653
+ length = map->length;
1654
+ vector = map->vector;
1655
+ for (i = 0; i < length; i++) {
1656
+ v = ATOM_KEY(vector[i]);
1657
+ if (JSVAL_IS_TRACEABLE(v)) {
1658
+ JS_SET_TRACING_INDEX(trc, "atomMap", i);
1659
+ JS_CallTracer(trc, JSVAL_TO_TRACEABLE(v), JSVAL_TRACE_KIND(v));
1660
+ }
1661
+ }
1662
+
1663
+ if (script->objectsOffset != 0) {
1664
+ objarray = JS_SCRIPT_OBJECTS(script);
1665
+ i = objarray->length;
1666
+ do {
1667
+ --i;
1668
+ if (objarray->vector[i]) {
1669
+ JS_SET_TRACING_INDEX(trc, "objects", i);
1670
+ JS_CallTracer(trc, objarray->vector[i], JSTRACE_OBJECT);
1671
+ }
1672
+ } while (i != 0);
1673
+ }
1674
+
1675
+ if (script->regexpsOffset != 0) {
1676
+ objarray = JS_SCRIPT_REGEXPS(script);
1677
+ i = objarray->length;
1678
+ do {
1679
+ --i;
1680
+ if (objarray->vector[i]) {
1681
+ JS_SET_TRACING_INDEX(trc, "regexps", i);
1682
+ JS_CallTracer(trc, objarray->vector[i], JSTRACE_OBJECT);
1683
+ }
1684
+ } while (i != 0);
1685
+ }
1686
+
1687
+ if (script->u.object) {
1688
+ JS_SET_TRACING_NAME(trc, "object");
1689
+ JS_CallTracer(trc, script->u.object, JSTRACE_OBJECT);
1690
+ }
1691
+
1692
+ if (IS_GC_MARKING_TRACER(trc) && script->filename)
1693
+ js_MarkScriptFilename(script->filename);
1694
+ }
1695
+
1696
+ typedef struct GSNCacheEntry {
1697
+ JSDHashEntryHdr hdr;
1698
+ jsbytecode *pc;
1699
+ jssrcnote *sn;
1700
+ } GSNCacheEntry;
1701
+
1702
+ #define GSN_CACHE_THRESHOLD 100
1703
+
1704
+ void
1705
+ js_PurgeGSNCache(JSGSNCache *cache)
1706
+ {
1707
+ cache->code = NULL;
1708
+ if (cache->table.ops) {
1709
+ JS_DHashTableFinish(&cache->table);
1710
+ cache->table.ops = NULL;
1711
+ }
1712
+ GSN_CACHE_METER(cache, purges);
1713
+ }
1714
+
1715
+ jssrcnote *
1716
+ js_GetSrcNoteCached(JSContext *cx, JSScript *script, jsbytecode *pc)
1717
+ {
1718
+ ptrdiff_t target, offset;
1719
+ GSNCacheEntry *entry;
1720
+ jssrcnote *sn, *result;
1721
+ uintN nsrcnotes;
1722
+
1723
+
1724
+ target = PTRDIFF(pc, script->code, jsbytecode);
1725
+ if ((uint32)target >= script->length)
1726
+ return NULL;
1727
+
1728
+ if (JS_GSN_CACHE(cx).code == script->code) {
1729
+ JS_METER_GSN_CACHE(cx, hits);
1730
+ entry = (GSNCacheEntry *)
1731
+ JS_DHashTableOperate(&JS_GSN_CACHE(cx).table, pc,
1732
+ JS_DHASH_LOOKUP);
1733
+ return entry->sn;
1734
+ }
1735
+
1736
+ JS_METER_GSN_CACHE(cx, misses);
1737
+ offset = 0;
1738
+ for (sn = SCRIPT_NOTES(script); ; sn = SN_NEXT(sn)) {
1739
+ if (SN_IS_TERMINATOR(sn)) {
1740
+ result = NULL;
1741
+ break;
1742
+ }
1743
+ offset += SN_DELTA(sn);
1744
+ if (offset == target && SN_IS_GETTABLE(sn)) {
1745
+ result = sn;
1746
+ break;
1747
+ }
1748
+ }
1749
+
1750
+ if (JS_GSN_CACHE(cx).code != script->code &&
1751
+ script->length >= GSN_CACHE_THRESHOLD) {
1752
+ JS_PURGE_GSN_CACHE(cx);
1753
+ nsrcnotes = 0;
1754
+ for (sn = SCRIPT_NOTES(script); !SN_IS_TERMINATOR(sn);
1755
+ sn = SN_NEXT(sn)) {
1756
+ if (SN_IS_GETTABLE(sn))
1757
+ ++nsrcnotes;
1758
+ }
1759
+ if (!JS_DHashTableInit(&JS_GSN_CACHE(cx).table, JS_DHashGetStubOps(),
1760
+ NULL, sizeof(GSNCacheEntry),
1761
+ JS_DHASH_DEFAULT_CAPACITY(nsrcnotes))) {
1762
+ JS_GSN_CACHE(cx).table.ops = NULL;
1763
+ } else {
1764
+ pc = script->code;
1765
+ for (sn = SCRIPT_NOTES(script); !SN_IS_TERMINATOR(sn);
1766
+ sn = SN_NEXT(sn)) {
1767
+ pc += SN_DELTA(sn);
1768
+ if (SN_IS_GETTABLE(sn)) {
1769
+ entry = (GSNCacheEntry *)
1770
+ JS_DHashTableOperate(&JS_GSN_CACHE(cx).table, pc,
1771
+ JS_DHASH_ADD);
1772
+ entry->pc = pc;
1773
+ entry->sn = sn;
1774
+ }
1775
+ }
1776
+ JS_GSN_CACHE(cx).code = script->code;
1777
+ JS_METER_GSN_CACHE(cx, fills);
1778
+ }
1779
+ }
1780
+
1781
+ return result;
1782
+ }
1783
+
1784
+ uintN
1785
+ js_FramePCToLineNumber(JSContext *cx, JSStackFrame *fp)
1786
+ {
1787
+ return js_PCToLineNumber(cx, fp->script, fp->imacpc ? fp->imacpc : fp->regs->pc);
1788
+ }
1789
+
1790
+ uintN
1791
+ js_PCToLineNumber(JSContext *cx, JSScript *script, jsbytecode *pc)
1792
+ {
1793
+ JSOp op;
1794
+ JSFunction *fun;
1795
+ uintN lineno;
1796
+ ptrdiff_t offset, target;
1797
+ jssrcnote *sn;
1798
+ JSSrcNoteType type;
1799
+
1800
+ /* Cope with JSStackFrame.pc value prior to entering js_Interpret. */
1801
+ if (!pc)
1802
+ return 0;
1803
+
1804
+ /*
1805
+ * Special case: function definition needs no line number note because
1806
+ * the function's script contains its starting line number.
1807
+ */
1808
+ op = js_GetOpcode(cx, script, pc);
1809
+ if (js_CodeSpec[op].format & JOF_INDEXBASE)
1810
+ pc += js_CodeSpec[op].length;
1811
+ if (*pc == JSOP_DEFFUN) {
1812
+ GET_FUNCTION_FROM_BYTECODE(script, pc, 0, fun);
1813
+ return fun->u.i.script->lineno;
1814
+ }
1815
+
1816
+ /*
1817
+ * General case: walk through source notes accumulating their deltas,
1818
+ * keeping track of line-number notes, until we pass the note for pc's
1819
+ * offset within script->code.
1820
+ */
1821
+ lineno = script->lineno;
1822
+ offset = 0;
1823
+ target = PTRDIFF(pc, script->code, jsbytecode);
1824
+ for (sn = SCRIPT_NOTES(script); !SN_IS_TERMINATOR(sn); sn = SN_NEXT(sn)) {
1825
+ offset += SN_DELTA(sn);
1826
+ type = (JSSrcNoteType) SN_TYPE(sn);
1827
+ if (type == SRC_SETLINE) {
1828
+ if (offset <= target)
1829
+ lineno = (uintN) js_GetSrcNoteOffset(sn, 0);
1830
+ } else if (type == SRC_NEWLINE) {
1831
+ if (offset <= target)
1832
+ lineno++;
1833
+ }
1834
+ if (offset > target)
1835
+ break;
1836
+ }
1837
+ return lineno;
1838
+ }
1839
+
1840
+ /* The line number limit is the same as the jssrcnote offset limit. */
1841
+ #define SN_LINE_LIMIT (SN_3BYTE_OFFSET_FLAG << 16)
1842
+
1843
+ jsbytecode *
1844
+ js_LineNumberToPC(JSScript *script, uintN target)
1845
+ {
1846
+ ptrdiff_t offset, best;
1847
+ uintN lineno, bestdiff, diff;
1848
+ jssrcnote *sn;
1849
+ JSSrcNoteType type;
1850
+
1851
+ offset = 0;
1852
+ best = -1;
1853
+ lineno = script->lineno;
1854
+ bestdiff = SN_LINE_LIMIT;
1855
+ for (sn = SCRIPT_NOTES(script); !SN_IS_TERMINATOR(sn); sn = SN_NEXT(sn)) {
1856
+ /*
1857
+ * Exact-match only if offset is not in the prolog; otherwise use
1858
+ * nearest greater-or-equal line number match.
1859
+ */
1860
+ if (lineno == target && script->code + offset >= script->main)
1861
+ goto out;
1862
+ if (lineno >= target) {
1863
+ diff = lineno - target;
1864
+ if (diff < bestdiff) {
1865
+ bestdiff = diff;
1866
+ best = offset;
1867
+ }
1868
+ }
1869
+ offset += SN_DELTA(sn);
1870
+ type = (JSSrcNoteType) SN_TYPE(sn);
1871
+ if (type == SRC_SETLINE) {
1872
+ lineno = (uintN) js_GetSrcNoteOffset(sn, 0);
1873
+ } else if (type == SRC_NEWLINE) {
1874
+ lineno++;
1875
+ }
1876
+ }
1877
+ if (best >= 0)
1878
+ offset = best;
1879
+ out:
1880
+ return script->code + offset;
1881
+ }
1882
+
1883
+ JS_FRIEND_API(uintN)
1884
+ js_GetScriptLineExtent(JSScript *script)
1885
+ {
1886
+ uintN lineno;
1887
+ jssrcnote *sn;
1888
+ JSSrcNoteType type;
1889
+
1890
+ lineno = script->lineno;
1891
+ for (sn = SCRIPT_NOTES(script); !SN_IS_TERMINATOR(sn); sn = SN_NEXT(sn)) {
1892
+ type = (JSSrcNoteType) SN_TYPE(sn);
1893
+ if (type == SRC_SETLINE) {
1894
+ lineno = (uintN) js_GetSrcNoteOffset(sn, 0);
1895
+ } else if (type == SRC_NEWLINE) {
1896
+ lineno++;
1897
+ }
1898
+ }
1899
+ return 1 + lineno - script->lineno;
1900
+ }
1901
+
1902
+ #if JS_HAS_GENERATORS
1903
+
1904
+ JSBool
1905
+ js_IsInsideTryWithFinally(JSScript *script, jsbytecode *pc)
1906
+ {
1907
+ JSTryNoteArray *tarray;
1908
+ JSTryNote *tn, *tnlimit;
1909
+ uint32 off;
1910
+
1911
+ JS_ASSERT(script->code <= pc);
1912
+ JS_ASSERT(pc < script->code + script->length);
1913
+
1914
+ if (!script->trynotesOffset != 0)
1915
+ return JS_FALSE;
1916
+ tarray = JS_SCRIPT_TRYNOTES(script);
1917
+ JS_ASSERT(tarray->length != 0);
1918
+
1919
+ tn = tarray->vector;
1920
+ tnlimit = tn + tarray->length;
1921
+ off = (uint32)(pc - script->main);
1922
+ do {
1923
+ if (off - tn->start < tn->length) {
1924
+ if (tn->kind == JSTRY_FINALLY)
1925
+ return JS_TRUE;
1926
+ JS_ASSERT(tn->kind == JSTRY_CATCH);
1927
+ }
1928
+ } while (++tn != tnlimit);
1929
+ return JS_FALSE;
1930
+ }
1931
+
1932
+ #endif