johnson 1.2.0 → 2.0.0.pre0

Sign up to get free protection for your applications and to get access to all the features.
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,375 @@
1
+ /* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 4 -*- */
2
+ /* ***** BEGIN LICENSE BLOCK *****
3
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
+ *
5
+ * The contents of this file are subject to the Mozilla Public License Version
6
+ * 1.1 (the "License"); you may not use this file except in compliance with
7
+ * the License. You may obtain a copy of the License at
8
+ * http://www.mozilla.org/MPL/
9
+ *
10
+ * Software distributed under the License is distributed on an "AS IS" basis,
11
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
+ * for the specific language governing rights and limitations under the
13
+ * License.
14
+ *
15
+ * The Original Code is [Open Source Virtual Machine].
16
+ *
17
+ * The Initial Developer of the Original Code is
18
+ * Adobe System Incorporated.
19
+ * Portions created by the Initial Developer are Copyright (C) 2004-2007
20
+ * the Initial Developer. All Rights Reserved.
21
+ *
22
+ * Contributor(s):
23
+ * Adobe AS3 Team
24
+ *
25
+ * Alternatively, the contents of this file may be used under the terms of
26
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
27
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28
+ * in which case the provisions of the GPL or the LGPL are applicable instead
29
+ * of those above. If you wish to allow use of your version of this file only
30
+ * under the terms of either the GPL or the LGPL, and not to allow others to
31
+ * use your version of this file under the terms of the MPL, indicate your
32
+ * decision by deleting the provisions above and replace them with the notice
33
+ * and other provisions required by the GPL or the LGPL. If you do not delete
34
+ * the provisions above, a recipient may use your version of this file under
35
+ * the terms of any one of the MPL, the GPL or the LGPL.
36
+ *
37
+ * ***** END LICENSE BLOCK ***** */
38
+
39
+
40
+ #ifndef __nanojit_Assembler__
41
+ #define __nanojit_Assembler__
42
+
43
+
44
+ namespace nanojit
45
+ {
46
+ /**
47
+ * Some notes on this Assembler (Emitter).
48
+ *
49
+ * LIR_call is a generic call operation that is encoded using form [2]. The 24bit
50
+ * integer is used as an index into a function look-up table that contains information
51
+ * about the target that is to be called; including address, # parameters, etc.
52
+ *
53
+ * The class RegAlloc is essentially the register allocator from MIR
54
+ *
55
+ * The Assembler class parses the LIR instructions starting at any point and converts
56
+ * them to machine code. It does the translation using expression trees which are simply
57
+ * LIR instructions in the stream that have side-effects. Any other instruction in the
58
+ * stream is simply ignored.
59
+ * This approach is interesting in that dead code elimination occurs for 'free', strength
60
+ * reduction occurs fairly naturally, along with some other optimizations.
61
+ *
62
+ * A negative is that we require state as we 'push' and 'pop' nodes along the tree.
63
+ * Also, this is most easily performed using recursion which may not be desirable in
64
+ * the mobile environment.
65
+ *
66
+ */
67
+
68
+ #define STACK_GRANULARITY sizeof(void *)
69
+
70
+ /**
71
+ * The Assembler is only concerned with transforming LIR to native instructions
72
+ */
73
+ struct Reservation
74
+ {
75
+ uint32_t arIndex:16; /* index into stack frame. displ is -4*arIndex */
76
+ Register reg:15; /* register UnkownReg implies not in register */
77
+ uint32_t used:1;
78
+ };
79
+
80
+ struct AR
81
+ {
82
+ LIns* entry[ NJ_MAX_STACK_ENTRY ]; /* maps to 4B contiguous locations relative to the frame pointer */
83
+ uint32_t tos; /* current top of stack entry */
84
+ uint32_t highwatermark; /* max tos hit */
85
+ uint32_t lowwatermark; /* we pre-allocate entries from 0 upto this index-1; so dynamic entries are added above this index */
86
+ };
87
+
88
+ #ifdef AVMPLUS_WIN32
89
+ #define AVMPLUS_ALIGN16(type) __declspec(align(16)) type
90
+ #else
91
+ #define AVMPLUS_ALIGN16(type) type __attribute__ ((aligned (16)))
92
+ #endif
93
+
94
+ struct Stats
95
+ {
96
+ counter_define(steals;)
97
+ counter_define(remats;)
98
+ counter_define(spills;)
99
+ counter_define(native;)
100
+ counter_define(exitnative;)
101
+
102
+ int32_t pages;
103
+ NIns* codeStart;
104
+ NIns* codeExitStart;
105
+
106
+ DECLARE_PLATFORM_STATS()
107
+ #ifdef __GNUC__
108
+ // inexplicably, gnuc gives padding/alignment warnings without this. pacify it.
109
+ bool pad[4];
110
+ #endif
111
+ };
112
+
113
+ class Fragmento;
114
+
115
+ // error codes
116
+ enum AssmError
117
+ {
118
+ None = 0
119
+ ,OutOMem
120
+ ,StackFull
121
+ ,ResvFull
122
+ ,RegionFull
123
+ ,MaxLength
124
+ ,MaxExit
125
+ ,MaxXJump
126
+ ,UnknownPrim
127
+ ,UnknownBranch
128
+ };
129
+
130
+ typedef avmplus::List<NIns*, avmplus::LIST_NonGCObjects> NInsList;
131
+ typedef avmplus::SortedMap<LIns*,NIns*,avmplus::LIST_NonGCObjects> InsMap;
132
+ typedef avmplus::SortedMap<NIns*,LIns*,avmplus::LIST_NonGCObjects> NInsMap;
133
+
134
+ class LabelState MMGC_SUBCLASS_DECL
135
+ {
136
+ public:
137
+ RegAlloc regs;
138
+ NIns *addr;
139
+ LabelState(NIns *a, RegAlloc &r) : regs(r), addr(a)
140
+ {}
141
+ };
142
+
143
+ class LabelStateMap
144
+ {
145
+ avmplus::GC *gc;
146
+ avmplus::SortedMap<LIns*, LabelState*, avmplus::LIST_GCObjects> labels;
147
+ public:
148
+ LabelStateMap(avmplus::GC *gc) : gc(gc), labels(gc)
149
+ {}
150
+ ~LabelStateMap();
151
+
152
+ void clear();
153
+ void add(LIns *label, NIns *addr, RegAlloc &regs);
154
+ LabelState *get(LIns *);
155
+ };
156
+ /**
157
+ * Information about the activation record for the method is built up
158
+ * as we generate machine code. As part of the prologue, we issue
159
+ * a stack adjustment instruction and then later patch the adjustment
160
+ * value. Temporary values can be placed into the AR as method calls
161
+ * are issued. Also MIR_alloc instructions will consume space.
162
+ */
163
+ class Assembler MMGC_SUBCLASS_DECL
164
+ {
165
+ friend class DeadCodeFilter;
166
+ friend class VerboseBlockReader;
167
+ public:
168
+ #ifdef NJ_VERBOSE
169
+ static char outline[8192];
170
+ static char outlineEOL[512]; // string to be added to the end of the line
171
+ static char* outputAlign(char* s, int col);
172
+
173
+ void FASTCALL outputForEOL(const char* format, ...);
174
+ void FASTCALL output(const char* s);
175
+ void FASTCALL outputf(const char* format, ...);
176
+ void FASTCALL output_asm(const char* s);
177
+
178
+ bool _verbose, outputAddr, vpad[2]; // if outputAddr=true then next asm instr. will include address in output
179
+ void printActivationState();
180
+
181
+ StringList* _outputCache;
182
+ #endif
183
+
184
+ Assembler(Fragmento* frago);
185
+ ~Assembler() {}
186
+
187
+ void assemble(Fragment* frag, NInsList& loopJumps);
188
+ void endAssembly(Fragment* frag, NInsList& loopJumps);
189
+ void beginAssembly(Fragment *frag, RegAllocMap* map);
190
+ void copyRegisters(RegAlloc* copyTo);
191
+ void releaseRegisters();
192
+ void patch(GuardRecord *lr);
193
+ void patch(SideExit *exit);
194
+ #ifdef NANOJIT_IA32
195
+ void patch(SideExit* exit, SwitchInfo* si);
196
+ #endif
197
+ AssmError error() { return _err; }
198
+ void setError(AssmError e) { _err = e; }
199
+ void setCallTable(const CallInfo *functions);
200
+ void pageReset();
201
+ int32_t codeBytes();
202
+ Page* handoverPages(bool exitPages=false);
203
+
204
+ debug_only ( void pageValidate(); )
205
+ debug_only ( bool onPage(NIns* where, bool exitPages=false); )
206
+
207
+ // support calling out from a fragment ; used to debug the jit
208
+ debug_only( void resourceConsistencyCheck(); )
209
+ debug_only( void registerConsistencyCheck(); )
210
+
211
+ Stats _stats;
212
+ int hasLoop;
213
+
214
+ private:
215
+
216
+ void gen(LirFilter* toCompile, NInsList& loopJumps);
217
+ NIns* genPrologue();
218
+ NIns* genEpilogue();
219
+
220
+ uint32_t arReserve(LIns* l);
221
+ void arFree(uint32_t idx);
222
+ void arReset();
223
+
224
+ Register registerAlloc(RegisterMask allow);
225
+ void registerResetAll();
226
+ void evictRegs(RegisterMask regs);
227
+ void evictScratchRegs();
228
+ void intersectRegisterState(RegAlloc& saved);
229
+ void unionRegisterState(RegAlloc& saved);
230
+ void assignSaved(RegAlloc &saved, RegisterMask skip);
231
+ LInsp findVictim(RegAlloc& regs, RegisterMask allow);
232
+
233
+ Register getBaseReg(LIns *i, int &d, RegisterMask allow);
234
+ int findMemFor(LIns* i);
235
+ Register findRegFor(LIns* i, RegisterMask allow);
236
+ void findRegFor2(RegisterMask allow, LIns* ia, Reservation* &ra, LIns *ib, Reservation* &rb);
237
+ Register findSpecificRegFor(LIns* i, Register w);
238
+ Register prepResultReg(LIns *i, RegisterMask allow);
239
+ void freeRsrcOf(LIns *i, bool pop);
240
+ void evict(Register r);
241
+ RegisterMask hint(LIns*i, RegisterMask allow);
242
+
243
+ NIns* pageAlloc(bool exitPage=false);
244
+ void pagesFree(Page*& list);
245
+ void internalReset();
246
+ bool canRemat(LIns*);
247
+
248
+ Reservation* reserveAlloc(LInsp i);
249
+ void reserveFree(LInsp i);
250
+ void reserveReset();
251
+
252
+ Reservation* getresv(LIns *x) {
253
+ uint32_t resv_index = x->resv();
254
+ return resv_index ? &_resvTable[resv_index] : 0;
255
+ }
256
+
257
+ DWB(Fragmento*) _frago;
258
+ avmplus::GC* _gc;
259
+ DWB(Fragment*) _thisfrag;
260
+ RegAllocMap* _branchStateMap;
261
+
262
+ const CallInfo *_functions;
263
+
264
+ NIns* _nIns; // current native instruction
265
+ NIns* _nExitIns; // current instruction in exit fragment page
266
+ NIns* _startingIns; // starting location of code compilation for error handling
267
+ NIns* _epilogue;
268
+ Page* _nativePages; // list of NJ_PAGE_SIZE pages that have been alloc'd
269
+ Page* _nativeExitPages; // list of pages that have been allocated for exit code
270
+ AssmError _err; // 0 = means assemble() appears ok, otherwise it failed
271
+
272
+ AR _activation;
273
+ RegAlloc _allocator;
274
+
275
+ LabelStateMap _labels;
276
+ NInsMap _patches;
277
+ Reservation _resvTable[ NJ_MAX_STACK_ENTRY ]; // table where we house stack and register information
278
+ uint32_t _resvFree;
279
+ bool _inExit, vpad2[3];
280
+ InsList pending_lives;
281
+
282
+ void asm_cmp(LIns *cond);
283
+ void asm_fcmp(LIns *cond);
284
+ void asm_setcc(Register res, LIns *cond);
285
+ NIns * asm_jmpcc(bool brOnFalse, LIns *cond, NIns *target);
286
+ void asm_mmq(Register rd, int dd, Register rs, int ds);
287
+ NIns* asm_exit(LInsp guard);
288
+ NIns* asm_leave_trace(LInsp guard);
289
+ void asm_qjoin(LIns *ins);
290
+ void asm_store32(LIns *val, int d, LIns *base);
291
+ void asm_store64(LIns *val, int d, LIns *base);
292
+ void asm_restore(LInsp, Reservation*, Register);
293
+ void asm_load(int d, Register r);
294
+ void asm_spilli(LInsp i, Reservation *resv, bool pop);
295
+ void asm_spill(Register rr, int d, bool pop, bool quad);
296
+ void asm_load64(LInsp i);
297
+ void asm_pusharg(LInsp p);
298
+ void asm_quad(LInsp i);
299
+ void asm_loop(LInsp i, NInsList& loopJumps);
300
+ void asm_fcond(LInsp i);
301
+ void asm_cond(LInsp i);
302
+ void asm_arith(LInsp i);
303
+ void asm_neg_not(LInsp i);
304
+ void asm_ld(LInsp i);
305
+ void asm_cmov(LInsp i);
306
+ void asm_param(LInsp i);
307
+ void asm_int(LInsp i);
308
+ void asm_short(LInsp i);
309
+ void asm_qlo(LInsp i);
310
+ void asm_qhi(LInsp i);
311
+ void asm_fneg(LInsp ins);
312
+ void asm_fop(LInsp ins);
313
+ void asm_i2f(LInsp ins);
314
+ void asm_u2f(LInsp ins);
315
+ Register asm_prep_fcall(Reservation *rR, LInsp ins);
316
+ void asm_nongp_copy(Register r, Register s);
317
+ void asm_call(LInsp);
318
+ void asm_arg(ArgSize, LInsp, Register);
319
+ Register asm_binop_rhs_reg(LInsp ins);
320
+ NIns* asm_branch(bool branchOnFalse, LInsp cond, NIns* targ, bool isfar);
321
+ void asm_switch(LIns* ins, NIns* target);
322
+ void emitJumpTable(SwitchInfo* si, NIns* target);
323
+ void assignSavedRegs();
324
+ void reserveSavedRegs();
325
+ void assignParamRegs();
326
+ void handleLoopCarriedExprs();
327
+
328
+ // flag values for nMarkExecute
329
+ enum
330
+ {
331
+ PAGE_READ = 0x0, // here only for clarity: all permissions include READ
332
+ PAGE_WRITE = 0x01,
333
+ PAGE_EXEC = 0x02
334
+ };
335
+
336
+ // platform specific implementation (see NativeXXX.cpp file)
337
+ void nInit(AvmCore *);
338
+ Register nRegisterAllocFromSet(int32_t set);
339
+ void nRegisterResetAll(RegAlloc& a);
340
+ void nMarkExecute(Page* page, int flags);
341
+ void nFrameRestore(RegisterMask rmask);
342
+ NIns* nPatchBranch(NIns* branch, NIns* location);
343
+ void nFragExit(LIns* guard);
344
+
345
+ // platform specific methods
346
+ public:
347
+ const static Register savedRegs[NumSavedRegs];
348
+ DECLARE_PLATFORM_ASSEMBLER()
349
+
350
+ private:
351
+ debug_only( int32_t _fpuStkDepth; )
352
+ debug_only( int32_t _sv_fpuStkDepth; )
353
+
354
+ // since we generate backwards the depth is negative
355
+ inline void fpu_push() {
356
+ debug_only( ++_fpuStkDepth; /*char foo[8]= "FPUSTK0"; foo[6]-=_fpuStkDepth; output_asm(foo);*/ NanoAssert(_fpuStkDepth<=0); )
357
+ }
358
+ inline void fpu_pop() {
359
+ debug_only( --_fpuStkDepth; /*char foo[8]= "FPUSTK0"; foo[6]-=_fpuStkDepth; output_asm(foo);*/ NanoAssert(_fpuStkDepth<=0); )
360
+ }
361
+ #ifdef AVMPLUS_PORTING_API
362
+ // these pointers are required to store
363
+ // the address range where code has been
364
+ // modified so we can flush the instruction cache.
365
+ void* _endJit2Addr;
366
+ #endif // AVMPLUS_PORTING_API
367
+ avmplus::Config &config;
368
+ };
369
+
370
+ inline int32_t disp(Reservation* r)
371
+ {
372
+ return stack_direction((int32_t)STACK_GRANULARITY) * int32_t(r->arIndex) + NJ_STACK_OFFSET;
373
+ }
374
+ }
375
+ #endif // __nanojit_Assembler__
@@ -0,0 +1,651 @@
1
+ /* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 4 -*- */
2
+ /* ***** BEGIN LICENSE BLOCK *****
3
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
+ *
5
+ * The contents of this file are subject to the Mozilla Public License Version
6
+ * 1.1 (the "License"); you may not use this file except in compliance with
7
+ * the License. You may obtain a copy of the License at
8
+ * http://www.mozilla.org/MPL/
9
+ *
10
+ * Software distributed under the License is distributed on an "AS IS" basis,
11
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
+ * for the specific language governing rights and limitations under the
13
+ * License.
14
+ *
15
+ * The Original Code is [Open Source Virtual Machine].
16
+ *
17
+ * The Initial Developer of the Original Code is
18
+ * Adobe System Incorporated.
19
+ * Portions created by the Initial Developer are Copyright (C) 2004-2007
20
+ * the Initial Developer. All Rights Reserved.
21
+ *
22
+ * Contributor(s):
23
+ * Adobe AS3 Team
24
+ * Mozilla TraceMonkey Team
25
+ * Asko Tontti <atontti@cc.hut.fi>
26
+ *
27
+ * Alternatively, the contents of this file may be used under the terms of
28
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
29
+ * 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
+ #include "nanojit.h"
42
+ #undef MEMORY_INFO
43
+
44
+ namespace nanojit
45
+ {
46
+ #ifdef FEATURE_NANOJIT
47
+
48
+ using namespace avmplus;
49
+
50
+ static uint32_t calcSaneCacheSize(uint32_t in)
51
+ {
52
+ if (in < uint32_t(NJ_LOG2_PAGE_SIZE)) return NJ_LOG2_PAGE_SIZE; // at least 1 page
53
+ if (in > 32) return 32; // 4GB should be enough for anyone
54
+ return in;
55
+ }
56
+
57
+ /**
58
+ * This is the main control center for creating and managing fragments.
59
+ */
60
+ Fragmento::Fragmento(AvmCore* core, uint32_t cacheSizeLog2)
61
+ :
62
+ #ifdef NJ_VERBOSE
63
+ enterCounts(NULL),
64
+ mergeCounts(NULL),
65
+ labels(NULL),
66
+ #endif
67
+ _frags(core->GetGC()),
68
+ _freePages(core->GetGC(), 1024),
69
+ _allocList(core->GetGC()),
70
+ _gcHeap(NULL),
71
+ _max_pages(1 << (calcSaneCacheSize(cacheSizeLog2) - NJ_LOG2_PAGE_SIZE)),
72
+ _pagesGrowth(1)
73
+ {
74
+ #ifdef _DEBUG
75
+ {
76
+ // XXX These belong somewhere else, but I can't find the
77
+ // right location right now.
78
+ NanoStaticAssert((LIR_lt ^ 3) == LIR_ge);
79
+ NanoStaticAssert((LIR_le ^ 3) == LIR_gt);
80
+ NanoStaticAssert((LIR_ult ^ 3) == LIR_uge);
81
+ NanoStaticAssert((LIR_ule ^ 3) == LIR_ugt);
82
+ NanoStaticAssert((LIR_flt ^ 3) == LIR_fge);
83
+ NanoStaticAssert((LIR_fle ^ 3) == LIR_fgt);
84
+
85
+ /* Opcodes must be strictly increasing without holes. */
86
+ uint32_t count = 0;
87
+ #define OPDEF(op, number, operands) \
88
+ NanoAssertMsg(LIR_##op == count++, "misnumbered opcode");
89
+ #define OPDEF64(op, number, operands) OPDEF(op, number, operands)
90
+ #include "LIRopcode.tbl"
91
+ #undef OPDEF
92
+ #undef OPDEF64
93
+ }
94
+ #endif
95
+
96
+ #ifdef MEMORY_INFO
97
+ _allocList.set_meminfo_name("Fragmento._allocList");
98
+ #endif
99
+ NanoAssert(_max_pages > _pagesGrowth); // shrink growth if needed
100
+ _core = core;
101
+ GC *gc = core->GetGC();
102
+ _assm = NJ_NEW(gc, nanojit::Assembler)(this);
103
+ verbose_only( enterCounts = NJ_NEW(gc, BlockHist)(gc); )
104
+ verbose_only( mergeCounts = NJ_NEW(gc, BlockHist)(gc); )
105
+
106
+ memset(&_stats, 0, sizeof(_stats));
107
+ }
108
+
109
+ Fragmento::~Fragmento()
110
+ {
111
+ AllocEntry *entry;
112
+
113
+ clearFrags();
114
+ _frags.clear();
115
+ _freePages.clear();
116
+ while( _allocList.size() > 0 )
117
+ {
118
+ //fprintf(stderr,"dealloc %x\n", (intptr_t)_allocList.get(_allocList.size()-1));
119
+ #ifdef MEMORY_INFO
120
+ ChangeSizeExplicit("NanoJitMem", -1, _gcHeap->Size(_allocList.last()));
121
+ #endif
122
+ entry = _allocList.removeLast();
123
+ _gcHeap->Free( entry->page, entry->allocSize );
124
+ NJ_DELETE(entry);
125
+ }
126
+ NJ_DELETE(_assm);
127
+ #if defined(NJ_VERBOSE)
128
+ NJ_DELETE(enterCounts);
129
+ NJ_DELETE(mergeCounts);
130
+ #endif
131
+ }
132
+
133
+ void Fragmento::trackPages()
134
+ {
135
+ const uint32_t pageUse = _stats.pages - _freePages.size();
136
+ if (_stats.maxPageUse < pageUse)
137
+ _stats.maxPageUse = pageUse;
138
+ }
139
+
140
+ Page* Fragmento::pageAlloc()
141
+ {
142
+ NanoAssert(sizeof(Page) == NJ_PAGE_SIZE);
143
+ if (!_freePages.size()) {
144
+ pagesGrow(_pagesGrowth); // try to get more mem
145
+ if ((_pagesGrowth << 1) < _max_pages)
146
+ _pagesGrowth <<= 1;
147
+ }
148
+
149
+ trackPages();
150
+ Page* page = 0;
151
+ if (_freePages.size())
152
+ page = _freePages.removeLast();
153
+ return page;
154
+ }
155
+
156
+ void Fragmento::pagesRelease(PageList& l)
157
+ {
158
+ _freePages.add(l);
159
+ l.clear();
160
+ NanoAssert(_freePages.size() <= _stats.pages);
161
+ }
162
+
163
+ void Fragmento::pageFree(Page* page)
164
+ {
165
+ _freePages.add(page);
166
+ NanoAssert(_freePages.size() <= _stats.pages);
167
+ }
168
+
169
+ void Fragmento::pagesGrow(int32_t count)
170
+ {
171
+ NanoAssert(!_freePages.size());
172
+ MMGC_MEM_TYPE("NanojitFragmentoMem");
173
+ Page* memory = 0;
174
+ GC *gc = _core->GetGC();
175
+ if (_stats.pages < _max_pages)
176
+ {
177
+ AllocEntry *entry;
178
+
179
+ // make sure we don't grow beyond _max_pages
180
+ if (_stats.pages + count > _max_pages)
181
+ count = _max_pages - _stats.pages;
182
+ if (count < 0)
183
+ count = 0;
184
+ // @todo nastiness that needs a fix'n
185
+ _gcHeap = gc->GetGCHeap();
186
+ NanoAssert(int32_t(NJ_PAGE_SIZE)<=_gcHeap->kNativePageSize);
187
+
188
+ // convert _max_pages to gc page count
189
+ int32_t gcpages = (count*NJ_PAGE_SIZE) / _gcHeap->kNativePageSize;
190
+ MMGC_MEM_TYPE("NanoJitMem");
191
+ memory = (Page*)_gcHeap->Alloc(gcpages);
192
+ #ifdef MEMORY_INFO
193
+ ChangeSizeExplicit("NanoJitMem", 1, _gcHeap->Size(memory));
194
+ #endif
195
+ NanoAssert((int*)memory == pageTop(memory));
196
+ //fprintf(stderr,"head alloc of %d at %x of %d pages using nj page size of %d\n", gcpages, (intptr_t)memory, (intptr_t)_gcHeap->kNativePageSize, NJ_PAGE_SIZE);
197
+
198
+ entry = NJ_NEW(gc, AllocEntry);
199
+ entry->page = memory;
200
+ entry->allocSize = gcpages;
201
+ _allocList.add(entry);
202
+
203
+ _stats.pages += count;
204
+ Page* page = memory;
205
+ while(--count >= 0)
206
+ {
207
+ //fprintf(stderr,"Fragmento::pageGrow adding page %x ; %d\n", (unsigned)page, _freePages.size()+1);
208
+ _freePages.add(page++);
209
+ }
210
+ trackPages();
211
+ }
212
+ }
213
+
214
+ // Clear the fragment. This *does not* remove the fragment from the
215
+ // map--the caller must take care of this.
216
+ void Fragmento::clearFragment(Fragment* f)
217
+ {
218
+ Fragment *peer = f->peer;
219
+ while (peer) {
220
+ Fragment *next = peer->peer;
221
+ peer->releaseTreeMem(this);
222
+ NJ_DELETE(peer);
223
+ peer = next;
224
+ }
225
+ f->releaseTreeMem(this);
226
+ NJ_DELETE(f);
227
+ }
228
+
229
+ void Fragmento::clearFrag(const void* ip)
230
+ {
231
+ if (_frags.containsKey(ip)) {
232
+ clearFragment(_frags.remove(ip));
233
+ }
234
+ }
235
+
236
+ void Fragmento::clearFrags()
237
+ {
238
+ // reclaim any dangling native pages
239
+ _assm->pageReset();
240
+
241
+ while (!_frags.isEmpty()) {
242
+ clearFragment(_frags.removeLast());
243
+ }
244
+
245
+ verbose_only( enterCounts->clear();)
246
+ verbose_only( mergeCounts->clear();)
247
+ verbose_only( _stats.flushes++ );
248
+ verbose_only( _stats.compiles = 0 );
249
+ //fprintf(stderr, "Fragmento.clearFrags %d free pages of %d\n", _stats.freePages, _stats.pages);
250
+ }
251
+
252
+ Assembler* Fragmento::assm()
253
+ {
254
+ return _assm;
255
+ }
256
+
257
+ AvmCore* Fragmento::core()
258
+ {
259
+ return _core;
260
+ }
261
+
262
+ Fragment* Fragmento::getAnchor(const void* ip)
263
+ {
264
+ Fragment *f = newFrag(ip);
265
+ Fragment *p = _frags.get(ip);
266
+ if (p) {
267
+ f->first = p;
268
+ /* append at the end of the peer list */
269
+ Fragment* next;
270
+ while ((next = p->peer) != NULL)
271
+ p = next;
272
+ p->peer = f;
273
+ } else {
274
+ f->first = f;
275
+ _frags.put(ip, f); /* this is the first fragment */
276
+ }
277
+ f->anchor = f;
278
+ f->root = f;
279
+ f->kind = LoopTrace;
280
+ verbose_only( addLabel(f, "T", _frags.size()); )
281
+ return f;
282
+ }
283
+
284
+ Fragment* Fragmento::getLoop(const void* ip)
285
+ {
286
+ return _frags.get(ip);
287
+ }
288
+
289
+ #ifdef NJ_VERBOSE
290
+ void Fragmento::addLabel(Fragment *f, const char *prefix, int id)
291
+ {
292
+ char fragname[20];
293
+ sprintf(fragname,"%s%d", prefix, id);
294
+ labels->add(f, sizeof(Fragment), 0, fragname);
295
+ }
296
+ #endif
297
+
298
+ Fragment *Fragmento::getMerge(GuardRecord *lr, const void* ip)
299
+ {
300
+ Fragment *anchor = lr->exit->from->anchor;
301
+ for (Fragment *f = anchor->branches; f != 0; f = f->nextbranch) {
302
+ if (f->kind == MergeTrace && f->ip == ip /*&& f->calldepth == lr->calldepth*/) {
303
+ // found existing shared branch on anchor
304
+ return f;
305
+ }
306
+ }
307
+
308
+ Fragment *f = newBranch(anchor, ip);
309
+ f->root = f;
310
+ f->kind = MergeTrace;
311
+ verbose_only(
312
+ int mergeid = 1;
313
+ for (Fragment *g = anchor->branches; g != 0; g = g->nextbranch)
314
+ if (g->kind == MergeTrace)
315
+ mergeid++;
316
+ addLabel(f, "M", mergeid);
317
+ )
318
+ return f;
319
+ }
320
+
321
+ Fragment *Fragmento::createBranch(SideExit* exit, const void* ip)
322
+ {
323
+ Fragment *f = newBranch(exit->from, ip);
324
+ f->kind = BranchTrace;
325
+ f->treeBranches = f->root->treeBranches;
326
+ f->root->treeBranches = f;
327
+ return f;
328
+ }
329
+
330
+ #ifdef NJ_VERBOSE
331
+ struct fragstats {
332
+ int size;
333
+ uint64_t traceDur;
334
+ uint64_t interpDur;
335
+ int lir, lirbytes;
336
+ };
337
+
338
+ void Fragmento::dumpFragStats(Fragment *f, int level, fragstats &stat)
339
+ {
340
+ char buf[50];
341
+ sprintf(buf, "%*c%s", 1+level, ' ', labels->format(f));
342
+
343
+ int called = f->hits();
344
+ if (called >= 0)
345
+ called += f->_called;
346
+ else
347
+ called = -(1<<f->blacklistLevel) - called - 1;
348
+
349
+ uint32_t main = f->_native - f->_exitNative;
350
+
351
+ char cause[200];
352
+ if (f->_token && strcmp(f->_token,"loop")==0)
353
+ sprintf(cause,"%s %d", f->_token, f->xjumpCount);
354
+ else if (f->_token) {
355
+ if (f->eot_target) {
356
+ sprintf(cause,"%s %s", f->_token, labels->format(f->eot_target));
357
+ } else {
358
+ strcpy(cause, f->_token);
359
+ }
360
+ }
361
+ else
362
+ cause[0] = 0;
363
+
364
+ _assm->outputf("%-10s %7d %6d %6d %6d %4d %9llu %9llu %-12s %s", buf,
365
+ called, f->guardCount, main, f->_native, f->compileNbr, f->traceTicks/1000, f->interpTicks/1000,
366
+ cause, labels->format(f->ip));
367
+
368
+ stat.size += main;
369
+ stat.traceDur += f->traceTicks;
370
+ stat.interpDur += f->interpTicks;
371
+ stat.lir += f->_lir;
372
+ stat.lirbytes += f->_lirbytes;
373
+
374
+ for (Fragment *x = f->branches; x != 0; x = x->nextbranch)
375
+ if (x->kind != MergeTrace)
376
+ dumpFragStats(x,level+1,stat);
377
+ for (Fragment *x = f->branches; x != 0; x = x->nextbranch)
378
+ if (x->kind == MergeTrace)
379
+ dumpFragStats(x,level+1,stat);
380
+
381
+ if (f->isAnchor() && f->branches != 0) {
382
+ _assm->output("");
383
+ }
384
+ }
385
+
386
+ class DurData { public:
387
+ DurData(): frag(0), traceDur(0), interpDur(0), size(0) {}
388
+ DurData(int): frag(0), traceDur(0), interpDur(0), size(0) {}
389
+ DurData(Fragment* f, uint64_t td, uint64_t id, int32_t s)
390
+ : frag(f), traceDur(td), interpDur(id), size(s) {}
391
+ Fragment* frag;
392
+ uint64_t traceDur;
393
+ uint64_t interpDur;
394
+ int32_t size;
395
+ };
396
+
397
+ void Fragmento::dumpRatio(const char *label, BlockHist *hist)
398
+ {
399
+ int total=0, unique=0;
400
+ for (int i = 0, n=hist->size(); i < n; i++) {
401
+ const void * id = hist->keyAt(i);
402
+ int c = hist->get(id);
403
+ if (c > 1) {
404
+ //_assm->outputf("%d %X", c, id);
405
+ unique += 1;
406
+ }
407
+ else if (c == 1) {
408
+ unique += 1;
409
+ }
410
+ total += c;
411
+ }
412
+ _assm->outputf("%s total %d unique %d ratio %.1f%", label, total, unique, double(total)/unique);
413
+ }
414
+
415
+ void Fragmento::dumpStats()
416
+ {
417
+ bool vsave = _assm->_verbose;
418
+ _assm->_verbose = true;
419
+
420
+ _assm->output("");
421
+ dumpRatio("inline", enterCounts);
422
+ dumpRatio("merges", mergeCounts);
423
+ _assm->outputf("abc %d il %d (%.1fx) abc+il %d (%.1fx)",
424
+ _stats.abcsize, _stats.ilsize, (double)_stats.ilsize/_stats.abcsize,
425
+ _stats.abcsize + _stats.ilsize,
426
+ double(_stats.abcsize+_stats.ilsize)/_stats.abcsize);
427
+
428
+ int32_t count = _frags.size();
429
+ int32_t pages = _stats.pages;
430
+ int32_t maxPageUse = _stats.maxPageUse;
431
+ int32_t free = _freePages.size();
432
+ int32_t flushes = _stats.flushes;
433
+ if (!count)
434
+ {
435
+ _assm->outputf("No fragments in cache, %d flushes", flushes);
436
+ _assm->_verbose = vsave;
437
+ return;
438
+ }
439
+
440
+ _assm->outputf("\nFragment statistics");
441
+ _assm->outputf(" loop trees: %d", count);
442
+ _assm->outputf(" flushes: %d", flushes);
443
+ _assm->outputf(" compiles: %d / %d", _stats.compiles, _stats.totalCompiles);
444
+ _assm->outputf(" used: %dk / %dk", (pages-free)<<(NJ_LOG2_PAGE_SIZE-10), pages<<(NJ_LOG2_PAGE_SIZE-10));
445
+ _assm->outputf(" maxPageUse: %dk", (maxPageUse)<<(NJ_LOG2_PAGE_SIZE-10));
446
+ _assm->output("\ntrace calls guards main native gen T-trace T-interp");
447
+
448
+ avmplus::SortedMap<uint64_t, DurData, avmplus::LIST_NonGCObjects> durs(_core->gc);
449
+ uint64_t totaldur=0;
450
+ fragstats totalstat = { 0,0,0,0,0 };
451
+ for (int32_t i=0; i<count; i++)
452
+ {
453
+ Fragment *f = _frags.at(i);
454
+ while (true) {
455
+ fragstats stat = { 0,0,0,0,0 };
456
+ dumpFragStats(f, 0, stat);
457
+ if (stat.lir) {
458
+ totalstat.lir += stat.lir;
459
+ totalstat.lirbytes += stat.lirbytes;
460
+ }
461
+ uint64_t bothDur = stat.traceDur + stat.interpDur;
462
+ if (bothDur) {
463
+ totalstat.interpDur += stat.interpDur;
464
+ totalstat.traceDur += stat.traceDur;
465
+ totalstat.size += stat.size;
466
+ totaldur += bothDur;
467
+ while (durs.containsKey(bothDur)) bothDur++;
468
+ DurData d(f, stat.traceDur, stat.interpDur, stat.size);
469
+ durs.put(bothDur, d);
470
+ }
471
+ if (!f->peer)
472
+ break;
473
+ f = f->peer;
474
+ }
475
+ }
476
+ uint64_t totaltrace = totalstat.traceDur;
477
+ int totalsize = totalstat.size;
478
+
479
+ _assm->outputf("");
480
+ _assm->outputf("lirbytes %d / lir %d = %.1f bytes/lir", totalstat.lirbytes,
481
+ totalstat.lir, double(totalstat.lirbytes)/totalstat.lir);
482
+ _assm->outputf(" trace interp");
483
+ _assm->outputf("%9lld (%2d%%) %9lld (%2d%%)",
484
+ totaltrace/1000, int(100.0*totaltrace/totaldur),
485
+ (totaldur-totaltrace)/1000, int(100.0*(totaldur-totaltrace)/totaldur));
486
+ _assm->outputf("");
487
+ _assm->outputf("trace ticks trace interp size");
488
+ for (int32_t i=durs.size()-1; i >= 0; i--) {
489
+ uint64_t bothDur = durs.keyAt(i);
490
+ DurData d = durs.get(bothDur);
491
+ int size = d.size;
492
+ _assm->outputf("%-4s %9lld (%2d%%) %9lld (%2d%%) %9lld (%2d%%) %6d (%2d%%) %s",
493
+ labels->format(d.frag),
494
+ bothDur/1000, int(100.0*bothDur/totaldur),
495
+ d.traceDur/1000, int(100.0*d.traceDur/totaldur),
496
+ d.interpDur/1000, int(100.0*d.interpDur/totaldur),
497
+ size, int(100.0*size/totalsize),
498
+ labels->format(d.frag->ip));
499
+ }
500
+
501
+ _assm->_verbose = vsave;
502
+
503
+ }
504
+
505
+ void Fragmento::countBlock(BlockHist *hist, const void* ip)
506
+ {
507
+ int c = hist->count(ip);
508
+ if (_assm->_verbose)
509
+ _assm->outputf("++ %s %d", labels->format(ip), c);
510
+ }
511
+
512
+ void Fragmento::countIL(uint32_t il, uint32_t abc)
513
+ {
514
+ _stats.ilsize += il;
515
+ _stats.abcsize += abc;
516
+ }
517
+
518
+ #ifdef AVMPLUS_VERBOSE
519
+ void Fragmento::drawTrees(char *fileName) {
520
+ drawTraceTrees(this, this->_frags, this->_core, fileName);
521
+ }
522
+ #endif
523
+ #endif // NJ_VERBOSE
524
+
525
+ //
526
+ // Fragment
527
+ //
528
+ Fragment::Fragment(const void* _ip)
529
+ :
530
+ #ifdef NJ_VERBOSE
531
+ _called(0),
532
+ _native(0),
533
+ _exitNative(0),
534
+ _lir(0),
535
+ _lirbytes(0),
536
+ _token(NULL),
537
+ traceTicks(0),
538
+ interpTicks(0),
539
+ eot_target(NULL),
540
+ sid(0),
541
+ compileNbr(0),
542
+ #endif
543
+ treeBranches(NULL),
544
+ branches(NULL),
545
+ nextbranch(NULL),
546
+ anchor(NULL),
547
+ root(NULL),
548
+ parent(NULL),
549
+ first(NULL),
550
+ peer(NULL),
551
+ lirbuf(NULL),
552
+ lastIns(NULL),
553
+ spawnedFrom(NULL),
554
+ kind(LoopTrace),
555
+ ip(_ip),
556
+ guardCount(0),
557
+ xjumpCount(0),
558
+ recordAttempts(0),
559
+ blacklistLevel(0),
560
+ fragEntry(NULL),
561
+ loopEntry(NULL),
562
+ vmprivate(NULL),
563
+ _code(NULL),
564
+ _links(NULL),
565
+ _hits(0),
566
+ _pages(NULL)
567
+ {
568
+ }
569
+
570
+ Fragment::~Fragment()
571
+ {
572
+ onDestroy();
573
+ NanoAssert(_pages == 0);
574
+ }
575
+
576
+ void Fragment::resetHits()
577
+ {
578
+ blacklistLevel >>= 1;
579
+ _hits = 0;
580
+ }
581
+
582
+ void Fragment::blacklist()
583
+ {
584
+ blacklistLevel++;
585
+ _hits = -(1<<blacklistLevel);
586
+ }
587
+
588
+ Fragment *Fragmento::newFrag(const void* ip)
589
+ {
590
+ GC *gc = _core->gc;
591
+ Fragment *f = NJ_NEW(gc, Fragment)(ip);
592
+ f->blacklistLevel = 5;
593
+ return f;
594
+ }
595
+
596
+ Fragment *Fragmento::newBranch(Fragment *from, const void* ip)
597
+ {
598
+ Fragment *f = newFrag(ip);
599
+ f->anchor = from->anchor;
600
+ f->root = from->root;
601
+ f->xjumpCount = from->xjumpCount;
602
+ /*// prepend
603
+ f->nextbranch = from->branches;
604
+ from->branches = f;*/
605
+ // append
606
+ if (!from->branches) {
607
+ from->branches = f;
608
+ } else {
609
+ Fragment *p = from->branches;
610
+ while (p->nextbranch != 0)
611
+ p = p->nextbranch;
612
+ p->nextbranch = f;
613
+ }
614
+ return f;
615
+ }
616
+
617
+ void Fragment::releaseLirBuffer()
618
+ {
619
+ lastIns = 0;
620
+ }
621
+
622
+ void Fragment::releaseCode(Fragmento* frago)
623
+ {
624
+ _code = 0;
625
+ while(_pages)
626
+ {
627
+ Page* next = _pages->next;
628
+ frago->pageFree(_pages);
629
+ _pages = next;
630
+ }
631
+ }
632
+
633
+ void Fragment::releaseTreeMem(Fragmento* frago)
634
+ {
635
+ releaseLirBuffer();
636
+ releaseCode(frago);
637
+
638
+ // now do it for all branches
639
+ Fragment* branch = branches;
640
+ while(branch)
641
+ {
642
+ Fragment* next = branch->nextbranch;
643
+ branch->releaseTreeMem(frago); // @todo safer here to recurse in case we support nested trees
644
+ NJ_DELETE(branch);
645
+ branch = next;
646
+ }
647
+ }
648
+ #endif /* FEATURE_NANOJIT */
649
+ }
650
+
651
+