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,129 @@
1
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
+ *
3
+ * ***** BEGIN LICENSE BLOCK *****
4
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
+ *
6
+ * The contents of this file are subject to the Mozilla Public License Version
7
+ * 1.1 (the "License"); you may not use this file except in compliance with
8
+ * the License. You may obtain a copy of the License at
9
+ * http://www.mozilla.org/MPL/
10
+ *
11
+ * Software distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
+ * for the specific language governing rights and limitations under the
14
+ * License.
15
+ *
16
+ * The Original Code is Mozilla Communicator client code, released
17
+ * March 31, 1998.
18
+ *
19
+ * The Initial Developer of the Original Code is
20
+ * Netscape Communications Corporation.
21
+ * Portions created by the Initial Developer are Copyright (C) 1998
22
+ * the Initial Developer. All Rights Reserved.
23
+ *
24
+ * Contributor(s):
25
+ *
26
+ * Alternatively, the contents of this file may be used under the terms of
27
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
28
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
+ * in which case the provisions of the GPL or the LGPL are applicable instead
30
+ * of those above. If you wish to allow use of your version of this file only
31
+ * under the terms of either the GPL or the LGPL, and not to allow others to
32
+ * use your version of this file under the terms of the MPL, indicate your
33
+ * decision by deleting the provisions above and replace them with the notice
34
+ * and other provisions required by the GPL or the LGPL. If you do not delete
35
+ * the provisions above, a recipient may use your version of this file under
36
+ * the terms of any one of the MPL, the GPL or the LGPL.
37
+ *
38
+ * ***** END LICENSE BLOCK ***** */
39
+
40
+ /*
41
+ * JS Date class interface.
42
+ */
43
+
44
+ #ifndef jsdate_h___
45
+ #define jsdate_h___
46
+
47
+ JS_BEGIN_EXTERN_C
48
+
49
+ extern JSClass js_DateClass;
50
+
51
+ extern JSObject *
52
+ js_InitDateClass(JSContext *cx, JSObject *obj);
53
+
54
+ /*
55
+ * These functions provide a C interface to the date/time object
56
+ */
57
+
58
+ /*
59
+ * Construct a new Date Object from a time value given in milliseconds UTC
60
+ * since the epoch.
61
+ */
62
+ extern JS_FRIEND_API(JSObject*)
63
+ js_NewDateObjectMsec(JSContext* cx, jsdouble msec_time);
64
+
65
+ /*
66
+ * Construct a new Date Object from an exploded local time value.
67
+ *
68
+ * Assert that mon < 12 to help catch off-by-one user errors, which are common
69
+ * due to the 0-based month numbering copied into JS from Java (java.util.Date
70
+ * in 1995). js_DateSetMonth (below) likewise asserts month < 12.
71
+ */
72
+ extern JS_FRIEND_API(JSObject*)
73
+ js_NewDateObject(JSContext* cx, int year, int mon, int mday,
74
+ int hour, int min, int sec);
75
+
76
+ /*
77
+ * Detect whether the internal date value is NaN. (Because failure is
78
+ * out-of-band for js_DateGet*)
79
+ */
80
+ extern JS_FRIEND_API(JSBool)
81
+ js_DateIsValid(JSContext *cx, JSObject* obj);
82
+
83
+ extern JS_FRIEND_API(int)
84
+ js_DateGetYear(JSContext *cx, JSObject* obj);
85
+
86
+ extern JS_FRIEND_API(int)
87
+ js_DateGetMonth(JSContext *cx, JSObject* obj);
88
+
89
+ extern JS_FRIEND_API(int)
90
+ js_DateGetDate(JSContext *cx, JSObject* obj);
91
+
92
+ extern JS_FRIEND_API(int)
93
+ js_DateGetHours(JSContext *cx, JSObject* obj);
94
+
95
+ extern JS_FRIEND_API(int)
96
+ js_DateGetMinutes(JSContext *cx, JSObject* obj);
97
+
98
+ extern JS_FRIEND_API(int)
99
+ js_DateGetSeconds(JSContext *cx, JSObject* obj);
100
+
101
+ extern JS_FRIEND_API(void)
102
+ js_DateSetYear(JSContext *cx, JSObject *obj, int year);
103
+
104
+ extern JS_FRIEND_API(void)
105
+ js_DateSetMonth(JSContext *cx, JSObject *obj, int month);
106
+
107
+ extern JS_FRIEND_API(void)
108
+ js_DateSetDate(JSContext *cx, JSObject *obj, int date);
109
+
110
+ extern JS_FRIEND_API(void)
111
+ js_DateSetHours(JSContext *cx, JSObject *obj, int hours);
112
+
113
+ extern JS_FRIEND_API(void)
114
+ js_DateSetMinutes(JSContext *cx, JSObject *obj, int minutes);
115
+
116
+ extern JS_FRIEND_API(void)
117
+ js_DateSetSeconds(JSContext *cx, JSObject *obj, int seconds);
118
+
119
+ extern JS_FRIEND_API(jsdouble)
120
+ js_DateGetMsecSinceEpoch(JSContext *cx, JSObject *obj);
121
+
122
+ typedef uint32 JSIntervalTime;
123
+
124
+ JSIntervalTime
125
+ js_IntervalNow();
126
+
127
+ JS_END_EXTERN_C
128
+
129
+ #endif /* jsdate_h___ */
@@ -0,0 +1,2017 @@
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 debugging API.
43
+ */
44
+ #include "jsstddef.h"
45
+ #include <string.h>
46
+ #include "jstypes.h"
47
+ #include "jsutil.h" /* Added by JSIFY */
48
+ #include "jsclist.h"
49
+ #include "jsapi.h"
50
+ #include "jscntxt.h"
51
+ #include "jsversion.h"
52
+ #include "jsdbgapi.h"
53
+ #include "jsemit.h"
54
+ #include "jsfun.h"
55
+ #include "jsgc.h"
56
+ #include "jsinterp.h"
57
+ #include "jslock.h"
58
+ #include "jsobj.h"
59
+ #include "jsopcode.h"
60
+ #include "jsparse.h"
61
+ #include "jsscope.h"
62
+ #include "jsscript.h"
63
+ #include "jsstaticcheck.h"
64
+ #include "jsstr.h"
65
+
66
+ #include "jsautooplen.h"
67
+
68
+ typedef struct JSTrap {
69
+ JSCList links;
70
+ JSScript *script;
71
+ jsbytecode *pc;
72
+ JSOp op;
73
+ JSTrapHandler handler;
74
+ void *closure;
75
+ } JSTrap;
76
+
77
+ #define DBG_LOCK(rt) JS_ACQUIRE_LOCK((rt)->debuggerLock)
78
+ #define DBG_UNLOCK(rt) JS_RELEASE_LOCK((rt)->debuggerLock)
79
+ #define DBG_LOCK_EVAL(rt,expr) (DBG_LOCK(rt), (expr), DBG_UNLOCK(rt))
80
+
81
+ /*
82
+ * NB: FindTrap must be called with rt->debuggerLock acquired.
83
+ */
84
+ static JSTrap *
85
+ FindTrap(JSRuntime *rt, JSScript *script, jsbytecode *pc)
86
+ {
87
+ JSTrap *trap;
88
+
89
+ for (trap = (JSTrap *)rt->trapList.next;
90
+ &trap->links != &rt->trapList;
91
+ trap = (JSTrap *)trap->links.next) {
92
+ if (trap->script == script && trap->pc == pc)
93
+ return trap;
94
+ }
95
+ return NULL;
96
+ }
97
+
98
+ jsbytecode *
99
+ js_UntrapScriptCode(JSContext *cx, JSScript *script)
100
+ {
101
+ jsbytecode *code;
102
+ JSRuntime *rt;
103
+ JSTrap *trap;
104
+
105
+ code = script->code;
106
+ rt = cx->runtime;
107
+ DBG_LOCK(rt);
108
+ for (trap = (JSTrap *)rt->trapList.next;
109
+ &trap->links !=
110
+ &rt->trapList;
111
+ trap = (JSTrap *)trap->links.next) {
112
+ if (trap->script == script &&
113
+ (size_t)(trap->pc - script->code) < script->length) {
114
+ if (code == script->code) {
115
+ jssrcnote *sn, *notes;
116
+ size_t nbytes;
117
+
118
+ nbytes = script->length * sizeof(jsbytecode);
119
+ notes = SCRIPT_NOTES(script);
120
+ for (sn = notes; !SN_IS_TERMINATOR(sn); sn = SN_NEXT(sn))
121
+ continue;
122
+ nbytes += (sn - notes + 1) * sizeof *sn;
123
+
124
+ code = (jsbytecode *) JS_malloc(cx, nbytes);
125
+ if (!code)
126
+ break;
127
+ memcpy(code, script->code, nbytes);
128
+ JS_PURGE_GSN_CACHE(cx);
129
+ }
130
+ code[trap->pc - script->code] = trap->op;
131
+ }
132
+ }
133
+ DBG_UNLOCK(rt);
134
+ return code;
135
+ }
136
+
137
+ JS_PUBLIC_API(JSBool)
138
+ JS_SetTrap(JSContext *cx, JSScript *script, jsbytecode *pc,
139
+ JSTrapHandler handler, void *closure)
140
+ {
141
+ JSTrap *junk, *trap, *twin;
142
+ JSRuntime *rt;
143
+ uint32 sample;
144
+
145
+ JS_ASSERT((JSOp) *pc != JSOP_TRAP);
146
+ junk = NULL;
147
+ rt = cx->runtime;
148
+ DBG_LOCK(rt);
149
+ trap = FindTrap(rt, script, pc);
150
+ if (trap) {
151
+ JS_ASSERT(trap->script == script && trap->pc == pc);
152
+ JS_ASSERT(*pc == JSOP_TRAP);
153
+ } else {
154
+ sample = rt->debuggerMutations;
155
+ DBG_UNLOCK(rt);
156
+ trap = (JSTrap *) JS_malloc(cx, sizeof *trap);
157
+ if (!trap)
158
+ return JS_FALSE;
159
+ trap->closure = NULL;
160
+ if(!js_AddRoot(cx, &trap->closure, "trap->closure")) {
161
+ JS_free(cx, trap);
162
+ return JS_FALSE;
163
+ }
164
+ DBG_LOCK(rt);
165
+ twin = (rt->debuggerMutations != sample)
166
+ ? FindTrap(rt, script, pc)
167
+ : NULL;
168
+ if (twin) {
169
+ junk = trap;
170
+ trap = twin;
171
+ } else {
172
+ JS_APPEND_LINK(&trap->links, &rt->trapList);
173
+ ++rt->debuggerMutations;
174
+ trap->script = script;
175
+ trap->pc = pc;
176
+ trap->op = (JSOp)*pc;
177
+ *pc = JSOP_TRAP;
178
+ }
179
+ }
180
+ trap->handler = handler;
181
+ trap->closure = closure;
182
+ DBG_UNLOCK(rt);
183
+ if (junk) {
184
+ js_RemoveRoot(rt, &junk->closure);
185
+ JS_free(cx, junk);
186
+ }
187
+ return JS_TRUE;
188
+ }
189
+
190
+ JS_PUBLIC_API(JSOp)
191
+ JS_GetTrapOpcode(JSContext *cx, JSScript *script, jsbytecode *pc)
192
+ {
193
+ JSRuntime *rt;
194
+ JSTrap *trap;
195
+ JSOp op;
196
+
197
+ rt = cx->runtime;
198
+ DBG_LOCK(rt);
199
+ trap = FindTrap(rt, script, pc);
200
+ op = trap ? trap->op : (JSOp) *pc;
201
+ DBG_UNLOCK(rt);
202
+ return op;
203
+ }
204
+
205
+ static void
206
+ DestroyTrapAndUnlock(JSContext *cx, JSTrap *trap)
207
+ {
208
+ ++cx->runtime->debuggerMutations;
209
+ JS_REMOVE_LINK(&trap->links);
210
+ *trap->pc = (jsbytecode)trap->op;
211
+ DBG_UNLOCK(cx->runtime);
212
+
213
+ js_RemoveRoot(cx->runtime, &trap->closure);
214
+ JS_free(cx, trap);
215
+ }
216
+
217
+ JS_PUBLIC_API(void)
218
+ JS_ClearTrap(JSContext *cx, JSScript *script, jsbytecode *pc,
219
+ JSTrapHandler *handlerp, void **closurep)
220
+ {
221
+ JSTrap *trap;
222
+
223
+ DBG_LOCK(cx->runtime);
224
+ trap = FindTrap(cx->runtime, script, pc);
225
+ if (handlerp)
226
+ *handlerp = trap ? trap->handler : NULL;
227
+ if (closurep)
228
+ *closurep = trap ? trap->closure : NULL;
229
+ if (trap)
230
+ DestroyTrapAndUnlock(cx, trap);
231
+ else
232
+ DBG_UNLOCK(cx->runtime);
233
+ }
234
+
235
+ JS_PUBLIC_API(void)
236
+ JS_ClearScriptTraps(JSContext *cx, JSScript *script)
237
+ {
238
+ JSRuntime *rt;
239
+ JSTrap *trap, *next;
240
+ uint32 sample;
241
+
242
+ rt = cx->runtime;
243
+ DBG_LOCK(rt);
244
+ for (trap = (JSTrap *)rt->trapList.next;
245
+ &trap->links != &rt->trapList;
246
+ trap = next) {
247
+ next = (JSTrap *)trap->links.next;
248
+ if (trap->script == script) {
249
+ sample = rt->debuggerMutations;
250
+ DestroyTrapAndUnlock(cx, trap);
251
+ DBG_LOCK(rt);
252
+ if (rt->debuggerMutations != sample + 1)
253
+ next = (JSTrap *)rt->trapList.next;
254
+ }
255
+ }
256
+ DBG_UNLOCK(rt);
257
+ }
258
+
259
+ JS_PUBLIC_API(void)
260
+ JS_ClearAllTraps(JSContext *cx)
261
+ {
262
+ JSRuntime *rt;
263
+ JSTrap *trap, *next;
264
+ uint32 sample;
265
+
266
+ rt = cx->runtime;
267
+ DBG_LOCK(rt);
268
+ for (trap = (JSTrap *)rt->trapList.next;
269
+ &trap->links != &rt->trapList;
270
+ trap = next) {
271
+ next = (JSTrap *)trap->links.next;
272
+ sample = rt->debuggerMutations;
273
+ DestroyTrapAndUnlock(cx, trap);
274
+ DBG_LOCK(rt);
275
+ if (rt->debuggerMutations != sample + 1)
276
+ next = (JSTrap *)rt->trapList.next;
277
+ }
278
+ DBG_UNLOCK(rt);
279
+ }
280
+
281
+ JS_PUBLIC_API(JSTrapStatus)
282
+ JS_HandleTrap(JSContext *cx, JSScript *script, jsbytecode *pc, jsval *rval)
283
+ {
284
+ JSTrap *trap;
285
+ jsint op;
286
+ JSTrapStatus status;
287
+
288
+ DBG_LOCK(cx->runtime);
289
+ trap = FindTrap(cx->runtime, script, pc);
290
+ JS_ASSERT(!trap || trap->handler);
291
+ if (!trap) {
292
+ op = (JSOp) *pc;
293
+ DBG_UNLOCK(cx->runtime);
294
+
295
+ /* Defend against "pc for wrong script" API usage error. */
296
+ JS_ASSERT(op != JSOP_TRAP);
297
+
298
+ #ifdef JS_THREADSAFE
299
+ /* If the API was abused, we must fail for want of the real op. */
300
+ if (op == JSOP_TRAP)
301
+ return JSTRAP_ERROR;
302
+
303
+ /* Assume a race with a debugger thread and try to carry on. */
304
+ *rval = INT_TO_JSVAL(op);
305
+ return JSTRAP_CONTINUE;
306
+ #else
307
+ /* Always fail if single-threaded (must be an API usage error). */
308
+ return JSTRAP_ERROR;
309
+ #endif
310
+ }
311
+ DBG_UNLOCK(cx->runtime);
312
+
313
+ /*
314
+ * It's important that we not use 'trap->' after calling the callback --
315
+ * the callback might remove the trap!
316
+ */
317
+ op = (jsint)trap->op;
318
+ status = trap->handler(cx, script, pc, rval, trap->closure);
319
+ if (status == JSTRAP_CONTINUE) {
320
+ /* By convention, return the true op to the interpreter in rval. */
321
+ *rval = INT_TO_JSVAL(op);
322
+ }
323
+ return status;
324
+ }
325
+
326
+ JS_PUBLIC_API(JSBool)
327
+ JS_SetInterrupt(JSRuntime *rt, JSTrapHandler handler, void *closure)
328
+ {
329
+ rt->globalDebugHooks.interruptHandler = handler;
330
+ rt->globalDebugHooks.interruptHandlerData = closure;
331
+ return JS_TRUE;
332
+ }
333
+
334
+ JS_PUBLIC_API(JSBool)
335
+ JS_ClearInterrupt(JSRuntime *rt, JSTrapHandler *handlerp, void **closurep)
336
+ {
337
+ if (handlerp)
338
+ *handlerp = (JSTrapHandler)rt->globalDebugHooks.interruptHandler;
339
+ if (closurep)
340
+ *closurep = rt->globalDebugHooks.interruptHandlerData;
341
+ rt->globalDebugHooks.interruptHandler = 0;
342
+ rt->globalDebugHooks.interruptHandlerData = 0;
343
+ return JS_TRUE;
344
+ }
345
+
346
+ /************************************************************************/
347
+
348
+ typedef struct JSWatchPoint {
349
+ JSCList links;
350
+ JSObject *object; /* weak link, see js_FinalizeObject */
351
+ JSScopeProperty *sprop;
352
+ JSPropertyOp setter;
353
+ JSWatchPointHandler handler;
354
+ void *closure;
355
+ uintN flags;
356
+ } JSWatchPoint;
357
+
358
+ #define JSWP_LIVE 0x1 /* live because set and not cleared */
359
+ #define JSWP_HELD 0x2 /* held while running handler/setter */
360
+
361
+ /*
362
+ * NB: DropWatchPointAndUnlock releases cx->runtime->debuggerLock in all cases.
363
+ */
364
+ static JSBool
365
+ DropWatchPointAndUnlock(JSContext *cx, JSWatchPoint *wp, uintN flag)
366
+ {
367
+ JSBool ok, found;
368
+ JSScopeProperty *sprop;
369
+ JSScope *scope;
370
+ JSPropertyOp setter;
371
+
372
+ ok = JS_TRUE;
373
+ wp->flags &= ~flag;
374
+ if (wp->flags != 0) {
375
+ DBG_UNLOCK(cx->runtime);
376
+ return ok;
377
+ }
378
+
379
+ /*
380
+ * Remove wp from the list, then if there are no other watchpoints for
381
+ * wp->sprop in any scope, restore wp->sprop->setter from wp.
382
+ */
383
+ ++cx->runtime->debuggerMutations;
384
+ JS_REMOVE_LINK(&wp->links);
385
+ sprop = wp->sprop;
386
+
387
+ /*
388
+ * Passing null for the scope parameter tells js_GetWatchedSetter to find
389
+ * any watch point for sprop, and not to lock or unlock rt->debuggerLock.
390
+ * If js_ChangeNativePropertyAttrs fails, propagate failure after removing
391
+ * wp->closure's root and freeing wp.
392
+ */
393
+ setter = js_GetWatchedSetter(cx->runtime, NULL, sprop);
394
+ DBG_UNLOCK(cx->runtime);
395
+ if (!setter) {
396
+ JS_LOCK_OBJ(cx, wp->object);
397
+ scope = OBJ_SCOPE(wp->object);
398
+ found = (scope->object == wp->object &&
399
+ SCOPE_GET_PROPERTY(scope, sprop->id));
400
+ JS_UNLOCK_SCOPE(cx, scope);
401
+
402
+ /*
403
+ * If the property wasn't found on wp->object or didn't exist, then
404
+ * someone else has dealt with this sprop, and we don't need to change
405
+ * the property attributes.
406
+ */
407
+ if (found) {
408
+ sprop = js_ChangeScopePropertyAttrs(cx, scope, sprop,
409
+ 0, sprop->attrs,
410
+ sprop->getter,
411
+ wp->setter);
412
+ if (!sprop)
413
+ ok = JS_FALSE;
414
+ }
415
+ }
416
+
417
+ JS_free(cx, wp);
418
+ return ok;
419
+ }
420
+
421
+ /*
422
+ * NB: js_TraceWatchPoints does not acquire cx->runtime->debuggerLock, since
423
+ * the debugger should never be racing with the GC (i.e., the debugger must
424
+ * respect the request model).
425
+ */
426
+ void
427
+ js_TraceWatchPoints(JSTracer *trc, JSObject *obj)
428
+ {
429
+ JSRuntime *rt;
430
+ JSWatchPoint *wp;
431
+
432
+ rt = trc->context->runtime;
433
+
434
+ for (wp = (JSWatchPoint *)rt->watchPointList.next;
435
+ &wp->links != &rt->watchPointList;
436
+ wp = (JSWatchPoint *)wp->links.next) {
437
+ if (wp->object == obj) {
438
+ TRACE_SCOPE_PROPERTY(trc, wp->sprop);
439
+ if ((wp->sprop->attrs & JSPROP_SETTER) && wp->setter) {
440
+ JS_CALL_OBJECT_TRACER(trc, js_CastAsObject(wp->setter),
441
+ "wp->setter");
442
+ }
443
+ JS_SET_TRACING_NAME(trc, "wp->closure");
444
+ js_CallValueTracerIfGCThing(trc, (jsval) wp->closure);
445
+ }
446
+ }
447
+ }
448
+
449
+ void
450
+ js_SweepWatchPoints(JSContext *cx)
451
+ {
452
+ JSRuntime *rt;
453
+ JSWatchPoint *wp, *next;
454
+ uint32 sample;
455
+
456
+ rt = cx->runtime;
457
+ DBG_LOCK(rt);
458
+ for (wp = (JSWatchPoint *)rt->watchPointList.next;
459
+ &wp->links != &rt->watchPointList;
460
+ wp = next) {
461
+ next = (JSWatchPoint *)wp->links.next;
462
+ if (js_IsAboutToBeFinalized(cx, wp->object)) {
463
+ sample = rt->debuggerMutations;
464
+
465
+ /* Ignore failures. */
466
+ DropWatchPointAndUnlock(cx, wp, JSWP_LIVE);
467
+ DBG_LOCK(rt);
468
+ if (rt->debuggerMutations != sample + 1)
469
+ next = (JSWatchPoint *)rt->watchPointList.next;
470
+ }
471
+ }
472
+ DBG_UNLOCK(rt);
473
+ }
474
+
475
+
476
+
477
+ /*
478
+ * NB: FindWatchPoint must be called with rt->debuggerLock acquired.
479
+ */
480
+ static JSWatchPoint *
481
+ FindWatchPoint(JSRuntime *rt, JSScope *scope, jsid id)
482
+ {
483
+ JSWatchPoint *wp;
484
+
485
+ for (wp = (JSWatchPoint *)rt->watchPointList.next;
486
+ &wp->links != &rt->watchPointList;
487
+ wp = (JSWatchPoint *)wp->links.next) {
488
+ if (wp->object == scope->object && wp->sprop->id == id)
489
+ return wp;
490
+ }
491
+ return NULL;
492
+ }
493
+
494
+ JSScopeProperty *
495
+ js_FindWatchPoint(JSRuntime *rt, JSScope *scope, jsid id)
496
+ {
497
+ JSWatchPoint *wp;
498
+ JSScopeProperty *sprop;
499
+
500
+ DBG_LOCK(rt);
501
+ wp = FindWatchPoint(rt, scope, id);
502
+ sprop = wp ? wp->sprop : NULL;
503
+ DBG_UNLOCK(rt);
504
+ return sprop;
505
+ }
506
+
507
+ /*
508
+ * Secret handshake with DropWatchPointAndUnlock: if (!scope), we know our
509
+ * caller has acquired rt->debuggerLock, so we don't have to.
510
+ */
511
+ JSPropertyOp
512
+ js_GetWatchedSetter(JSRuntime *rt, JSScope *scope,
513
+ const JSScopeProperty *sprop)
514
+ {
515
+ JSPropertyOp setter;
516
+ JSWatchPoint *wp;
517
+
518
+ setter = NULL;
519
+ if (scope)
520
+ DBG_LOCK(rt);
521
+ for (wp = (JSWatchPoint *)rt->watchPointList.next;
522
+ &wp->links != &rt->watchPointList;
523
+ wp = (JSWatchPoint *)wp->links.next) {
524
+ if ((!scope || wp->object == scope->object) && wp->sprop == sprop) {
525
+ setter = wp->setter;
526
+ break;
527
+ }
528
+ }
529
+ if (scope)
530
+ DBG_UNLOCK(rt);
531
+ return setter;
532
+ }
533
+
534
+ JSBool
535
+ js_watch_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
536
+ {
537
+ JSRuntime *rt;
538
+ JSWatchPoint *wp;
539
+ JSScopeProperty *sprop;
540
+ jsval propid, userid;
541
+ JSScope *scope;
542
+ JSBool ok;
543
+
544
+ rt = cx->runtime;
545
+ DBG_LOCK(rt);
546
+ for (wp = (JSWatchPoint *)rt->watchPointList.next;
547
+ &wp->links != &rt->watchPointList;
548
+ wp = (JSWatchPoint *)wp->links.next) {
549
+ sprop = wp->sprop;
550
+ if (wp->object == obj && SPROP_USERID(sprop) == id &&
551
+ !(wp->flags & JSWP_HELD)) {
552
+ wp->flags |= JSWP_HELD;
553
+ DBG_UNLOCK(rt);
554
+
555
+ JS_LOCK_OBJ(cx, obj);
556
+ propid = ID_TO_VALUE(sprop->id);
557
+ userid = (sprop->flags & SPROP_HAS_SHORTID)
558
+ ? INT_TO_JSVAL(sprop->shortid)
559
+ : propid;
560
+ scope = OBJ_SCOPE(obj);
561
+ JS_UNLOCK_OBJ(cx, obj);
562
+
563
+ /* NB: wp is held, so we can safely dereference it still. */
564
+ ok = wp->handler(cx, obj, propid,
565
+ SPROP_HAS_VALID_SLOT(sprop, scope)
566
+ ? OBJ_GET_SLOT(cx, obj, sprop->slot)
567
+ : JSVAL_VOID,
568
+ vp, wp->closure);
569
+ if (ok) {
570
+ /*
571
+ * Create a pseudo-frame for the setter invocation so that any
572
+ * stack-walking security code under the setter will correctly
573
+ * identify the guilty party. So that the watcher appears to
574
+ * be active to obj_eval and other such code, point frame.pc
575
+ * at the JSOP_STOP at the end of the script.
576
+ *
577
+ * The pseudo-frame is not created for fast natives as they
578
+ * are treated as interpreter frame extensions and always
579
+ * trusted.
580
+ */
581
+ JSObject *closure;
582
+ JSClass *clasp;
583
+ JSFunction *fun;
584
+ JSScript *script;
585
+ JSBool injectFrame;
586
+ uintN nslots, slotsStart;
587
+ jsval smallv[5];
588
+ jsval *argv;
589
+ JSStackFrame frame;
590
+ JSFrameRegs regs;
591
+
592
+ closure = (JSObject *) wp->closure;
593
+ clasp = OBJ_GET_CLASS(cx, closure);
594
+ if (clasp == &js_FunctionClass) {
595
+ fun = GET_FUNCTION_PRIVATE(cx, closure);
596
+ script = FUN_SCRIPT(fun);
597
+ } else if (clasp == &js_ScriptClass) {
598
+ fun = NULL;
599
+ script = (JSScript *) JS_GetPrivate(cx, closure);
600
+ } else {
601
+ fun = NULL;
602
+ script = NULL;
603
+ }
604
+
605
+ slotsStart = nslots = 2;
606
+ injectFrame = JS_TRUE;
607
+ if (fun) {
608
+ nslots += FUN_MINARGS(fun);
609
+ if (!FUN_INTERPRETED(fun)) {
610
+ nslots += fun->u.n.extra;
611
+ injectFrame = !(fun->flags & JSFUN_FAST_NATIVE);
612
+ }
613
+
614
+ slotsStart = nslots;
615
+ }
616
+ if (script)
617
+ nslots += script->nslots;
618
+
619
+ if (injectFrame) {
620
+ if (nslots <= JS_ARRAY_LENGTH(smallv)) {
621
+ argv = smallv;
622
+ } else {
623
+ argv = (jsval *) JS_malloc(cx, nslots * sizeof(jsval));
624
+ if (!argv) {
625
+ DBG_LOCK(rt);
626
+ DropWatchPointAndUnlock(cx, wp, JSWP_HELD);
627
+ return JS_FALSE;
628
+ }
629
+ }
630
+
631
+ argv[0] = OBJECT_TO_JSVAL(closure);
632
+ argv[1] = JSVAL_NULL;
633
+ memset(argv + 2, 0, (nslots - 2) * sizeof(jsval));
634
+
635
+ memset(&frame, 0, sizeof(frame));
636
+ frame.script = script;
637
+ frame.regs = NULL;
638
+ frame.callee = closure;
639
+ frame.fun = fun;
640
+ frame.argv = argv + 2;
641
+ frame.down = js_GetTopStackFrame(cx);
642
+ frame.scopeChain = OBJ_GET_PARENT(cx, closure);
643
+ if (script && script->nslots)
644
+ frame.slots = argv + slotsStart;
645
+ if (script) {
646
+ JS_ASSERT(script->length >= JSOP_STOP_LENGTH);
647
+ regs.pc = script->code + script->length
648
+ - JSOP_STOP_LENGTH;
649
+ regs.sp = NULL;
650
+ frame.regs = &regs;
651
+ if (fun &&
652
+ JSFUN_HEAVYWEIGHT_TEST(fun->flags) &&
653
+ !js_GetCallObject(cx, &frame)) {
654
+ if (argv != smallv)
655
+ JS_free(cx, argv);
656
+ DBG_LOCK(rt);
657
+ DropWatchPointAndUnlock(cx, wp, JSWP_HELD);
658
+ return JS_FALSE;
659
+ }
660
+ }
661
+
662
+ cx->fp = &frame;
663
+ }
664
+ #ifdef __GNUC__
665
+ else
666
+ argv = NULL; /* suppress bogus gcc warnings */
667
+ #endif
668
+ ok = !wp->setter ||
669
+ ((sprop->attrs & JSPROP_SETTER)
670
+ ? js_InternalCall(cx, obj,
671
+ js_CastAsObjectJSVal(wp->setter),
672
+ 1, vp, vp)
673
+ : wp->setter(cx, obj, userid, vp));
674
+ if (injectFrame) {
675
+ /* Evil code can cause us to have an arguments object. */
676
+ if (frame.callobj)
677
+ ok &= js_PutCallObject(cx, &frame);
678
+ if (frame.argsobj)
679
+ ok &= js_PutArgsObject(cx, &frame);
680
+
681
+ cx->fp = frame.down;
682
+ if (argv != smallv)
683
+ JS_free(cx, argv);
684
+ }
685
+ }
686
+ DBG_LOCK(rt);
687
+ return DropWatchPointAndUnlock(cx, wp, JSWP_HELD) && ok;
688
+ }
689
+ }
690
+ DBG_UNLOCK(rt);
691
+ return JS_TRUE;
692
+ }
693
+
694
+ JS_REQUIRES_STACK JSBool
695
+ js_watch_set_wrapper(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
696
+ jsval *rval)
697
+ {
698
+ JSObject *funobj;
699
+ JSFunction *wrapper;
700
+ jsval userid;
701
+
702
+ funobj = JSVAL_TO_OBJECT(argv[-2]);
703
+ wrapper = GET_FUNCTION_PRIVATE(cx, funobj);
704
+ userid = ATOM_KEY(wrapper->atom);
705
+ *rval = argv[0];
706
+ return js_watch_set(cx, obj, userid, rval);
707
+ }
708
+
709
+ JSPropertyOp
710
+ js_WrapWatchedSetter(JSContext *cx, jsid id, uintN attrs, JSPropertyOp setter)
711
+ {
712
+ JSAtom *atom;
713
+ JSFunction *wrapper;
714
+
715
+ if (!(attrs & JSPROP_SETTER))
716
+ return &js_watch_set; /* & to silence schoolmarmish MSVC */
717
+
718
+ if (JSID_IS_ATOM(id)) {
719
+ atom = JSID_TO_ATOM(id);
720
+ } else if (JSID_IS_INT(id)) {
721
+ if (!js_ValueToStringId(cx, INT_JSID_TO_JSVAL(id), &id))
722
+ return NULL;
723
+ atom = JSID_TO_ATOM(id);
724
+ } else {
725
+ atom = NULL;
726
+ }
727
+ wrapper = js_NewFunction(cx, NULL, js_watch_set_wrapper, 1, 0,
728
+ OBJ_GET_PARENT(cx, js_CastAsObject(setter)),
729
+ atom);
730
+ if (!wrapper)
731
+ return NULL;
732
+ return js_CastAsPropertyOp(FUN_OBJECT(wrapper));
733
+ }
734
+
735
+ JS_PUBLIC_API(JSBool)
736
+ JS_SetWatchPoint(JSContext *cx, JSObject *obj, jsval idval,
737
+ JSWatchPointHandler handler, void *closure)
738
+ {
739
+ jsid propid;
740
+ JSObject *pobj;
741
+ JSProperty *prop;
742
+ JSScopeProperty *sprop;
743
+ JSRuntime *rt;
744
+ JSBool ok;
745
+ JSWatchPoint *wp;
746
+ JSPropertyOp watcher;
747
+
748
+ if (!OBJ_IS_NATIVE(obj)) {
749
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_WATCH,
750
+ OBJ_GET_CLASS(cx, obj)->name);
751
+ return JS_FALSE;
752
+ }
753
+
754
+ if (JSVAL_IS_INT(idval)) {
755
+ propid = INT_JSVAL_TO_JSID(idval);
756
+ } else {
757
+ if (!js_ValueToStringId(cx, idval, &propid))
758
+ return JS_FALSE;
759
+ CHECK_FOR_STRING_INDEX(propid);
760
+ }
761
+
762
+ if (!js_LookupProperty(cx, obj, propid, &pobj, &prop))
763
+ return JS_FALSE;
764
+ sprop = (JSScopeProperty *) prop;
765
+ rt = cx->runtime;
766
+ if (!sprop) {
767
+ /* Check for a deleted symbol watchpoint, which holds its property. */
768
+ sprop = js_FindWatchPoint(rt, OBJ_SCOPE(obj), propid);
769
+ if (!sprop) {
770
+ /* Make a new property in obj so we can watch for the first set. */
771
+ if (!js_DefineProperty(cx, obj, propid, JSVAL_VOID,
772
+ NULL, NULL, JSPROP_ENUMERATE,
773
+ &prop)) {
774
+ return JS_FALSE;
775
+ }
776
+ sprop = (JSScopeProperty *) prop;
777
+ }
778
+ } else if (pobj != obj) {
779
+ /* Clone the prototype property so we can watch the right object. */
780
+ jsval value;
781
+ JSPropertyOp getter, setter;
782
+ uintN attrs, flags;
783
+ intN shortid;
784
+
785
+ if (OBJ_IS_NATIVE(pobj)) {
786
+ value = SPROP_HAS_VALID_SLOT(sprop, OBJ_SCOPE(pobj))
787
+ ? LOCKED_OBJ_GET_SLOT(pobj, sprop->slot)
788
+ : JSVAL_VOID;
789
+ getter = sprop->getter;
790
+ setter = sprop->setter;
791
+ attrs = sprop->attrs;
792
+ flags = sprop->flags;
793
+ shortid = sprop->shortid;
794
+ } else {
795
+ if (!OBJ_GET_PROPERTY(cx, pobj, propid, &value) ||
796
+ !OBJ_GET_ATTRIBUTES(cx, pobj, propid, prop, &attrs)) {
797
+ OBJ_DROP_PROPERTY(cx, pobj, prop);
798
+ return JS_FALSE;
799
+ }
800
+ getter = setter = NULL;
801
+ flags = 0;
802
+ shortid = 0;
803
+ }
804
+ OBJ_DROP_PROPERTY(cx, pobj, prop);
805
+
806
+ /* Recall that obj is native, whether or not pobj is native. */
807
+ if (!js_DefineNativeProperty(cx, obj, propid, value, getter, setter,
808
+ attrs, flags, shortid, &prop)) {
809
+ return JS_FALSE;
810
+ }
811
+ sprop = (JSScopeProperty *) prop;
812
+ }
813
+
814
+ /*
815
+ * At this point, prop/sprop exists in obj, obj is locked, and we must
816
+ * OBJ_DROP_PROPERTY(cx, obj, prop) before returning.
817
+ */
818
+ ok = JS_TRUE;
819
+ DBG_LOCK(rt);
820
+ wp = FindWatchPoint(rt, OBJ_SCOPE(obj), propid);
821
+ if (!wp) {
822
+ DBG_UNLOCK(rt);
823
+ watcher = js_WrapWatchedSetter(cx, propid, sprop->attrs, sprop->setter);
824
+ if (!watcher) {
825
+ ok = JS_FALSE;
826
+ goto out;
827
+ }
828
+
829
+ wp = (JSWatchPoint *) JS_malloc(cx, sizeof *wp);
830
+ if (!wp) {
831
+ ok = JS_FALSE;
832
+ goto out;
833
+ }
834
+ wp->handler = NULL;
835
+ wp->closure = NULL;
836
+ wp->object = obj;
837
+ JS_ASSERT(sprop->setter != js_watch_set || pobj != obj);
838
+ wp->setter = sprop->setter;
839
+ wp->flags = JSWP_LIVE;
840
+
841
+ /* XXXbe nest in obj lock here */
842
+ sprop = js_ChangeNativePropertyAttrs(cx, obj, sprop, 0, sprop->attrs,
843
+ sprop->getter, watcher);
844
+ if (!sprop) {
845
+ /* Self-link so DropWatchPointAndUnlock can JS_REMOVE_LINK it. */
846
+ JS_INIT_CLIST(&wp->links);
847
+ DBG_LOCK(rt);
848
+ DropWatchPointAndUnlock(cx, wp, JSWP_LIVE);
849
+ ok = JS_FALSE;
850
+ goto out;
851
+ }
852
+ wp->sprop = sprop;
853
+
854
+ /*
855
+ * Now that wp is fully initialized, append it to rt's wp list.
856
+ * Because obj is locked we know that no other thread could have added
857
+ * a watchpoint for (obj, propid).
858
+ */
859
+ DBG_LOCK(rt);
860
+ JS_ASSERT(!FindWatchPoint(rt, OBJ_SCOPE(obj), propid));
861
+ JS_APPEND_LINK(&wp->links, &rt->watchPointList);
862
+ ++rt->debuggerMutations;
863
+ }
864
+ wp->handler = handler;
865
+ wp->closure = closure;
866
+ DBG_UNLOCK(rt);
867
+
868
+ out:
869
+ OBJ_DROP_PROPERTY(cx, obj, prop);
870
+ return ok;
871
+ }
872
+
873
+ JS_PUBLIC_API(JSBool)
874
+ JS_ClearWatchPoint(JSContext *cx, JSObject *obj, jsval id,
875
+ JSWatchPointHandler *handlerp, void **closurep)
876
+ {
877
+ JSRuntime *rt;
878
+ JSWatchPoint *wp;
879
+
880
+ rt = cx->runtime;
881
+ DBG_LOCK(rt);
882
+ for (wp = (JSWatchPoint *)rt->watchPointList.next;
883
+ &wp->links != &rt->watchPointList;
884
+ wp = (JSWatchPoint *)wp->links.next) {
885
+ if (wp->object == obj && SPROP_USERID(wp->sprop) == id) {
886
+ if (handlerp)
887
+ *handlerp = wp->handler;
888
+ if (closurep)
889
+ *closurep = wp->closure;
890
+ return DropWatchPointAndUnlock(cx, wp, JSWP_LIVE);
891
+ }
892
+ }
893
+ DBG_UNLOCK(rt);
894
+ if (handlerp)
895
+ *handlerp = NULL;
896
+ if (closurep)
897
+ *closurep = NULL;
898
+ return JS_TRUE;
899
+ }
900
+
901
+ JS_PUBLIC_API(JSBool)
902
+ JS_ClearWatchPointsForObject(JSContext *cx, JSObject *obj)
903
+ {
904
+ JSRuntime *rt;
905
+ JSWatchPoint *wp, *next;
906
+ uint32 sample;
907
+
908
+ rt = cx->runtime;
909
+ DBG_LOCK(rt);
910
+ for (wp = (JSWatchPoint *)rt->watchPointList.next;
911
+ &wp->links != &rt->watchPointList;
912
+ wp = next) {
913
+ next = (JSWatchPoint *)wp->links.next;
914
+ if (wp->object == obj) {
915
+ sample = rt->debuggerMutations;
916
+ if (!DropWatchPointAndUnlock(cx, wp, JSWP_LIVE))
917
+ return JS_FALSE;
918
+ DBG_LOCK(rt);
919
+ if (rt->debuggerMutations != sample + 1)
920
+ next = (JSWatchPoint *)rt->watchPointList.next;
921
+ }
922
+ }
923
+ DBG_UNLOCK(rt);
924
+ return JS_TRUE;
925
+ }
926
+
927
+ JS_PUBLIC_API(JSBool)
928
+ JS_ClearAllWatchPoints(JSContext *cx)
929
+ {
930
+ JSRuntime *rt;
931
+ JSWatchPoint *wp, *next;
932
+ uint32 sample;
933
+
934
+ rt = cx->runtime;
935
+ DBG_LOCK(rt);
936
+ for (wp = (JSWatchPoint *)rt->watchPointList.next;
937
+ &wp->links != &rt->watchPointList;
938
+ wp = next) {
939
+ next = (JSWatchPoint *)wp->links.next;
940
+ sample = rt->debuggerMutations;
941
+ if (!DropWatchPointAndUnlock(cx, wp, JSWP_LIVE))
942
+ return JS_FALSE;
943
+ DBG_LOCK(rt);
944
+ if (rt->debuggerMutations != sample + 1)
945
+ next = (JSWatchPoint *)rt->watchPointList.next;
946
+ }
947
+ DBG_UNLOCK(rt);
948
+ return JS_TRUE;
949
+ }
950
+
951
+ /************************************************************************/
952
+
953
+ JS_PUBLIC_API(uintN)
954
+ JS_PCToLineNumber(JSContext *cx, JSScript *script, jsbytecode *pc)
955
+ {
956
+ return js_PCToLineNumber(cx, script, pc);
957
+ }
958
+
959
+ JS_PUBLIC_API(jsbytecode *)
960
+ JS_LineNumberToPC(JSContext *cx, JSScript *script, uintN lineno)
961
+ {
962
+ return js_LineNumberToPC(script, lineno);
963
+ }
964
+
965
+ JS_PUBLIC_API(JSScript *)
966
+ JS_GetFunctionScript(JSContext *cx, JSFunction *fun)
967
+ {
968
+ return FUN_SCRIPT(fun);
969
+ }
970
+
971
+ JS_PUBLIC_API(JSNative)
972
+ JS_GetFunctionNative(JSContext *cx, JSFunction *fun)
973
+ {
974
+ return FUN_NATIVE(fun);
975
+ }
976
+
977
+ JS_PUBLIC_API(JSFastNative)
978
+ JS_GetFunctionFastNative(JSContext *cx, JSFunction *fun)
979
+ {
980
+ return FUN_FAST_NATIVE(fun);
981
+ }
982
+
983
+ JS_PUBLIC_API(JSPrincipals *)
984
+ JS_GetScriptPrincipals(JSContext *cx, JSScript *script)
985
+ {
986
+ return script->principals;
987
+ }
988
+
989
+ /************************************************************************/
990
+
991
+ /*
992
+ * Stack Frame Iterator
993
+ */
994
+ JS_PUBLIC_API(JSStackFrame *)
995
+ JS_FrameIterator(JSContext *cx, JSStackFrame **iteratorp)
996
+ {
997
+ *iteratorp = (*iteratorp == NULL) ? js_GetTopStackFrame(cx) : (*iteratorp)->down;
998
+ return *iteratorp;
999
+ }
1000
+
1001
+ JS_PUBLIC_API(JSScript *)
1002
+ JS_GetFrameScript(JSContext *cx, JSStackFrame *fp)
1003
+ {
1004
+ return fp->script;
1005
+ }
1006
+
1007
+ JS_PUBLIC_API(jsbytecode *)
1008
+ JS_GetFramePC(JSContext *cx, JSStackFrame *fp)
1009
+ {
1010
+ return fp->regs ? fp->regs->pc : NULL;
1011
+ }
1012
+
1013
+ JS_PUBLIC_API(JSStackFrame *)
1014
+ JS_GetScriptedCaller(JSContext *cx, JSStackFrame *fp)
1015
+ {
1016
+ return js_GetScriptedCaller(cx, fp);
1017
+ }
1018
+
1019
+ JS_PUBLIC_API(JSPrincipals *)
1020
+ JS_StackFramePrincipals(JSContext *cx, JSStackFrame *fp)
1021
+ {
1022
+ JSSecurityCallbacks *callbacks;
1023
+
1024
+ if (fp->fun) {
1025
+ callbacks = JS_GetSecurityCallbacks(cx);
1026
+ if (callbacks && callbacks->findObjectPrincipals) {
1027
+ if (FUN_OBJECT(fp->fun) != fp->callee)
1028
+ return callbacks->findObjectPrincipals(cx, fp->callee);
1029
+ /* FALL THROUGH */
1030
+ }
1031
+ }
1032
+ if (fp->script)
1033
+ return fp->script->principals;
1034
+ return NULL;
1035
+ }
1036
+
1037
+ JS_PUBLIC_API(JSPrincipals *)
1038
+ JS_EvalFramePrincipals(JSContext *cx, JSStackFrame *fp, JSStackFrame *caller)
1039
+ {
1040
+ JSPrincipals *principals, *callerPrincipals;
1041
+ JSSecurityCallbacks *callbacks;
1042
+
1043
+ callbacks = JS_GetSecurityCallbacks(cx);
1044
+ if (callbacks && callbacks->findObjectPrincipals) {
1045
+ principals = callbacks->findObjectPrincipals(cx, fp->callee);
1046
+ } else {
1047
+ principals = NULL;
1048
+ }
1049
+ if (!caller)
1050
+ return principals;
1051
+ callerPrincipals = JS_StackFramePrincipals(cx, caller);
1052
+ return (callerPrincipals && principals &&
1053
+ callerPrincipals->subsume(callerPrincipals, principals))
1054
+ ? principals
1055
+ : callerPrincipals;
1056
+ }
1057
+
1058
+ JS_PUBLIC_API(void *)
1059
+ JS_GetFrameAnnotation(JSContext *cx, JSStackFrame *fp)
1060
+ {
1061
+ if (fp->annotation && fp->script) {
1062
+ JSPrincipals *principals = JS_StackFramePrincipals(cx, fp);
1063
+
1064
+ if (principals && principals->globalPrivilegesEnabled(cx, principals)) {
1065
+ /*
1066
+ * Give out an annotation only if privileges have not been revoked
1067
+ * or disabled globally.
1068
+ */
1069
+ return fp->annotation;
1070
+ }
1071
+ }
1072
+
1073
+ return NULL;
1074
+ }
1075
+
1076
+ JS_PUBLIC_API(void)
1077
+ JS_SetFrameAnnotation(JSContext *cx, JSStackFrame *fp, void *annotation)
1078
+ {
1079
+ fp->annotation = annotation;
1080
+ }
1081
+
1082
+ JS_PUBLIC_API(void *)
1083
+ JS_GetFramePrincipalArray(JSContext *cx, JSStackFrame *fp)
1084
+ {
1085
+ JSPrincipals *principals;
1086
+
1087
+ principals = JS_StackFramePrincipals(cx, fp);
1088
+ if (!principals)
1089
+ return NULL;
1090
+ return principals->getPrincipalArray(cx, principals);
1091
+ }
1092
+
1093
+ JS_PUBLIC_API(JSBool)
1094
+ JS_IsNativeFrame(JSContext *cx, JSStackFrame *fp)
1095
+ {
1096
+ return !fp->script;
1097
+ }
1098
+
1099
+ /* this is deprecated, use JS_GetFrameScopeChain instead */
1100
+ JS_PUBLIC_API(JSObject *)
1101
+ JS_GetFrameObject(JSContext *cx, JSStackFrame *fp)
1102
+ {
1103
+ return fp->scopeChain;
1104
+ }
1105
+
1106
+ JS_PUBLIC_API(JSObject *)
1107
+ JS_GetFrameScopeChain(JSContext *cx, JSStackFrame *fp)
1108
+ {
1109
+ /* Force creation of argument and call objects if not yet created */
1110
+ (void) JS_GetFrameCallObject(cx, fp);
1111
+ return js_GetScopeChain(cx, fp);
1112
+ }
1113
+
1114
+ JS_PUBLIC_API(JSObject *)
1115
+ JS_GetFrameCallObject(JSContext *cx, JSStackFrame *fp)
1116
+ {
1117
+ if (! fp->fun)
1118
+ return NULL;
1119
+
1120
+ /* Force creation of argument object if not yet created */
1121
+ (void) js_GetArgsObject(cx, fp);
1122
+
1123
+ /*
1124
+ * XXX ill-defined: null return here means error was reported, unlike a
1125
+ * null returned above or in the #else
1126
+ */
1127
+ return js_GetCallObject(cx, fp);
1128
+ }
1129
+
1130
+ JS_PUBLIC_API(JSObject *)
1131
+ JS_GetFrameThis(JSContext *cx, JSStackFrame *fp)
1132
+ {
1133
+ JSStackFrame *afp;
1134
+
1135
+ if (fp->flags & JSFRAME_COMPUTED_THIS)
1136
+ return fp->thisp;
1137
+
1138
+ /* js_ComputeThis gets confused if fp != cx->fp, so set it aside. */
1139
+ if (js_GetTopStackFrame(cx) != fp) {
1140
+ afp = cx->fp;
1141
+ if (afp) {
1142
+ afp->dormantNext = cx->dormantFrameChain;
1143
+ cx->dormantFrameChain = afp;
1144
+ cx->fp = fp;
1145
+ }
1146
+ } else {
1147
+ afp = NULL;
1148
+ }
1149
+
1150
+ if (!fp->thisp && fp->argv)
1151
+ fp->thisp = js_ComputeThis(cx, JS_TRUE, fp->argv);
1152
+
1153
+ if (afp) {
1154
+ cx->fp = afp;
1155
+ cx->dormantFrameChain = afp->dormantNext;
1156
+ afp->dormantNext = NULL;
1157
+ }
1158
+
1159
+ return fp->thisp;
1160
+ }
1161
+
1162
+ JS_PUBLIC_API(JSFunction *)
1163
+ JS_GetFrameFunction(JSContext *cx, JSStackFrame *fp)
1164
+ {
1165
+ return fp->fun;
1166
+ }
1167
+
1168
+ JS_PUBLIC_API(JSObject *)
1169
+ JS_GetFrameFunctionObject(JSContext *cx, JSStackFrame *fp)
1170
+ {
1171
+ if (!fp->fun)
1172
+ return NULL;
1173
+
1174
+ JS_ASSERT(HAS_FUNCTION_CLASS(fp->callee));
1175
+ JS_ASSERT(OBJ_GET_PRIVATE(cx, fp->callee) == fp->fun);
1176
+ return fp->callee;
1177
+ }
1178
+
1179
+ JS_PUBLIC_API(JSBool)
1180
+ JS_IsConstructorFrame(JSContext *cx, JSStackFrame *fp)
1181
+ {
1182
+ return (fp->flags & JSFRAME_CONSTRUCTING) != 0;
1183
+ }
1184
+
1185
+ JS_PUBLIC_API(JSObject *)
1186
+ JS_GetFrameCalleeObject(JSContext *cx, JSStackFrame *fp)
1187
+ {
1188
+ return fp->callee;
1189
+ }
1190
+
1191
+ JS_PUBLIC_API(JSBool)
1192
+ JS_IsDebuggerFrame(JSContext *cx, JSStackFrame *fp)
1193
+ {
1194
+ return (fp->flags & JSFRAME_DEBUGGER) != 0;
1195
+ }
1196
+
1197
+ JS_PUBLIC_API(jsval)
1198
+ JS_GetFrameReturnValue(JSContext *cx, JSStackFrame *fp)
1199
+ {
1200
+ return fp->rval;
1201
+ }
1202
+
1203
+ JS_PUBLIC_API(void)
1204
+ JS_SetFrameReturnValue(JSContext *cx, JSStackFrame *fp, jsval rval)
1205
+ {
1206
+ fp->rval = rval;
1207
+ }
1208
+
1209
+ /************************************************************************/
1210
+
1211
+ JS_PUBLIC_API(const char *)
1212
+ JS_GetScriptFilename(JSContext *cx, JSScript *script)
1213
+ {
1214
+ return script->filename;
1215
+ }
1216
+
1217
+ JS_PUBLIC_API(uintN)
1218
+ JS_GetScriptBaseLineNumber(JSContext *cx, JSScript *script)
1219
+ {
1220
+ return script->lineno;
1221
+ }
1222
+
1223
+ JS_PUBLIC_API(uintN)
1224
+ JS_GetScriptLineExtent(JSContext *cx, JSScript *script)
1225
+ {
1226
+ return js_GetScriptLineExtent(script);
1227
+ }
1228
+
1229
+ JS_PUBLIC_API(JSVersion)
1230
+ JS_GetScriptVersion(JSContext *cx, JSScript *script)
1231
+ {
1232
+ return (JSVersion) (script->version & JSVERSION_MASK);
1233
+ }
1234
+
1235
+ /***************************************************************************/
1236
+
1237
+ JS_PUBLIC_API(void)
1238
+ JS_SetNewScriptHook(JSRuntime *rt, JSNewScriptHook hook, void *callerdata)
1239
+ {
1240
+ rt->globalDebugHooks.newScriptHook = hook;
1241
+ rt->globalDebugHooks.newScriptHookData = callerdata;
1242
+ }
1243
+
1244
+ JS_PUBLIC_API(void)
1245
+ JS_SetDestroyScriptHook(JSRuntime *rt, JSDestroyScriptHook hook,
1246
+ void *callerdata)
1247
+ {
1248
+ rt->globalDebugHooks.destroyScriptHook = hook;
1249
+ rt->globalDebugHooks.destroyScriptHookData = callerdata;
1250
+ }
1251
+
1252
+ /***************************************************************************/
1253
+
1254
+ JS_PUBLIC_API(JSBool)
1255
+ JS_EvaluateUCInStackFrame(JSContext *cx, JSStackFrame *fp,
1256
+ const jschar *chars, uintN length,
1257
+ const char *filename, uintN lineno,
1258
+ jsval *rval)
1259
+ {
1260
+ JS_ASSERT_NOT_ON_TRACE(cx);
1261
+
1262
+ JSObject *scobj;
1263
+ JSScript *script;
1264
+ JSBool ok;
1265
+
1266
+ scobj = JS_GetFrameScopeChain(cx, fp);
1267
+ if (!scobj)
1268
+ return JS_FALSE;
1269
+
1270
+ /*
1271
+ * NB: This function breaks the assumption that the compiler can see all
1272
+ * calls and properly compute a static level. In order to get around this,
1273
+ * we use a static level that will cause us not to attempt to optimize
1274
+ * variable references made by this frame.
1275
+ */
1276
+ script = JSCompiler::compileScript(cx, scobj, fp, JS_StackFramePrincipals(cx, fp),
1277
+ TCF_COMPILE_N_GO |
1278
+ TCF_PUT_STATIC_LEVEL(JS_DISPLAY_SIZE),
1279
+ chars, length, NULL,
1280
+ filename, lineno);
1281
+
1282
+ if (!script)
1283
+ return JS_FALSE;
1284
+
1285
+ JSStackFrame *displayCopy[JS_DISPLAY_SIZE];
1286
+ if (cx->fp != fp) {
1287
+ memcpy(displayCopy, cx->display, sizeof displayCopy);
1288
+
1289
+ /*
1290
+ * Set up cx->display as it would have been when fp was active.
1291
+ *
1292
+ * NB: To reconstruct cx->display for fp, we have to follow the frame
1293
+ * chain from oldest to youngest, in the opposite direction to its
1294
+ * single linkge. To avoid the obvious recursive reversal algorithm,
1295
+ * which might use too much stack, we reverse in place and reverse
1296
+ * again as we reconstruct the display. This is safe because cx is
1297
+ * thread-local and we can't cause GC until the call to js_Execute
1298
+ * below.
1299
+ */
1300
+ JSStackFrame *fp2 = fp, *last = NULL;
1301
+ while (fp2) {
1302
+ JSStackFrame *next = fp2->down;
1303
+ fp2->down = last;
1304
+ last = fp2;
1305
+ fp2 = next;
1306
+ }
1307
+
1308
+ fp2 = last;
1309
+ last = NULL;
1310
+ while (fp2) {
1311
+ JSStackFrame *next = fp2->down;
1312
+ fp2->down = last;
1313
+ last = fp2;
1314
+
1315
+ JSScript *script = fp2->script;
1316
+ if (script && script->staticLevel < JS_DISPLAY_SIZE)
1317
+ cx->display[script->staticLevel] = fp2;
1318
+ fp2 = next;
1319
+ }
1320
+ }
1321
+
1322
+ ok = js_Execute(cx, scobj, script, fp, JSFRAME_DEBUGGER | JSFRAME_EVAL,
1323
+ rval);
1324
+
1325
+ if (cx->fp != fp)
1326
+ memcpy(cx->display, displayCopy, sizeof cx->display);
1327
+ js_DestroyScript(cx, script);
1328
+ return ok;
1329
+ }
1330
+
1331
+ JS_PUBLIC_API(JSBool)
1332
+ JS_EvaluateInStackFrame(JSContext *cx, JSStackFrame *fp,
1333
+ const char *bytes, uintN length,
1334
+ const char *filename, uintN lineno,
1335
+ jsval *rval)
1336
+ {
1337
+ jschar *chars;
1338
+ JSBool ok;
1339
+ size_t len = length;
1340
+
1341
+ chars = js_InflateString(cx, bytes, &len);
1342
+ if (!chars)
1343
+ return JS_FALSE;
1344
+ length = (uintN) len;
1345
+ ok = JS_EvaluateUCInStackFrame(cx, fp, chars, length, filename, lineno,
1346
+ rval);
1347
+ JS_free(cx, chars);
1348
+
1349
+ return ok;
1350
+ }
1351
+
1352
+ /************************************************************************/
1353
+
1354
+ /* XXXbe this all needs to be reworked to avoid requiring JSScope types. */
1355
+
1356
+ JS_PUBLIC_API(JSScopeProperty *)
1357
+ JS_PropertyIterator(JSObject *obj, JSScopeProperty **iteratorp)
1358
+ {
1359
+ JSScopeProperty *sprop;
1360
+ JSScope *scope;
1361
+
1362
+ sprop = *iteratorp;
1363
+ scope = OBJ_SCOPE(obj);
1364
+
1365
+ /* XXXbe minor(?) incompatibility: iterate in reverse definition order */
1366
+ if (!sprop) {
1367
+ sprop = SCOPE_LAST_PROP(scope);
1368
+ } else {
1369
+ while ((sprop = sprop->parent) != NULL) {
1370
+ if (!SCOPE_HAD_MIDDLE_DELETE(scope))
1371
+ break;
1372
+ if (SCOPE_HAS_PROPERTY(scope, sprop))
1373
+ break;
1374
+ }
1375
+ }
1376
+ *iteratorp = sprop;
1377
+ return sprop;
1378
+ }
1379
+
1380
+ JS_PUBLIC_API(JSBool)
1381
+ JS_GetPropertyDesc(JSContext *cx, JSObject *obj, JSScopeProperty *sprop,
1382
+ JSPropertyDesc *pd)
1383
+ {
1384
+ JSScope *scope;
1385
+ JSScopeProperty *aprop;
1386
+ jsval lastException;
1387
+ JSBool wasThrowing;
1388
+
1389
+ pd->id = ID_TO_VALUE(sprop->id);
1390
+
1391
+ wasThrowing = cx->throwing;
1392
+ if (wasThrowing) {
1393
+ lastException = cx->exception;
1394
+ if (JSVAL_IS_GCTHING(lastException) &&
1395
+ !js_AddRoot(cx, &lastException, "lastException")) {
1396
+ return JS_FALSE;
1397
+ }
1398
+ cx->throwing = JS_FALSE;
1399
+ }
1400
+
1401
+ if (!js_GetProperty(cx, obj, sprop->id, &pd->value)) {
1402
+ if (!cx->throwing) {
1403
+ pd->flags = JSPD_ERROR;
1404
+ pd->value = JSVAL_VOID;
1405
+ } else {
1406
+ pd->flags = JSPD_EXCEPTION;
1407
+ pd->value = cx->exception;
1408
+ }
1409
+ } else {
1410
+ pd->flags = 0;
1411
+ }
1412
+
1413
+ cx->throwing = wasThrowing;
1414
+ if (wasThrowing) {
1415
+ cx->exception = lastException;
1416
+ if (JSVAL_IS_GCTHING(lastException))
1417
+ js_RemoveRoot(cx->runtime, &lastException);
1418
+ }
1419
+
1420
+ pd->flags |= ((sprop->attrs & JSPROP_ENUMERATE) ? JSPD_ENUMERATE : 0)
1421
+ | ((sprop->attrs & JSPROP_READONLY) ? JSPD_READONLY : 0)
1422
+ | ((sprop->attrs & JSPROP_PERMANENT) ? JSPD_PERMANENT : 0);
1423
+ pd->spare = 0;
1424
+ if (sprop->getter == js_GetCallArg) {
1425
+ pd->slot = sprop->shortid;
1426
+ pd->flags |= JSPD_ARGUMENT;
1427
+ } else if (sprop->getter == js_GetCallVar) {
1428
+ pd->slot = sprop->shortid;
1429
+ pd->flags |= JSPD_VARIABLE;
1430
+ } else {
1431
+ pd->slot = 0;
1432
+ }
1433
+ pd->alias = JSVAL_VOID;
1434
+ scope = OBJ_SCOPE(obj);
1435
+ if (SPROP_HAS_VALID_SLOT(sprop, scope)) {
1436
+ for (aprop = SCOPE_LAST_PROP(scope); aprop; aprop = aprop->parent) {
1437
+ if (aprop != sprop && aprop->slot == sprop->slot) {
1438
+ pd->alias = ID_TO_VALUE(aprop->id);
1439
+ break;
1440
+ }
1441
+ }
1442
+ }
1443
+ return JS_TRUE;
1444
+ }
1445
+
1446
+ JS_PUBLIC_API(JSBool)
1447
+ JS_GetPropertyDescArray(JSContext *cx, JSObject *obj, JSPropertyDescArray *pda)
1448
+ {
1449
+ JSClass *clasp;
1450
+ JSScope *scope;
1451
+ uint32 i, n;
1452
+ JSPropertyDesc *pd;
1453
+ JSScopeProperty *sprop;
1454
+
1455
+ clasp = OBJ_GET_CLASS(cx, obj);
1456
+ if (!OBJ_IS_NATIVE(obj) || (clasp->flags & JSCLASS_NEW_ENUMERATE)) {
1457
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
1458
+ JSMSG_CANT_DESCRIBE_PROPS, clasp->name);
1459
+ return JS_FALSE;
1460
+ }
1461
+ if (!clasp->enumerate(cx, obj))
1462
+ return JS_FALSE;
1463
+
1464
+ /* have no props, or object's scope has not mutated from that of proto */
1465
+ scope = OBJ_SCOPE(obj);
1466
+ if (scope->object != obj || scope->entryCount == 0) {
1467
+ pda->length = 0;
1468
+ pda->array = NULL;
1469
+ return JS_TRUE;
1470
+ }
1471
+
1472
+ n = scope->entryCount;
1473
+ pd = (JSPropertyDesc *) JS_malloc(cx, (size_t)n * sizeof(JSPropertyDesc));
1474
+ if (!pd)
1475
+ return JS_FALSE;
1476
+ i = 0;
1477
+ for (sprop = SCOPE_LAST_PROP(scope); sprop; sprop = sprop->parent) {
1478
+ if (SCOPE_HAD_MIDDLE_DELETE(scope) && !SCOPE_HAS_PROPERTY(scope, sprop))
1479
+ continue;
1480
+ if (!js_AddRoot(cx, &pd[i].id, NULL))
1481
+ goto bad;
1482
+ if (!js_AddRoot(cx, &pd[i].value, NULL))
1483
+ goto bad;
1484
+ if (!JS_GetPropertyDesc(cx, obj, sprop, &pd[i]))
1485
+ goto bad;
1486
+ if ((pd[i].flags & JSPD_ALIAS) && !js_AddRoot(cx, &pd[i].alias, NULL))
1487
+ goto bad;
1488
+ if (++i == n)
1489
+ break;
1490
+ }
1491
+ pda->length = i;
1492
+ pda->array = pd;
1493
+ return JS_TRUE;
1494
+
1495
+ bad:
1496
+ pda->length = i + 1;
1497
+ pda->array = pd;
1498
+ JS_PutPropertyDescArray(cx, pda);
1499
+ return JS_FALSE;
1500
+ }
1501
+
1502
+ JS_PUBLIC_API(void)
1503
+ JS_PutPropertyDescArray(JSContext *cx, JSPropertyDescArray *pda)
1504
+ {
1505
+ JSPropertyDesc *pd;
1506
+ uint32 i;
1507
+
1508
+ pd = pda->array;
1509
+ for (i = 0; i < pda->length; i++) {
1510
+ js_RemoveRoot(cx->runtime, &pd[i].id);
1511
+ js_RemoveRoot(cx->runtime, &pd[i].value);
1512
+ if (pd[i].flags & JSPD_ALIAS)
1513
+ js_RemoveRoot(cx->runtime, &pd[i].alias);
1514
+ }
1515
+ JS_free(cx, pd);
1516
+ }
1517
+
1518
+ /************************************************************************/
1519
+
1520
+ JS_PUBLIC_API(JSBool)
1521
+ JS_SetDebuggerHandler(JSRuntime *rt, JSTrapHandler handler, void *closure)
1522
+ {
1523
+ rt->globalDebugHooks.debuggerHandler = handler;
1524
+ rt->globalDebugHooks.debuggerHandlerData = closure;
1525
+ return JS_TRUE;
1526
+ }
1527
+
1528
+ JS_PUBLIC_API(JSBool)
1529
+ JS_SetSourceHandler(JSRuntime *rt, JSSourceHandler handler, void *closure)
1530
+ {
1531
+ rt->globalDebugHooks.sourceHandler = handler;
1532
+ rt->globalDebugHooks.sourceHandlerData = closure;
1533
+ return JS_TRUE;
1534
+ }
1535
+
1536
+ JS_PUBLIC_API(JSBool)
1537
+ JS_SetExecuteHook(JSRuntime *rt, JSInterpreterHook hook, void *closure)
1538
+ {
1539
+ rt->globalDebugHooks.executeHook = hook;
1540
+ rt->globalDebugHooks.executeHookData = closure;
1541
+ return JS_TRUE;
1542
+ }
1543
+
1544
+ JS_PUBLIC_API(JSBool)
1545
+ JS_SetCallHook(JSRuntime *rt, JSInterpreterHook hook, void *closure)
1546
+ {
1547
+ rt->globalDebugHooks.callHook = hook;
1548
+ rt->globalDebugHooks.callHookData = closure;
1549
+ return JS_TRUE;
1550
+ }
1551
+
1552
+ JS_PUBLIC_API(JSBool)
1553
+ JS_SetObjectHook(JSRuntime *rt, JSObjectHook hook, void *closure)
1554
+ {
1555
+ rt->globalDebugHooks.objectHook = hook;
1556
+ rt->globalDebugHooks.objectHookData = closure;
1557
+ return JS_TRUE;
1558
+ }
1559
+
1560
+ JS_PUBLIC_API(JSBool)
1561
+ JS_SetThrowHook(JSRuntime *rt, JSTrapHandler hook, void *closure)
1562
+ {
1563
+ rt->globalDebugHooks.throwHook = hook;
1564
+ rt->globalDebugHooks.throwHookData = closure;
1565
+ return JS_TRUE;
1566
+ }
1567
+
1568
+ JS_PUBLIC_API(JSBool)
1569
+ JS_SetDebugErrorHook(JSRuntime *rt, JSDebugErrorHook hook, void *closure)
1570
+ {
1571
+ rt->globalDebugHooks.debugErrorHook = hook;
1572
+ rt->globalDebugHooks.debugErrorHookData = closure;
1573
+ return JS_TRUE;
1574
+ }
1575
+
1576
+ /************************************************************************/
1577
+
1578
+ JS_PUBLIC_API(size_t)
1579
+ JS_GetObjectTotalSize(JSContext *cx, JSObject *obj)
1580
+ {
1581
+ size_t nbytes;
1582
+ JSScope *scope;
1583
+
1584
+ nbytes = sizeof *obj;
1585
+ if (obj->dslots) {
1586
+ nbytes += ((uint32)obj->dslots[-1] - JS_INITIAL_NSLOTS + 1)
1587
+ * sizeof obj->dslots[0];
1588
+ }
1589
+ if (OBJ_IS_NATIVE(obj)) {
1590
+ scope = OBJ_SCOPE(obj);
1591
+ if (scope->object == obj) {
1592
+ nbytes += sizeof *scope;
1593
+ nbytes += SCOPE_CAPACITY(scope) * sizeof(JSScopeProperty *);
1594
+ }
1595
+ }
1596
+ return nbytes;
1597
+ }
1598
+
1599
+ static size_t
1600
+ GetAtomTotalSize(JSContext *cx, JSAtom *atom)
1601
+ {
1602
+ size_t nbytes;
1603
+
1604
+ nbytes = sizeof(JSAtom *) + sizeof(JSDHashEntryStub);
1605
+ if (ATOM_IS_STRING(atom)) {
1606
+ nbytes += sizeof(JSString);
1607
+ nbytes += (JSFLATSTR_LENGTH(ATOM_TO_STRING(atom)) + 1) * sizeof(jschar);
1608
+ } else if (ATOM_IS_DOUBLE(atom)) {
1609
+ nbytes += sizeof(jsdouble);
1610
+ }
1611
+ return nbytes;
1612
+ }
1613
+
1614
+ JS_PUBLIC_API(size_t)
1615
+ JS_GetFunctionTotalSize(JSContext *cx, JSFunction *fun)
1616
+ {
1617
+ size_t nbytes;
1618
+
1619
+ nbytes = sizeof *fun;
1620
+ nbytes += JS_GetObjectTotalSize(cx, FUN_OBJECT(fun));
1621
+ if (FUN_INTERPRETED(fun))
1622
+ nbytes += JS_GetScriptTotalSize(cx, fun->u.i.script);
1623
+ if (fun->atom)
1624
+ nbytes += GetAtomTotalSize(cx, fun->atom);
1625
+ return nbytes;
1626
+ }
1627
+
1628
+ #include "jsemit.h"
1629
+
1630
+ JS_PUBLIC_API(size_t)
1631
+ JS_GetScriptTotalSize(JSContext *cx, JSScript *script)
1632
+ {
1633
+ size_t nbytes, pbytes;
1634
+ jsatomid i;
1635
+ jssrcnote *sn, *notes;
1636
+ JSObjectArray *objarray;
1637
+ JSPrincipals *principals;
1638
+
1639
+ nbytes = sizeof *script;
1640
+ if (script->u.object)
1641
+ nbytes += JS_GetObjectTotalSize(cx, script->u.object);
1642
+
1643
+ nbytes += script->length * sizeof script->code[0];
1644
+ nbytes += script->atomMap.length * sizeof script->atomMap.vector[0];
1645
+ for (i = 0; i < script->atomMap.length; i++)
1646
+ nbytes += GetAtomTotalSize(cx, script->atomMap.vector[i]);
1647
+
1648
+ if (script->filename)
1649
+ nbytes += strlen(script->filename) + 1;
1650
+
1651
+ notes = SCRIPT_NOTES(script);
1652
+ for (sn = notes; !SN_IS_TERMINATOR(sn); sn = SN_NEXT(sn))
1653
+ continue;
1654
+ nbytes += (sn - notes + 1) * sizeof *sn;
1655
+
1656
+ if (script->objectsOffset != 0) {
1657
+ objarray = JS_SCRIPT_OBJECTS(script);
1658
+ i = objarray->length;
1659
+ nbytes += sizeof *objarray + i * sizeof objarray->vector[0];
1660
+ do {
1661
+ nbytes += JS_GetObjectTotalSize(cx, objarray->vector[--i]);
1662
+ } while (i != 0);
1663
+ }
1664
+
1665
+ if (script->regexpsOffset != 0) {
1666
+ objarray = JS_SCRIPT_REGEXPS(script);
1667
+ i = objarray->length;
1668
+ nbytes += sizeof *objarray + i * sizeof objarray->vector[0];
1669
+ do {
1670
+ nbytes += JS_GetObjectTotalSize(cx, objarray->vector[--i]);
1671
+ } while (i != 0);
1672
+ }
1673
+
1674
+ if (script->trynotesOffset != 0) {
1675
+ nbytes += sizeof(JSTryNoteArray) +
1676
+ JS_SCRIPT_TRYNOTES(script)->length * sizeof(JSTryNote);
1677
+ }
1678
+
1679
+ principals = script->principals;
1680
+ if (principals) {
1681
+ JS_ASSERT(principals->refcount);
1682
+ pbytes = sizeof *principals;
1683
+ if (principals->refcount > 1)
1684
+ pbytes = JS_HOWMANY(pbytes, principals->refcount);
1685
+ nbytes += pbytes;
1686
+ }
1687
+
1688
+ return nbytes;
1689
+ }
1690
+
1691
+ JS_PUBLIC_API(uint32)
1692
+ JS_GetTopScriptFilenameFlags(JSContext *cx, JSStackFrame *fp)
1693
+ {
1694
+ if (!fp)
1695
+ fp = js_GetTopStackFrame(cx);
1696
+ while (fp) {
1697
+ if (fp->script)
1698
+ return JS_GetScriptFilenameFlags(fp->script);
1699
+ fp = fp->down;
1700
+ }
1701
+ return 0;
1702
+ }
1703
+
1704
+ JS_PUBLIC_API(uint32)
1705
+ JS_GetScriptFilenameFlags(JSScript *script)
1706
+ {
1707
+ JS_ASSERT(script);
1708
+ if (!script->filename)
1709
+ return JSFILENAME_NULL;
1710
+ return js_GetScriptFilenameFlags(script->filename);
1711
+ }
1712
+
1713
+ JS_PUBLIC_API(JSBool)
1714
+ JS_FlagScriptFilenamePrefix(JSRuntime *rt, const char *prefix, uint32 flags)
1715
+ {
1716
+ if (!js_SaveScriptFilenameRT(rt, prefix, flags))
1717
+ return JS_FALSE;
1718
+ return JS_TRUE;
1719
+ }
1720
+
1721
+ JS_PUBLIC_API(JSBool)
1722
+ JS_IsSystemObject(JSContext *cx, JSObject *obj)
1723
+ {
1724
+ return STOBJ_IS_SYSTEM(obj);
1725
+ }
1726
+
1727
+ JS_PUBLIC_API(JSObject *)
1728
+ JS_NewSystemObject(JSContext *cx, JSClass *clasp, JSObject *proto,
1729
+ JSObject *parent, JSBool system)
1730
+ {
1731
+ JSObject *obj;
1732
+
1733
+ obj = js_NewObject(cx, clasp, proto, parent, 0);
1734
+ if (obj && system)
1735
+ STOBJ_SET_SYSTEM(obj);
1736
+ return obj;
1737
+ }
1738
+
1739
+ /************************************************************************/
1740
+
1741
+ JS_PUBLIC_API(JSDebugHooks *)
1742
+ JS_GetGlobalDebugHooks(JSRuntime *rt)
1743
+ {
1744
+ return &rt->globalDebugHooks;
1745
+ }
1746
+
1747
+ JS_PUBLIC_API(JSDebugHooks *)
1748
+ JS_SetContextDebugHooks(JSContext *cx, JSDebugHooks *hooks)
1749
+ {
1750
+ JSDebugHooks *old;
1751
+
1752
+ JS_ASSERT(hooks);
1753
+ old = cx->debugHooks;
1754
+ cx->debugHooks = hooks;
1755
+ return old;
1756
+ }
1757
+
1758
+ #ifdef MOZ_SHARK
1759
+
1760
+ #include <CHUD/CHUD.h>
1761
+
1762
+ JS_PUBLIC_API(JSBool)
1763
+ JS_StartChudRemote()
1764
+ {
1765
+ if (chudIsRemoteAccessAcquired() &&
1766
+ (chudStartRemotePerfMonitor("Mozilla") == chudSuccess)) {
1767
+ return JS_TRUE;
1768
+ }
1769
+
1770
+ return JS_FALSE;
1771
+ }
1772
+
1773
+ JS_PUBLIC_API(JSBool)
1774
+ JS_StopChudRemote()
1775
+ {
1776
+ if (chudIsRemoteAccessAcquired() &&
1777
+ (chudStopRemotePerfMonitor() == chudSuccess)) {
1778
+ return JS_TRUE;
1779
+ }
1780
+
1781
+ return JS_FALSE;
1782
+ }
1783
+
1784
+ JS_PUBLIC_API(JSBool)
1785
+ JS_ConnectShark()
1786
+ {
1787
+ if (!chudIsInitialized() && (chudInitialize() != chudSuccess))
1788
+ return JS_FALSE;
1789
+
1790
+ if (chudAcquireRemoteAccess() != chudSuccess)
1791
+ return JS_FALSE;
1792
+
1793
+ return JS_TRUE;
1794
+ }
1795
+
1796
+ JS_PUBLIC_API(JSBool)
1797
+ JS_DisconnectShark()
1798
+ {
1799
+ if (chudIsRemoteAccessAcquired() && (chudReleaseRemoteAccess() != chudSuccess))
1800
+ return JS_FALSE;
1801
+
1802
+ return JS_TRUE;
1803
+ }
1804
+
1805
+ JS_FRIEND_API(JSBool)
1806
+ js_StartShark(JSContext *cx, JSObject *obj,
1807
+ uintN argc, jsval *argv, jsval *rval)
1808
+ {
1809
+ if (!JS_StartChudRemote()) {
1810
+ JS_ReportError(cx, "Error starting CHUD.");
1811
+ return JS_FALSE;
1812
+ }
1813
+
1814
+ return JS_TRUE;
1815
+ }
1816
+
1817
+ JS_FRIEND_API(JSBool)
1818
+ js_StopShark(JSContext *cx, JSObject *obj,
1819
+ uintN argc, jsval *argv, jsval *rval)
1820
+ {
1821
+ if (!JS_StopChudRemote()) {
1822
+ JS_ReportError(cx, "Error stopping CHUD.");
1823
+ return JS_FALSE;
1824
+ }
1825
+
1826
+ return JS_TRUE;
1827
+ }
1828
+
1829
+ JS_FRIEND_API(JSBool)
1830
+ js_ConnectShark(JSContext *cx, JSObject *obj,
1831
+ uintN argc, jsval *argv, jsval *rval)
1832
+ {
1833
+ if (!JS_ConnectShark()) {
1834
+ JS_ReportError(cx, "Error connecting to Shark.");
1835
+ return JS_FALSE;
1836
+ }
1837
+
1838
+ return JS_TRUE;
1839
+ }
1840
+
1841
+ JS_FRIEND_API(JSBool)
1842
+ js_DisconnectShark(JSContext *cx, JSObject *obj,
1843
+ uintN argc, jsval *argv, jsval *rval)
1844
+ {
1845
+ if (!JS_DisconnectShark()) {
1846
+ JS_ReportError(cx, "Error disconnecting from Shark.");
1847
+ return JS_FALSE;
1848
+ }
1849
+
1850
+ return JS_TRUE;
1851
+ }
1852
+
1853
+ #endif /* MOZ_SHARK */
1854
+
1855
+ #ifdef MOZ_CALLGRIND
1856
+
1857
+ #include <valgrind/callgrind.h>
1858
+
1859
+ JS_FRIEND_API(JSBool)
1860
+ js_StartCallgrind(JSContext *cx, JSObject *obj,
1861
+ uintN argc, jsval *argv, jsval *rval)
1862
+ {
1863
+ CALLGRIND_START_INSTRUMENTATION;
1864
+ CALLGRIND_ZERO_STATS;
1865
+ return JS_TRUE;
1866
+ }
1867
+
1868
+ JS_FRIEND_API(JSBool)
1869
+ js_StopCallgrind(JSContext *cx, JSObject *obj,
1870
+ uintN argc, jsval *argv, jsval *rval)
1871
+ {
1872
+ CALLGRIND_STOP_INSTRUMENTATION;
1873
+ return JS_TRUE;
1874
+ }
1875
+
1876
+ JS_FRIEND_API(JSBool)
1877
+ js_DumpCallgrind(JSContext *cx, JSObject *obj,
1878
+ uintN argc, jsval *argv, jsval *rval)
1879
+ {
1880
+ JSString *str;
1881
+ char *cstr;
1882
+
1883
+ if (argc > 0 && JSVAL_IS_STRING(argv[0])) {
1884
+ str = JSVAL_TO_STRING(argv[0]);
1885
+ cstr = js_DeflateString(cx, JSSTRING_CHARS(str), JSSTRING_LENGTH(str));
1886
+ if (cstr) {
1887
+ CALLGRIND_DUMP_STATS_AT(cstr);
1888
+ JS_free(cx, cstr);
1889
+ return JS_TRUE;
1890
+ }
1891
+ }
1892
+ CALLGRIND_DUMP_STATS;
1893
+
1894
+ return JS_TRUE;
1895
+ }
1896
+
1897
+ #endif /* MOZ_CALLGRIND */
1898
+
1899
+ #ifdef MOZ_VTUNE
1900
+ #include <VTuneApi.h>
1901
+
1902
+ static const char *vtuneErrorMessages[] = {
1903
+ "unknown, error #0",
1904
+ "invalid 'max samples' field",
1905
+ "invalid 'samples per buffer' field",
1906
+ "invalid 'sample interval' field",
1907
+ "invalid path",
1908
+ "sample file in use",
1909
+ "invalid 'number of events' field",
1910
+ "unknown, error #7",
1911
+ "internal error",
1912
+ "bad event name",
1913
+ "VTStopSampling called without calling VTStartSampling",
1914
+ "no events selected for event-based sampling",
1915
+ "events selected cannot be run together",
1916
+ "no sampling parameters",
1917
+ "sample database already exists",
1918
+ "sampling already started",
1919
+ "time-based sampling not supported",
1920
+ "invalid 'sampling parameters size' field",
1921
+ "invalid 'event size' field",
1922
+ "sampling file already bound",
1923
+ "invalid event path",
1924
+ "invalid license",
1925
+ "invalid 'global options' field",
1926
+
1927
+ };
1928
+
1929
+ JS_FRIEND_API(JSBool)
1930
+ js_StartVtune(JSContext *cx, JSObject *obj,
1931
+ uintN argc, jsval *argv, jsval *rval)
1932
+ {
1933
+ VTUNE_EVENT events[] = {
1934
+ { 1000000, 0, 0, 0, "CPU_CLK_UNHALTED.CORE" },
1935
+ { 1000000, 0, 0, 0, "INST_RETIRED.ANY" },
1936
+ };
1937
+
1938
+ U32 n_events = sizeof(events) / sizeof(VTUNE_EVENT);
1939
+ char *default_filename = "mozilla-vtune.tb5";
1940
+ JSString *str;
1941
+ U32 status;
1942
+
1943
+ VTUNE_SAMPLING_PARAMS params =
1944
+ sizeof(VTUNE_SAMPLING_PARAMS),
1945
+ sizeof(VTUNE_EVENT),
1946
+ 0, 0, /* Reserved fields */
1947
+ 1, /* Initialize in "paused" state */
1948
+ 0, /* Max samples, or 0 for "continuous" */
1949
+ 4096, /* Samples per buffer */
1950
+ 0.1, /* Sampling interval in ms */
1951
+ 1, /* 1 for event-based sampling, 0 for time-based */
1952
+
1953
+ n_events,
1954
+ events,
1955
+ default_filename,
1956
+ };
1957
+
1958
+ if (argc > 0 && JSVAL_IS_STRING(argv[0])) {
1959
+ str = JSVAL_TO_STRING(argv[0]);
1960
+ params.tb5Filename = js_DeflateString(cx,
1961
+ JSSTRING_CHARS(str),
1962
+ JSSTRING_LENGTH(str));
1963
+ }
1964
+
1965
+ status = VTStartSampling(&params);
1966
+
1967
+ if (params.tb5Filename != default_filename)
1968
+ JS_free(cx, params.tb5Filename);
1969
+
1970
+ if (status != 0) {
1971
+ if (status == VTAPI_MULTIPLE_RUNS)
1972
+ VTStopSampling(0);
1973
+ if (status < sizeof(vtuneErrorMessages))
1974
+ JS_ReportError(cx, "Vtune setup error: %s",
1975
+ vtuneErrorMessages[status]);
1976
+ else
1977
+ JS_ReportError(cx, "Vtune setup error: %d",
1978
+ status);
1979
+ return JS_FALSE;
1980
+ }
1981
+ return JS_TRUE;
1982
+ }
1983
+
1984
+ JS_FRIEND_API(JSBool)
1985
+ js_StopVtune(JSContext *cx, JSObject *obj,
1986
+ uintN argc, jsval *argv, jsval *rval)
1987
+ {
1988
+ U32 status = VTStopSampling(1);
1989
+ if (status) {
1990
+ if (status < sizeof(vtuneErrorMessages))
1991
+ JS_ReportError(cx, "Vtune shutdown error: %s",
1992
+ vtuneErrorMessages[status]);
1993
+ else
1994
+ JS_ReportError(cx, "Vtune shutdown error: %d",
1995
+ status);
1996
+ return JS_FALSE;
1997
+ }
1998
+ return JS_TRUE;
1999
+ }
2000
+
2001
+ JS_FRIEND_API(JSBool)
2002
+ js_PauseVtune(JSContext *cx, JSObject *obj,
2003
+ uintN argc, jsval *argv, jsval *rval)
2004
+ {
2005
+ VTPause();
2006
+ return JS_TRUE;
2007
+ }
2008
+
2009
+ JS_FRIEND_API(JSBool)
2010
+ js_ResumeVtune(JSContext *cx, JSObject *obj,
2011
+ uintN argc, jsval *argv, jsval *rval)
2012
+ {
2013
+ VTResume();
2014
+ return JS_TRUE;
2015
+ }
2016
+
2017
+ #endif /* MOZ_VTUNE */