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,289 @@
1
+ /*
2
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
3
+ * Digest Algorithm, as defined in RFC 1321.
4
+ * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
5
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
6
+ * Distributed under the BSD License
7
+ * See http://pajhome.org.uk/crypt/md5 for more info.
8
+ */
9
+
10
+ /*
11
+ * Configurable variables. You may need to tweak these to be compatible with
12
+ * the server-side, but the defaults work in most cases.
13
+ */
14
+ var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
15
+ var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
16
+ var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
17
+
18
+ /*
19
+ * These are the functions you'll usually want to call
20
+ * They take string arguments and return either hex or base-64 encoded strings
21
+ */
22
+ function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
23
+ function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
24
+ function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
25
+ function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
26
+ function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
27
+ function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
28
+
29
+ /*
30
+ * Perform a simple self-test to see if the VM is working
31
+ */
32
+ function md5_vm_test()
33
+ {
34
+ return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
35
+ }
36
+
37
+ /*
38
+ * Calculate the MD5 of an array of little-endian words, and a bit length
39
+ */
40
+ function core_md5(x, len)
41
+ {
42
+ /* append padding */
43
+ x[len >> 5] |= 0x80 << ((len) % 32);
44
+ x[(((len + 64) >>> 9) << 4) + 14] = len;
45
+
46
+ var a = 1732584193;
47
+ var b = -271733879;
48
+ var c = -1732584194;
49
+ var d = 271733878;
50
+
51
+ for(var i = 0; i < x.length; i += 16)
52
+ {
53
+ var olda = a;
54
+ var oldb = b;
55
+ var oldc = c;
56
+ var oldd = d;
57
+
58
+ a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
59
+ d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
60
+ c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
61
+ b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
62
+ a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
63
+ d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
64
+ c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
65
+ b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
66
+ a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
67
+ d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
68
+ c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
69
+ b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
70
+ a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
71
+ d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
72
+ c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
73
+ b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
74
+
75
+ a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
76
+ d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
77
+ c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
78
+ b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
79
+ a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
80
+ d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
81
+ c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
82
+ b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
83
+ a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
84
+ d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
85
+ c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
86
+ b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
87
+ a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
88
+ d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
89
+ c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
90
+ b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
91
+
92
+ a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
93
+ d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
94
+ c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
95
+ b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
96
+ a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
97
+ d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
98
+ c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
99
+ b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
100
+ a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
101
+ d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
102
+ c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
103
+ b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
104
+ a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
105
+ d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
106
+ c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
107
+ b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
108
+
109
+ a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
110
+ d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
111
+ c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
112
+ b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
113
+ a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
114
+ d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
115
+ c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
116
+ b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
117
+ a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
118
+ d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
119
+ c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
120
+ b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
121
+ a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
122
+ d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
123
+ c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
124
+ b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
125
+
126
+ a = safe_add(a, olda);
127
+ b = safe_add(b, oldb);
128
+ c = safe_add(c, oldc);
129
+ d = safe_add(d, oldd);
130
+ }
131
+ return Array(a, b, c, d);
132
+
133
+ }
134
+
135
+ /*
136
+ * These functions implement the four basic operations the algorithm uses.
137
+ */
138
+ function md5_cmn(q, a, b, x, s, t)
139
+ {
140
+ return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
141
+ }
142
+ function md5_ff(a, b, c, d, x, s, t)
143
+ {
144
+ return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
145
+ }
146
+ function md5_gg(a, b, c, d, x, s, t)
147
+ {
148
+ return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
149
+ }
150
+ function md5_hh(a, b, c, d, x, s, t)
151
+ {
152
+ return md5_cmn(b ^ c ^ d, a, b, x, s, t);
153
+ }
154
+ function md5_ii(a, b, c, d, x, s, t)
155
+ {
156
+ return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
157
+ }
158
+
159
+ /*
160
+ * Calculate the HMAC-MD5, of a key and some data
161
+ */
162
+ function core_hmac_md5(key, data)
163
+ {
164
+ var bkey = str2binl(key);
165
+ if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
166
+
167
+ var ipad = Array(16), opad = Array(16);
168
+ for(var i = 0; i < 16; i++)
169
+ {
170
+ ipad[i] = bkey[i] ^ 0x36363636;
171
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
172
+ }
173
+
174
+ var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
175
+ return core_md5(opad.concat(hash), 512 + 128);
176
+ }
177
+
178
+ /*
179
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
180
+ * to work around bugs in some JS interpreters.
181
+ */
182
+ function safe_add(x, y)
183
+ {
184
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
185
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
186
+ return (msw << 16) | (lsw & 0xFFFF);
187
+ }
188
+
189
+ /*
190
+ * Bitwise rotate a 32-bit number to the left.
191
+ */
192
+ function bit_rol(num, cnt)
193
+ {
194
+ return (num << cnt) | (num >>> (32 - cnt));
195
+ }
196
+
197
+ /*
198
+ * Convert a string to an array of little-endian words
199
+ * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
200
+ */
201
+ function str2binl(str)
202
+ {
203
+ var bin = Array();
204
+ var mask = (1 << chrsz) - 1;
205
+ for(var i = 0; i < str.length * chrsz; i += chrsz)
206
+ bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
207
+ return bin;
208
+ }
209
+
210
+ /*
211
+ * Convert an array of little-endian words to a string
212
+ */
213
+ function binl2str(bin)
214
+ {
215
+ var str = "";
216
+ var mask = (1 << chrsz) - 1;
217
+ for(var i = 0; i < bin.length * 32; i += chrsz)
218
+ str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
219
+ return str;
220
+ }
221
+
222
+ /*
223
+ * Convert an array of little-endian words to a hex string.
224
+ */
225
+ function binl2hex(binarray)
226
+ {
227
+ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
228
+ var str = "";
229
+ for(var i = 0; i < binarray.length * 4; i++)
230
+ {
231
+ str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
232
+ hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
233
+ }
234
+ return str;
235
+ }
236
+
237
+ /*
238
+ * Convert an array of little-endian words to a base-64 string
239
+ */
240
+ function binl2b64(binarray)
241
+ {
242
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
243
+ var str = "";
244
+ for(var i = 0; i < binarray.length * 4; i += 3)
245
+ {
246
+ var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
247
+ | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
248
+ | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
249
+ for(var j = 0; j < 4; j++)
250
+ {
251
+ if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
252
+ else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
253
+ }
254
+ }
255
+ return str;
256
+ }
257
+
258
+ var plainText = "Rebellious subjects, enemies to peace,\n\
259
+ Profaners of this neighbour-stained steel,--\n\
260
+ Will they not hear? What, ho! you men, you beasts,\n\
261
+ That quench the fire of your pernicious rage\n\
262
+ With purple fountains issuing from your veins,\n\
263
+ On pain of torture, from those bloody hands\n\
264
+ Throw your mistemper'd weapons to the ground,\n\
265
+ And hear the sentence of your moved prince.\n\
266
+ Three civil brawls, bred of an airy word,\n\
267
+ By thee, old Capulet, and Montague,\n\
268
+ Have thrice disturb'd the quiet of our streets,\n\
269
+ And made Verona's ancient citizens\n\
270
+ Cast by their grave beseeming ornaments,\n\
271
+ To wield old partisans, in hands as old,\n\
272
+ Canker'd with peace, to part your canker'd hate:\n\
273
+ If ever you disturb our streets again,\n\
274
+ Your lives shall pay the forfeit of the peace.\n\
275
+ For this time, all the rest depart away:\n\
276
+ You Capulet; shall go along with me:\n\
277
+ And, Montague, come you this afternoon,\n\
278
+ To know our further pleasure in this case,\n\
279
+ To old Free-town, our common judgment-place.\n\
280
+ Once more, on pain of death, all men depart."
281
+
282
+ for (var i = 0; i <4; i++) {
283
+ plainText += plainText;
284
+ }
285
+
286
+ connectShark();
287
+ startShark();
288
+ var md5Output = hex_md5(plainText);
289
+ stopShark();
@@ -0,0 +1,1984 @@
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
+ #include "nanojit.h"
40
+
41
+ #ifdef FEATURE_NANOJIT
42
+
43
+ #ifdef AVMPLUS_PORTING_API
44
+ #include "portapi_nanojit.h"
45
+ #endif
46
+
47
+ #if defined(AVMPLUS_UNIX) && defined(AVMPLUS_ARM)
48
+ #include <asm/unistd.h>
49
+ extern "C" void __clear_cache(char *BEG, char *END);
50
+ #endif
51
+
52
+ #ifdef AVMPLUS_SPARC
53
+ extern "C" void sync_instruction_memory(caddr_t v, u_int len);
54
+ #endif
55
+
56
+ namespace nanojit
57
+ {
58
+ int UseSoftfloat = 0;
59
+
60
+ class DeadCodeFilter: public LirFilter
61
+ {
62
+ const CallInfo *functions;
63
+
64
+ bool ignoreInstruction(LInsp ins)
65
+ {
66
+ LOpcode op = ins->opcode();
67
+ if (ins->isStore() ||
68
+ op == LIR_loop ||
69
+ op == LIR_label ||
70
+ op == LIR_live ||
71
+ isRet(op)) {
72
+ return false;
73
+ }
74
+ return ins->resv() == 0;
75
+ }
76
+
77
+ public:
78
+ DeadCodeFilter(LirFilter *in, const CallInfo *f) : LirFilter(in), functions(f) {}
79
+ LInsp read() {
80
+ for (;;) {
81
+ LInsp i = in->read();
82
+ if (!i || i->isGuard() || i->isBranch()
83
+ || (i->isCall() && !i->isCse(functions))
84
+ || !ignoreInstruction(i))
85
+ return i;
86
+ }
87
+ }
88
+ };
89
+
90
+ #ifdef NJ_VERBOSE
91
+ class VerboseBlockReader: public LirFilter
92
+ {
93
+ Assembler *assm;
94
+ LirNameMap *names;
95
+ InsList block;
96
+ bool flushnext;
97
+ public:
98
+ VerboseBlockReader(LirFilter *in, Assembler *a, LirNameMap *n)
99
+ : LirFilter(in), assm(a), names(n), block(a->_gc), flushnext(false)
100
+ {}
101
+
102
+ void flush() {
103
+ flushnext = false;
104
+ if (!block.isEmpty()) {
105
+ for (int j=0,n=block.size(); j < n; j++) {
106
+ LIns *i = block[j];
107
+ assm->outputf(" %s", names->formatIns(i));
108
+ }
109
+ block.clear();
110
+ }
111
+ }
112
+
113
+ void flush_add(LInsp i) {
114
+ flush();
115
+ block.add(i);
116
+ }
117
+
118
+ LInsp read() {
119
+ LInsp i = in->read();
120
+ if (!i) {
121
+ flush();
122
+ return i;
123
+ }
124
+ if (i->isGuard()) {
125
+ flush_add(i);
126
+ if (i->oprnd1())
127
+ block.add(i->oprnd1());
128
+ }
129
+ else if (isRet(i->opcode()) || i->isBranch()) {
130
+ flush_add(i);
131
+ }
132
+ else {
133
+ if (flushnext)
134
+ flush();
135
+ block.add(i);//flush_add(i);
136
+ if (i->isop(LIR_label))
137
+ flushnext = true;
138
+ }
139
+ return i;
140
+ }
141
+ };
142
+ #endif
143
+
144
+ /**
145
+ * Need the following:
146
+ *
147
+ * - merging paths ( build a graph? ), possibly use external rep to drive codegen
148
+ */
149
+ Assembler::Assembler(Fragmento* frago)
150
+ : hasLoop(0)
151
+ , _frago(frago)
152
+ , _gc(frago->core()->gc)
153
+ , _labels(_gc)
154
+ , _patches(_gc)
155
+ , pending_lives(_gc)
156
+ , config(frago->core()->config)
157
+ {
158
+ AvmCore *core = frago->core();
159
+ nInit(core);
160
+ verbose_only( _verbose = !core->quiet_opt() && core->verbose() );
161
+ verbose_only( _outputCache = 0);
162
+ verbose_only( outlineEOL[0] = '\0');
163
+
164
+ internalReset();
165
+ pageReset();
166
+ }
167
+
168
+ void Assembler::arReset()
169
+ {
170
+ _activation.highwatermark = 0;
171
+ _activation.lowwatermark = 0;
172
+ _activation.tos = 0;
173
+
174
+ for(uint32_t i=0; i<NJ_MAX_STACK_ENTRY; i++)
175
+ _activation.entry[i] = 0;
176
+ }
177
+
178
+ void Assembler::registerResetAll()
179
+ {
180
+ nRegisterResetAll(_allocator);
181
+
182
+ // keep a tally of the registers to check that our allocator works correctly
183
+ debug_only(_allocator.count = _allocator.countFree(); )
184
+ debug_only(_allocator.checkCount(); )
185
+ debug_only(_fpuStkDepth = 0; )
186
+ }
187
+
188
+ Register Assembler::registerAlloc(RegisterMask allow)
189
+ {
190
+ RegAlloc &regs = _allocator;
191
+ // RegisterMask prefer = livePastCall(_ins) ? saved : scratch;
192
+ RegisterMask prefer = SavedRegs & allow;
193
+ RegisterMask free = regs.free & allow;
194
+
195
+ RegisterMask set = prefer;
196
+ if (set == 0) set = allow;
197
+
198
+ if (free)
199
+ {
200
+ // at least one is free
201
+ set &= free;
202
+
203
+ // ok we have at least 1 free register so let's try to pick
204
+ // the best one given the profile of the instruction
205
+ if (!set)
206
+ {
207
+ // desired register class is not free so pick first of any class
208
+ set = free;
209
+ }
210
+ NanoAssert((set & allow) != 0);
211
+ Register r = nRegisterAllocFromSet(set);
212
+ regs.used |= rmask(r);
213
+ return r;
214
+ }
215
+ counter_increment(steals);
216
+
217
+ // nothing free, steal one
218
+ // LSRA says pick the one with the furthest use
219
+ LIns* vic = findVictim(regs, allow);
220
+ NanoAssert(vic != NULL);
221
+
222
+ Reservation* resv = getresv(vic);
223
+
224
+ // restore vic
225
+ Register r = resv->reg;
226
+ regs.removeActive(r);
227
+ resv->reg = UnknownReg;
228
+
229
+ asm_restore(vic, resv, r);
230
+ return r;
231
+ }
232
+
233
+ void Assembler::reserveReset()
234
+ {
235
+ _resvTable[0].arIndex = 0;
236
+ int i;
237
+ for(i=1; i<NJ_MAX_STACK_ENTRY; i++) {
238
+ _resvTable[i].arIndex = i-1;
239
+ _resvTable[i].used = 0;
240
+ }
241
+ _resvFree= i-1;
242
+ }
243
+
244
+ /**
245
+ * these instructions don't have to be saved & reloaded to spill,
246
+ * they can just be recalculated w/out any inputs.
247
+ */
248
+ bool Assembler::canRemat(LIns *i) {
249
+ return i->isconst() || i->isconstq() || i->isop(LIR_alloc);
250
+ }
251
+
252
+ Reservation* Assembler::reserveAlloc(LInsp i)
253
+ {
254
+ uint32_t item = _resvFree;
255
+ /* If there are no free reservations, mark the table as full and re-use an index.
256
+ * This will clobber that reservation, but the error will be caught as soon as
257
+ * the current LIR instruction returns back to gen().
258
+ */
259
+ if (!item) {
260
+ setError(ResvFull);
261
+ item = 1;
262
+ }
263
+ Reservation *r = &_resvTable[item];
264
+ _resvFree = r->arIndex;
265
+ r->reg = UnknownReg;
266
+ r->arIndex = 0;
267
+ r->used = 1;
268
+ i->setresv(item);
269
+ return r;
270
+ }
271
+
272
+ void Assembler::reserveFree(LInsp i)
273
+ {
274
+ Reservation *rs = getresv(i);
275
+ NanoAssert(rs == &_resvTable[i->resv()]);
276
+ rs->arIndex = _resvFree;
277
+ rs->used = 0;
278
+ _resvFree = i->resv();
279
+ i->setresv(0);
280
+ }
281
+
282
+ void Assembler::internalReset()
283
+ {
284
+ // readies for a brand spanking new code generation pass.
285
+ registerResetAll();
286
+ reserveReset();
287
+ arReset();
288
+ pending_lives.clear();
289
+ }
290
+
291
+ NIns* Assembler::pageAlloc(bool exitPage)
292
+ {
293
+ Page*& list = (exitPage) ? _nativeExitPages : _nativePages;
294
+ Page* page = _frago->pageAlloc();
295
+ if (page)
296
+ {
297
+ page->next = list;
298
+ list = page;
299
+ nMarkExecute(page, PAGE_READ|PAGE_WRITE|PAGE_EXEC);
300
+ _stats.pages++;
301
+ }
302
+ else
303
+ {
304
+ // return a location that is 'safe' to write to while we are out of mem
305
+ setError(OutOMem);
306
+ return _startingIns;
307
+ }
308
+ return &page->code[sizeof(page->code)/sizeof(NIns)]; // just past the end
309
+ }
310
+
311
+ void Assembler::pageReset()
312
+ {
313
+ pagesFree(_nativePages);
314
+ pagesFree(_nativeExitPages);
315
+
316
+ _nIns = 0;
317
+ _nExitIns = 0;
318
+ _startingIns = 0;
319
+ _stats.pages = 0;
320
+
321
+ nativePageReset();
322
+ }
323
+
324
+ void Assembler::pagesFree(Page*& page)
325
+ {
326
+ while(page)
327
+ {
328
+ Page *next = page->next; // pull next ptr prior to free
329
+ _frago->pageFree(page);
330
+ page = next;
331
+ }
332
+ }
333
+
334
+ #define bytesFromTop(x) ( (size_t)(x) - (size_t)pageTop(x) )
335
+ #define bytesToBottom(x) ( (size_t)pageBottom(x) - (size_t)(x) )
336
+ #define bytesBetween(x,y) ( (size_t)(x) - (size_t)(y) )
337
+
338
+ int32_t Assembler::codeBytes()
339
+ {
340
+ // start and end on same page?
341
+ size_t exit = 0;
342
+ int32_t pages = _stats.pages;
343
+ if (_nExitIns-1 == _stats.codeExitStart)
344
+ ;
345
+ else if (samepage(_nExitIns,_stats.codeExitStart))
346
+ exit = bytesBetween(_stats.codeExitStart, _nExitIns);
347
+ else
348
+ {
349
+ pages--;
350
+ exit = ((intptr_t)_stats.codeExitStart & (NJ_PAGE_SIZE-1)) ? bytesFromTop(_stats.codeExitStart)+1 : 0;
351
+ exit += bytesToBottom(_nExitIns)+1;
352
+ }
353
+
354
+ size_t main = 0;
355
+ if (_nIns-1 == _stats.codeStart)
356
+ ;
357
+ else if (samepage(_nIns,_stats.codeStart))
358
+ main = bytesBetween(_stats.codeStart, _nIns);
359
+ else
360
+ {
361
+ pages--;
362
+ main = ((intptr_t)_stats.codeStart & (NJ_PAGE_SIZE-1)) ? bytesFromTop(_stats.codeStart)+1 : 0;
363
+ main += bytesToBottom(_nIns)+1;
364
+ }
365
+ //fprintf(stderr,"size %d, exit is %d, main is %d, page count %d, sizeof %d\n", (int)((pages) * NJ_PAGE_SIZE + main + exit),(int)exit, (int)main, (int)_stats.pages, (int)sizeof(Page));
366
+ return (pages) * NJ_PAGE_SIZE + main + exit;
367
+ }
368
+
369
+ #undef bytesFromTop
370
+ #undef bytesToBottom
371
+ #undef byteBetween
372
+
373
+ Page* Assembler::handoverPages(bool exitPages)
374
+ {
375
+ Page*& list = (exitPages) ? _nativeExitPages : _nativePages;
376
+ NIns*& ins = (exitPages) ? _nExitIns : _nIns;
377
+ Page* start = list;
378
+ list = 0;
379
+ ins = 0;
380
+ return start;
381
+ }
382
+
383
+ #ifdef _DEBUG
384
+ bool Assembler::onPage(NIns* where, bool exitPages)
385
+ {
386
+ Page* page = (exitPages) ? _nativeExitPages : _nativePages;
387
+ bool on = false;
388
+ while(page)
389
+ {
390
+ if (samepage(where-1,page))
391
+ on = true;
392
+ page = page->next;
393
+ }
394
+ return on;
395
+ }
396
+
397
+ void Assembler::pageValidate()
398
+ {
399
+ if (error()) return;
400
+ // _nIns and _nExitIns need to be at least on
401
+ // one of these pages
402
+ NanoAssertMsg( onPage(_nIns)&& onPage(_nExitIns,true), "Native instruction pointer overstep paging bounds; check overrideProtect for last instruction");
403
+ }
404
+ #endif
405
+
406
+ #ifdef _DEBUG
407
+
408
+ void Assembler::resourceConsistencyCheck()
409
+ {
410
+ if (error()) return;
411
+
412
+ #ifdef NANOJIT_IA32
413
+ NanoAssert((_allocator.active[FST0] && _fpuStkDepth == -1) ||
414
+ (!_allocator.active[FST0] && _fpuStkDepth == 0));
415
+ #endif
416
+
417
+ AR &ar = _activation;
418
+ // check AR entries
419
+ NanoAssert(ar.highwatermark < NJ_MAX_STACK_ENTRY);
420
+ LIns* ins = 0;
421
+ RegAlloc* regs = &_allocator;
422
+ for(uint32_t i = ar.lowwatermark; i < ar.tos; i++)
423
+ {
424
+ ins = ar.entry[i];
425
+ if ( !ins )
426
+ continue;
427
+ Reservation *r = getresv(ins);
428
+ NanoAssert(r != 0);
429
+ int32_t idx = r - _resvTable;
430
+ NanoAssertMsg(idx, "MUST have a resource for the instruction for it to have a stack location assigned to it");
431
+ if (r->arIndex) {
432
+ if (ins->isop(LIR_alloc)) {
433
+ int j=i+1;
434
+ for (int n = i + (ins->size()>>2); j < n; j++) {
435
+ NanoAssert(ar.entry[j]==ins);
436
+ }
437
+ NanoAssert(r->arIndex == (uint32_t)j-1);
438
+ i = j-1;
439
+ }
440
+ else if (ins->isQuad()) {
441
+ NanoAssert(ar.entry[i - stack_direction(1)]==ins);
442
+ i += 1; // skip high word
443
+ }
444
+ else {
445
+ NanoAssertMsg(r->arIndex == i, "Stack record index mismatch");
446
+ }
447
+ }
448
+ NanoAssertMsg( r->reg==UnknownReg || regs->isConsistent(r->reg,ins), "Register record mismatch");
449
+ }
450
+
451
+ registerConsistencyCheck();
452
+
453
+ // check resv table
454
+ int32_t inuseCount = 0;
455
+ int32_t notInuseCount = 0;
456
+ for(uint32_t i=1; i < sizeof(_resvTable)/sizeof(_resvTable[0]); i++) {
457
+ _resvTable[i].used ? inuseCount++ : notInuseCount++;
458
+ }
459
+
460
+ int32_t freeCount = 0;
461
+ uint32_t free = _resvFree;
462
+ while(free) {
463
+ free = _resvTable[free].arIndex;
464
+ freeCount++;
465
+ }
466
+ NanoAssert( ( freeCount==notInuseCount && inuseCount+notInuseCount==(NJ_MAX_STACK_ENTRY-1) ) );
467
+ }
468
+
469
+ void Assembler::registerConsistencyCheck()
470
+ {
471
+ // check registers
472
+ RegAlloc *regs = &_allocator;
473
+ uint32_t managed = regs->managed;
474
+ Register r = FirstReg;
475
+ while(managed)
476
+ {
477
+ if (managed&1)
478
+ {
479
+ if (regs->isFree(r))
480
+ {
481
+ NanoAssert(regs->getActive(r)==0);
482
+ }
483
+ else
484
+ {
485
+ LIns* ins = regs->getActive(r);
486
+ // @todo we should be able to check across RegAlloc's somehow (to include savedGP...)
487
+ Reservation *v = getresv(ins);
488
+ NanoAssert(v != 0);
489
+ int32_t idx = v - _resvTable;
490
+ NanoAssert(idx >= 0 && idx < NJ_MAX_STACK_ENTRY);
491
+ NanoAssertMsg(idx, "MUST have a resource for the instruction for it to have a register assigned to it");
492
+ NanoAssertMsg( regs->getActive(v->reg)==ins, "Register record mismatch");
493
+ }
494
+ }
495
+
496
+ // next register in bitfield
497
+ r = nextreg(r);
498
+ managed >>= 1;
499
+ }
500
+ }
501
+ #endif /* _DEBUG */
502
+
503
+ void Assembler::findRegFor2(RegisterMask allow, LIns* ia, Reservation* &resva, LIns* ib, Reservation* &resvb)
504
+ {
505
+ if (ia == ib)
506
+ {
507
+ findRegFor(ia, allow);
508
+ resva = resvb = getresv(ia);
509
+ }
510
+ else
511
+ {
512
+ Register rb = UnknownReg;
513
+ resvb = getresv(ib);
514
+ if (resvb && (rb = resvb->reg) != UnknownReg) {
515
+ if (allow & rmask(rb)) {
516
+ // ib already assigned to an allowable reg, keep that one
517
+ allow &= ~rmask(rb);
518
+ } else {
519
+ // ib assigned to unusable reg, pick a different one below.
520
+ rb = UnknownReg;
521
+ }
522
+ }
523
+ Register ra = findRegFor(ia, allow);
524
+ resva = getresv(ia);
525
+ NanoAssert(error() || (resva != 0 && ra != UnknownReg));
526
+ if (rb == UnknownReg)
527
+ {
528
+ allow &= ~rmask(ra);
529
+ findRegFor(ib, allow);
530
+ resvb = getresv(ib);
531
+ }
532
+ }
533
+ }
534
+
535
+ Register Assembler::findSpecificRegFor(LIns* i, Register w)
536
+ {
537
+ return findRegFor(i, rmask(w));
538
+ }
539
+
540
+ Register Assembler::getBaseReg(LIns *i, int &d, RegisterMask allow)
541
+ {
542
+ if (i->isop(LIR_alloc)) {
543
+ d += findMemFor(i);
544
+ return FP;
545
+ } else {
546
+ return findRegFor(i, allow);
547
+ }
548
+ }
549
+
550
+ Register Assembler::findRegFor(LIns* i, RegisterMask allow)
551
+ {
552
+ if (i->isop(LIR_alloc)) {
553
+ // never allocate a reg for this w/out stack space too
554
+ findMemFor(i);
555
+ }
556
+
557
+ Reservation* resv = getresv(i);
558
+ Register r;
559
+
560
+ // if we have an existing reservation and it has a non-unknown
561
+ // register allocated, and that register is in our allowed mask,
562
+ // return it.
563
+ if (resv && (r=resv->reg) != UnknownReg && (rmask(r) & allow)) {
564
+ _allocator.useActive(r);
565
+ return r;
566
+ }
567
+
568
+ // figure out what registers are preferred for this instruction
569
+ RegisterMask prefer = hint(i, allow);
570
+
571
+ // if we didn't have a reservation, allocate one now
572
+ if (!resv)
573
+ resv = reserveAlloc(i);
574
+
575
+ r = resv->reg;
576
+
577
+ #ifdef AVMPLUS_IA32
578
+ if (r != UnknownReg &&
579
+ (((rmask(r)&XmmRegs) && !(allow&XmmRegs)) ||
580
+ ((rmask(r)&x87Regs) && !(allow&x87Regs))))
581
+ {
582
+ // x87 <-> xmm copy required
583
+ //_nvprof("fpu-evict",1);
584
+ evict(r);
585
+ r = UnknownReg;
586
+ }
587
+ #endif
588
+
589
+ if (r == UnknownReg)
590
+ {
591
+ r = resv->reg = registerAlloc(prefer);
592
+ _allocator.addActive(r, i);
593
+ return r;
594
+ }
595
+ else
596
+ {
597
+ // the already-allocated register isn't in the allowed mask;
598
+ // we need to grab a new one and then copy over the old
599
+ // contents to the new.
600
+ resv->reg = UnknownReg;
601
+ _allocator.retire(r);
602
+ Register s = resv->reg = registerAlloc(prefer);
603
+ _allocator.addActive(s, i);
604
+ if ((rmask(r) & GpRegs) && (rmask(s) & GpRegs)) {
605
+ #ifdef NANOJIT_ARM
606
+ MOV(r, s);
607
+ #else
608
+ MR(r, s);
609
+ #endif
610
+ }
611
+ else {
612
+ asm_nongp_copy(r, s);
613
+ }
614
+ return s;
615
+ }
616
+ }
617
+
618
+ int Assembler::findMemFor(LIns *i)
619
+ {
620
+ Reservation* resv = getresv(i);
621
+ if (!resv)
622
+ resv = reserveAlloc(i);
623
+ if (!resv->arIndex) {
624
+ resv->arIndex = arReserve(i);
625
+ NanoAssert(resv->arIndex <= _activation.highwatermark);
626
+ }
627
+ return disp(resv);
628
+ }
629
+
630
+ Register Assembler::prepResultReg(LIns *i, RegisterMask allow)
631
+ {
632
+ Reservation* resv = getresv(i);
633
+ const bool pop = !resv || resv->reg == UnknownReg;
634
+ Register rr = findRegFor(i, allow);
635
+ freeRsrcOf(i, pop);
636
+ return rr;
637
+ }
638
+
639
+ void Assembler::asm_spilli(LInsp i, Reservation *resv, bool pop)
640
+ {
641
+ int d = disp(resv);
642
+ Register rr = resv->reg;
643
+ bool quad = i->opcode() == LIR_param || i->isQuad();
644
+ verbose_only( if (d && _verbose) { outputForEOL(" <= spill %s", _thisfrag->lirbuf->names->formatRef(i)); } )
645
+ asm_spill(rr, d, pop, quad);
646
+ }
647
+
648
+ void Assembler::freeRsrcOf(LIns *i, bool pop)
649
+ {
650
+ Reservation* resv = getresv(i);
651
+ int index = resv->arIndex;
652
+ Register rr = resv->reg;
653
+
654
+ if (rr != UnknownReg)
655
+ {
656
+ asm_spilli(i, resv, pop);
657
+ _allocator.retire(rr); // free any register associated with entry
658
+ }
659
+ if (index)
660
+ arFree(index); // free any stack stack space associated with entry
661
+ reserveFree(i); // clear fields of entry and add it to free list
662
+ }
663
+
664
+ void Assembler::evict(Register r)
665
+ {
666
+ registerAlloc(rmask(r));
667
+ _allocator.addFree(r);
668
+ }
669
+
670
+ void Assembler::patch(GuardRecord *lr)
671
+ {
672
+ if (!lr->jmp) // the guard might have been eliminated as redundant
673
+ return;
674
+ Fragment *frag = lr->exit->target;
675
+ NanoAssert(frag->fragEntry != 0);
676
+ NIns* was = nPatchBranch((NIns*)lr->jmp, frag->fragEntry);
677
+ NanoAssert(frag->fragEntry != was);
678
+ verbose_only(verbose_outputf("patching jump at %p to target %p (was %p)\n",
679
+ lr->jmp, frag->fragEntry, was);)
680
+ (void)was;
681
+ }
682
+
683
+ void Assembler::patch(SideExit *exit)
684
+ {
685
+ GuardRecord *rec = exit->guards;
686
+ AvmAssert(rec);
687
+ while (rec) {
688
+ patch(rec);
689
+ rec = rec->next;
690
+ }
691
+ }
692
+
693
+ #ifdef NANOJIT_IA32
694
+ void Assembler::patch(SideExit* exit, SwitchInfo* si)
695
+ {
696
+ for (GuardRecord* lr = exit->guards; lr; lr = lr->next) {
697
+ Fragment *frag = lr->exit->target;
698
+ NanoAssert(frag->fragEntry != 0);
699
+ si->table[si->index] = frag->fragEntry;
700
+ }
701
+ }
702
+ #endif
703
+
704
+ NIns* Assembler::asm_exit(LInsp guard)
705
+ {
706
+ SideExit *exit = guard->record()->exit;
707
+ NIns* at = 0;
708
+ if (!_branchStateMap->get(exit))
709
+ {
710
+ at = asm_leave_trace(guard);
711
+ }
712
+ else
713
+ {
714
+ RegAlloc* captured = _branchStateMap->get(exit);
715
+ intersectRegisterState(*captured);
716
+ verbose_only(
717
+ verbose_outputf(" merging trunk with %s",
718
+ _frago->labels->format(exit->target));
719
+ verbose_outputf(" %p:",_nIns);
720
+ )
721
+ at = exit->target->fragEntry;
722
+ NanoAssert(at != 0);
723
+ _branchStateMap->remove(exit);
724
+ }
725
+ return at;
726
+ }
727
+
728
+ NIns* Assembler::asm_leave_trace(LInsp guard)
729
+ {
730
+ verbose_only(bool priorVerbose = _verbose; )
731
+ verbose_only( _verbose = verbose_enabled() && _frago->core()->config.verbose_exits; )
732
+ verbose_only( int32_t nativeSave = _stats.native );
733
+ verbose_only(verbose_outputf("--------------------------------------- end exit block %p", guard);)
734
+
735
+ RegAlloc capture = _allocator;
736
+
737
+ // this point is unreachable. so free all the registers.
738
+ // if an instruction has a stack entry we will leave it alone,
739
+ // otherwise we free it entirely. intersectRegisterState will restore.
740
+ releaseRegisters();
741
+
742
+ swapptrs();
743
+ _inExit = true;
744
+
745
+ //verbose_only( verbose_outputf(" LIR_xend swapptrs, _nIns is now %08X(%08X), _nExitIns is now %08X(%08X)",_nIns, *_nIns,_nExitIns,*_nExitIns) );
746
+ debug_only( _sv_fpuStkDepth = _fpuStkDepth; _fpuStkDepth = 0; )
747
+
748
+ nFragExit(guard);
749
+
750
+ // restore the callee-saved register and parameters
751
+ assignSavedRegs();
752
+ assignParamRegs();
753
+
754
+ intersectRegisterState(capture);
755
+
756
+ // this can be useful for breaking whenever an exit is taken
757
+ //INT3();
758
+ //NOP();
759
+
760
+ // we are done producing the exit logic for the guard so demark where our exit block code begins
761
+ NIns* jmpTarget = _nIns; // target in exit path for our mainline conditional jump
762
+
763
+ // swap back pointers, effectively storing the last location used in the exit path
764
+ swapptrs();
765
+ _inExit = false;
766
+
767
+ //verbose_only( verbose_outputf(" LIR_xt/xf swapptrs, _nIns is now %08X(%08X), _nExitIns is now %08X(%08X)",_nIns, *_nIns,_nExitIns,*_nExitIns) );
768
+ verbose_only( verbose_outputf(" %p:",jmpTarget);)
769
+ verbose_only( verbose_outputf("--------------------------------------- exit block (LIR_xt|LIR_xf)") );
770
+
771
+ #ifdef NANOJIT_IA32
772
+ NanoAssertMsgf(_fpuStkDepth == _sv_fpuStkDepth, "LIR_xtf, _fpuStkDepth=%d, expect %d",_fpuStkDepth, _sv_fpuStkDepth);
773
+ debug_only( _fpuStkDepth = _sv_fpuStkDepth; _sv_fpuStkDepth = 9999; )
774
+ #endif
775
+
776
+ verbose_only( _verbose = priorVerbose; )
777
+ verbose_only(_stats.exitnative += (_stats.native-nativeSave));
778
+
779
+ return jmpTarget;
780
+ }
781
+
782
+ void Assembler::beginAssembly(Fragment *frag, RegAllocMap* branchStateMap)
783
+ {
784
+ internalReset();
785
+
786
+ _thisfrag = frag;
787
+ _activation.lowwatermark = 1;
788
+ _activation.tos = _activation.lowwatermark;
789
+ _activation.highwatermark = _activation.tos;
790
+
791
+ counter_reset(native);
792
+ counter_reset(exitnative);
793
+ counter_reset(steals);
794
+ counter_reset(spills);
795
+ counter_reset(remats);
796
+
797
+ setError(None);
798
+
799
+ // native code gen buffer setup
800
+ nativePageSetup();
801
+
802
+ // When outOMem, nIns is set to startingIns and we overwrite the region until the error is handled
803
+ underrunProtect(LARGEST_UNDERRUN_PROT); // the largest value passed to underrunProtect()
804
+ _startingIns = _nIns;
805
+
806
+ #ifdef AVMPLUS_PORTING_API
807
+ _endJit2Addr = _nExitIns;
808
+ #endif
809
+
810
+ // make sure we got memory at least one page
811
+ if (error()) return;
812
+
813
+ #ifdef PERFM
814
+ _stats.pages = 0;
815
+ _stats.codeStart = _nIns-1;
816
+ _stats.codeExitStart = _nExitIns-1;
817
+ //fprintf(stderr,"pageReset %d start %x exit start %x\n", _stats.pages, (int)_stats.codeStart, (int)_stats.codeExitStart);
818
+ #endif /* PERFM */
819
+
820
+ _epilogue = genEpilogue();
821
+ _branchStateMap = branchStateMap;
822
+ _labels.clear();
823
+ _patches.clear();
824
+
825
+ verbose_only( outputAddr=true; )
826
+ verbose_only( asm_output("[epilogue]"); )
827
+ }
828
+
829
+ void Assembler::assemble(Fragment* frag, NInsList& loopJumps)
830
+ {
831
+ if (error()) return;
832
+ AvmCore *core = _frago->core();
833
+ _thisfrag = frag;
834
+
835
+ // set up backwards pipeline: assembler -> StackFilter -> LirReader
836
+ LirReader bufreader(frag->lastIns);
837
+ avmplus::GC *gc = core->gc;
838
+ StackFilter storefilter1(&bufreader, gc, frag->lirbuf, frag->lirbuf->sp);
839
+ StackFilter storefilter2(&storefilter1, gc, frag->lirbuf, frag->lirbuf->rp);
840
+ DeadCodeFilter deadfilter(&storefilter2, frag->lirbuf->_functions);
841
+ LirFilter* rdr = &deadfilter;
842
+ verbose_only(
843
+ VerboseBlockReader vbr(rdr, this, frag->lirbuf->names);
844
+ if (verbose_enabled())
845
+ rdr = &vbr;
846
+ )
847
+
848
+ verbose_only(_thisfrag->compileNbr++; )
849
+ verbose_only(_frago->_stats.compiles++; )
850
+ verbose_only(_frago->_stats.totalCompiles++; )
851
+ _inExit = false;
852
+ gen(rdr, loopJumps);
853
+ frag->loopEntry = _nIns;
854
+ //frag->outbound = core->config.tree_opt? _latestGuard : 0;
855
+ //fprintf(stderr, "assemble frag %X entry %X\n", (int)frag, (int)frag->fragEntry);
856
+
857
+ if (!error()) {
858
+ // patch all branches
859
+ while(!_patches.isEmpty())
860
+ {
861
+ NIns* where = _patches.lastKey();
862
+ LInsp targ = _patches.removeLast();
863
+ LabelState *label = _labels.get(targ);
864
+ NIns* ntarg = label->addr;
865
+ if (ntarg) {
866
+ nPatchBranch(where,ntarg);
867
+ }
868
+ else {
869
+ setError(UnknownBranch);
870
+ break;
871
+ }
872
+ }
873
+ }
874
+ else {
875
+ _nIns = _startingIns; // in case of failure reset nIns ready for the next assembly run
876
+ }
877
+ }
878
+
879
+ void Assembler::endAssembly(Fragment* frag, NInsList& loopJumps)
880
+ {
881
+ // don't try to patch code if we are in an error state since we might have partially
882
+ // overwritten the code cache already
883
+ if (error())
884
+ return;
885
+
886
+ NIns* SOT = 0;
887
+ if (frag->isRoot()) {
888
+ SOT = frag->loopEntry;
889
+ verbose_only( verbose_outputf(" %p:",_nIns); )
890
+ } else {
891
+ SOT = frag->root->fragEntry;
892
+ }
893
+ AvmAssert(SOT);
894
+ while(!loopJumps.isEmpty())
895
+ {
896
+ NIns* loopJump = (NIns*)loopJumps.removeLast();
897
+ verbose_only( verbose_outputf("patching %p to %p", loopJump, SOT); )
898
+ nPatchBranch(loopJump, SOT);
899
+ }
900
+
901
+ NIns* fragEntry = 0;
902
+
903
+ if (!error())
904
+ {
905
+ fragEntry = genPrologue();
906
+ verbose_only( outputAddr=true; )
907
+ verbose_only( asm_output("[prologue]"); )
908
+ }
909
+
910
+ // something bad happened?
911
+ if (!error())
912
+ {
913
+ // check for resource leaks
914
+ debug_only(
915
+ for(uint32_t i=_activation.lowwatermark;i<_activation.highwatermark; i++) {
916
+ NanoAssertMsgf(_activation.entry[i] == 0, "frame entry %d wasn't freed",-4*i);
917
+ }
918
+ )
919
+
920
+ frag->fragEntry = fragEntry;
921
+ NIns* code = _nIns;
922
+ #ifdef PERFM
923
+ _nvprof("code", codeBytes()); // requires that all pages are released between begin/endAssembly()otherwise we double count
924
+ #endif
925
+ // let the fragment manage the pages if we're using trees and there are branches
926
+ Page* manage = (_frago->core()->config.tree_opt) ? handoverPages() : 0;
927
+ frag->setCode(code, manage); // root of tree should manage all pages
928
+ //fprintf(stderr, "endAssembly frag %X entry %X\n", (int)frag, (int)frag->fragEntry);
929
+ }
930
+ else
931
+ {
932
+ _nIns = _startingIns; // in case of failure reset nIns ready for the next assembly run
933
+ }
934
+
935
+ NanoAssertMsgf(error() || _fpuStkDepth == 0,"_fpuStkDepth %d",_fpuStkDepth);
936
+
937
+ internalReset(); // clear the reservation tables and regalloc
938
+ NanoAssert( !_branchStateMap || _branchStateMap->isEmpty());
939
+ _branchStateMap = 0;
940
+
941
+ // Tell Valgrind that new code has been generated, and it must flush
942
+ // any translations it has for the memory range generated into.
943
+ VALGRIND_DISCARD_TRANSLATIONS(pageTop(_nIns-1), NJ_PAGE_SIZE);
944
+ VALGRIND_DISCARD_TRANSLATIONS(pageTop(_nExitIns-1), NJ_PAGE_SIZE);
945
+
946
+ #ifdef AVMPLUS_ARM
947
+ // If we've modified the code, we need to flush so we don't end up trying
948
+ // to execute junk
949
+ # if defined(UNDER_CE)
950
+ FlushInstructionCache(GetCurrentProcess(), NULL, NULL);
951
+ # elif defined(AVMPLUS_UNIX)
952
+ for (int i = 0; i < 2; i++) {
953
+ Page *p = (i == 0) ? _nativePages : _nativeExitPages;
954
+
955
+ Page *first = p;
956
+ while (p) {
957
+ if (!p->next || p->next != p+1) {
958
+ __clear_cache((char*)first, (char*)(p+1));
959
+ first = p->next;
960
+ }
961
+ p = p->next;
962
+ }
963
+ }
964
+ # endif
965
+ #endif
966
+
967
+ #ifdef AVMPLUS_SPARC
968
+ // Clear Instruction Cache
969
+ for (int i = 0; i < 2; i++) {
970
+ Page *p = (i == 0) ? _nativePages : _nativeExitPages;
971
+
972
+ Page *first = p;
973
+ while (p) {
974
+ if (!p->next || p->next != p+1) {
975
+ sync_instruction_memory((char *)first, NJ_PAGE_SIZE);
976
+ first = p->next;
977
+ }
978
+ p = p->next;
979
+ }
980
+ }
981
+ #endif
982
+
983
+ # ifdef AVMPLUS_PORTING_API
984
+ NanoJIT_PortAPI_FlushInstructionCache(_nIns, _startingIns);
985
+ NanoJIT_PortAPI_FlushInstructionCache(_nExitIns, _endJit2Addr);
986
+ # endif
987
+ }
988
+
989
+ void Assembler::copyRegisters(RegAlloc* copyTo)
990
+ {
991
+ *copyTo = _allocator;
992
+ }
993
+
994
+ void Assembler::releaseRegisters()
995
+ {
996
+ for (Register r = FirstReg; r <= LastReg; r = nextreg(r))
997
+ {
998
+ LIns *i = _allocator.getActive(r);
999
+ if (i)
1000
+ {
1001
+ // clear reg allocation, preserve stack allocation.
1002
+ Reservation* resv = getresv(i);
1003
+ NanoAssert(resv != 0);
1004
+ _allocator.retire(r);
1005
+ if (r == resv->reg)
1006
+ resv->reg = UnknownReg;
1007
+
1008
+ if (!resv->arIndex && resv->reg == UnknownReg)
1009
+ {
1010
+ reserveFree(i);
1011
+ }
1012
+ }
1013
+ }
1014
+ }
1015
+
1016
+ #ifdef PERFM
1017
+ #define countlir_live() _nvprof("lir-live",1)
1018
+ #define countlir_ret() _nvprof("lir-ret",1)
1019
+ #define countlir_alloc() _nvprof("lir-alloc",1)
1020
+ #define countlir_var() _nvprof("lir-var",1)
1021
+ #define countlir_use() _nvprof("lir-use",1)
1022
+ #define countlir_def() _nvprof("lir-def",1)
1023
+ #define countlir_imm() _nvprof("lir-imm",1)
1024
+ #define countlir_param() _nvprof("lir-param",1)
1025
+ #define countlir_cmov() _nvprof("lir-cmov",1)
1026
+ #define countlir_ld() _nvprof("lir-ld",1)
1027
+ #define countlir_ldq() _nvprof("lir-ldq",1)
1028
+ #define countlir_alu() _nvprof("lir-alu",1)
1029
+ #define countlir_qjoin() _nvprof("lir-qjoin",1)
1030
+ #define countlir_qlo() _nvprof("lir-qlo",1)
1031
+ #define countlir_qhi() _nvprof("lir-qhi",1)
1032
+ #define countlir_fpu() _nvprof("lir-fpu",1)
1033
+ #define countlir_st() _nvprof("lir-st",1)
1034
+ #define countlir_stq() _nvprof("lir-stq",1)
1035
+ #define countlir_jmp() _nvprof("lir-jmp",1)
1036
+ #define countlir_jcc() _nvprof("lir-jcc",1)
1037
+ #define countlir_label() _nvprof("lir-label",1)
1038
+ #define countlir_xcc() _nvprof("lir-xcc",1)
1039
+ #define countlir_x() _nvprof("lir-x",1)
1040
+ #define countlir_loop() _nvprof("lir-loop",1)
1041
+ #define countlir_call() _nvprof("lir-call",1)
1042
+ #else
1043
+ #define countlir_live()
1044
+ #define countlir_ret()
1045
+ #define countlir_alloc()
1046
+ #define countlir_var()
1047
+ #define countlir_use()
1048
+ #define countlir_def()
1049
+ #define countlir_imm()
1050
+ #define countlir_param()
1051
+ #define countlir_cmov()
1052
+ #define countlir_ld()
1053
+ #define countlir_ldq()
1054
+ #define countlir_alu()
1055
+ #define countlir_qjoin()
1056
+ #define countlir_qlo()
1057
+ #define countlir_qhi()
1058
+ #define countlir_fpu()
1059
+ #define countlir_st()
1060
+ #define countlir_stq()
1061
+ #define countlir_jmp()
1062
+ #define countlir_jcc()
1063
+ #define countlir_label()
1064
+ #define countlir_xcc()
1065
+ #define countlir_x()
1066
+ #define countlir_loop()
1067
+ #define countlir_call()
1068
+ #endif
1069
+
1070
+ void Assembler::gen(LirFilter* reader, NInsList& loopJumps)
1071
+ {
1072
+ // trace must end with LIR_x, LIR_loop, LIR_ret, or LIR_xtbl
1073
+ NanoAssert(reader->pos()->isop(LIR_x) ||
1074
+ reader->pos()->isop(LIR_loop) ||
1075
+ reader->pos()->isop(LIR_ret) ||
1076
+ reader->pos()->isop(LIR_xtbl));
1077
+
1078
+ for (LInsp ins = reader->read(); ins != 0 && !error(); ins = reader->read())
1079
+ {
1080
+ LOpcode op = ins->opcode();
1081
+ switch(op)
1082
+ {
1083
+ default:
1084
+ NanoAssertMsgf(false, "unsupported LIR instruction: %d (~0x40: %d)", op, op&~LIR64);
1085
+ break;
1086
+
1087
+ case LIR_live: {
1088
+ countlir_live();
1089
+ pending_lives.add(ins->oprnd1());
1090
+ break;
1091
+ }
1092
+
1093
+ case LIR_ret: {
1094
+ countlir_ret();
1095
+ if (_nIns != _epilogue) {
1096
+ JMP(_epilogue);
1097
+ }
1098
+ assignSavedRegs();
1099
+ #ifdef NANOJIT_ARM
1100
+ // the epilogue moves R2 to R0; we may want to do this
1101
+ // after assignSavedRegs
1102
+ findSpecificRegFor(ins->oprnd1(), R2);
1103
+ #else
1104
+ findSpecificRegFor(ins->oprnd1(), retRegs[0]);
1105
+ #endif
1106
+ break;
1107
+ }
1108
+
1109
+ case LIR_fret: {
1110
+ countlir_ret();
1111
+ if (_nIns != _epilogue) {
1112
+ JMP(_epilogue);
1113
+ }
1114
+ assignSavedRegs();
1115
+ #ifdef NANOJIT_IA32
1116
+ findSpecificRegFor(ins->oprnd1(), FST0);
1117
+ #else
1118
+ NanoAssert(false);
1119
+ #endif
1120
+ fpu_pop();
1121
+ break;
1122
+ }
1123
+
1124
+ // allocate some stack space. the value of this instruction
1125
+ // is the address of the stack space.
1126
+ case LIR_alloc: {
1127
+ countlir_alloc();
1128
+ Reservation *resv = getresv(ins);
1129
+ NanoAssert(resv->arIndex != 0);
1130
+ Register r = resv->reg;
1131
+ if (r != UnknownReg) {
1132
+ _allocator.retire(r);
1133
+ resv->reg = UnknownReg;
1134
+ asm_restore(ins, resv, r);
1135
+ }
1136
+ freeRsrcOf(ins, 0);
1137
+ break;
1138
+ }
1139
+ case LIR_short:
1140
+ {
1141
+ countlir_imm();
1142
+ asm_short(ins);
1143
+ break;
1144
+ }
1145
+ case LIR_int:
1146
+ {
1147
+ countlir_imm();
1148
+ asm_int(ins);
1149
+ break;
1150
+ }
1151
+ case LIR_quad:
1152
+ {
1153
+ countlir_imm();
1154
+ asm_quad(ins);
1155
+ break;
1156
+ }
1157
+ #if !defined NANOJIT_64BIT
1158
+ case LIR_callh:
1159
+ {
1160
+ // return result of quad-call in register
1161
+ prepResultReg(ins, rmask(retRegs[1]));
1162
+ // if hi half was used, we must use the call to ensure it happens
1163
+ findSpecificRegFor(ins->oprnd1(), retRegs[0]);
1164
+ break;
1165
+ }
1166
+ #endif
1167
+ case LIR_param:
1168
+ {
1169
+ countlir_param();
1170
+ asm_param(ins);
1171
+ break;
1172
+ }
1173
+ case LIR_qlo:
1174
+ {
1175
+ countlir_qlo();
1176
+ asm_qlo(ins);
1177
+ break;
1178
+ }
1179
+ case LIR_qhi:
1180
+ {
1181
+ countlir_qhi();
1182
+ asm_qhi(ins);
1183
+ break;
1184
+ }
1185
+ case LIR_qcmov:
1186
+ case LIR_cmov:
1187
+ {
1188
+ countlir_cmov();
1189
+ asm_cmov(ins);
1190
+ break;
1191
+ }
1192
+ case LIR_ld:
1193
+ case LIR_ldc:
1194
+ case LIR_ldcb:
1195
+ case LIR_ldcs:
1196
+ {
1197
+ countlir_ld();
1198
+ asm_ld(ins);
1199
+ break;
1200
+ }
1201
+ case LIR_ldq:
1202
+ case LIR_ldqc:
1203
+ {
1204
+ countlir_ldq();
1205
+ asm_load64(ins);
1206
+ break;
1207
+ }
1208
+ case LIR_neg:
1209
+ case LIR_not:
1210
+ {
1211
+ countlir_alu();
1212
+ asm_neg_not(ins);
1213
+ break;
1214
+ }
1215
+ case LIR_qjoin:
1216
+ {
1217
+ countlir_qjoin();
1218
+ asm_qjoin(ins);
1219
+ break;
1220
+ }
1221
+
1222
+ #if defined NANOJIT_64BIT
1223
+ case LIR_qiadd:
1224
+ case LIR_qiand:
1225
+ case LIR_qilsh:
1226
+ case LIR_qior:
1227
+ {
1228
+ asm_qbinop(ins);
1229
+ break;
1230
+ }
1231
+ #endif
1232
+
1233
+ case LIR_add:
1234
+ case LIR_addp:
1235
+ case LIR_sub:
1236
+ case LIR_mul:
1237
+ case LIR_and:
1238
+ case LIR_or:
1239
+ case LIR_xor:
1240
+ case LIR_lsh:
1241
+ case LIR_rsh:
1242
+ case LIR_ush:
1243
+ {
1244
+ countlir_alu();
1245
+ asm_arith(ins);
1246
+ break;
1247
+ }
1248
+ case LIR_fneg:
1249
+ {
1250
+ countlir_fpu();
1251
+ asm_fneg(ins);
1252
+ break;
1253
+ }
1254
+ case LIR_fadd:
1255
+ case LIR_fsub:
1256
+ case LIR_fmul:
1257
+ case LIR_fdiv:
1258
+ {
1259
+ countlir_fpu();
1260
+ asm_fop(ins);
1261
+ break;
1262
+ }
1263
+ case LIR_i2f:
1264
+ {
1265
+ countlir_fpu();
1266
+ asm_i2f(ins);
1267
+ break;
1268
+ }
1269
+ case LIR_u2f:
1270
+ {
1271
+ countlir_fpu();
1272
+ asm_u2f(ins);
1273
+ break;
1274
+ }
1275
+ case LIR_st:
1276
+ case LIR_sti:
1277
+ {
1278
+ countlir_st();
1279
+ asm_store32(ins->oprnd1(), ins->immdisp(), ins->oprnd2());
1280
+ break;
1281
+ }
1282
+ case LIR_stq:
1283
+ case LIR_stqi:
1284
+ {
1285
+ countlir_stq();
1286
+ LIns* value = ins->oprnd1();
1287
+ LIns* base = ins->oprnd2();
1288
+ int dr = ins->immdisp();
1289
+ if (value->isop(LIR_qjoin))
1290
+ {
1291
+ // this is correct for little-endian only
1292
+ asm_store32(value->oprnd1(), dr, base);
1293
+ asm_store32(value->oprnd2(), dr+4, base);
1294
+ }
1295
+ else
1296
+ {
1297
+ asm_store64(value, dr, base);
1298
+ }
1299
+ break;
1300
+ }
1301
+
1302
+ case LIR_j:
1303
+ {
1304
+ countlir_jmp();
1305
+ LInsp to = ins->getTarget();
1306
+ LabelState *label = _labels.get(to);
1307
+ // the jump is always taken so whatever register state we
1308
+ // have from downstream code, is irrelevant to code before
1309
+ // this jump. so clear it out. we will pick up register
1310
+ // state from the jump target, if we have seen that label.
1311
+ releaseRegisters();
1312
+ if (label && label->addr) {
1313
+ // forward jump - pick up register state from target.
1314
+ unionRegisterState(label->regs);
1315
+ JMP(label->addr);
1316
+ }
1317
+ else {
1318
+ // backwards jump
1319
+ hasLoop = true;
1320
+ handleLoopCarriedExprs();
1321
+ if (!label) {
1322
+ // save empty register state at loop header
1323
+ _labels.add(to, 0, _allocator);
1324
+ }
1325
+ else {
1326
+ intersectRegisterState(label->regs);
1327
+ }
1328
+ JMP(0);
1329
+ _patches.put(_nIns, to);
1330
+ }
1331
+ break;
1332
+ }
1333
+
1334
+ case LIR_jt:
1335
+ case LIR_jf:
1336
+ {
1337
+ countlir_jcc();
1338
+ LInsp to = ins->getTarget();
1339
+ LIns* cond = ins->oprnd1();
1340
+ LabelState *label = _labels.get(to);
1341
+ if (label && label->addr) {
1342
+ // forward jump to known label. need to merge with label's register state.
1343
+ unionRegisterState(label->regs);
1344
+ asm_branch(op == LIR_jf, cond, label->addr, false);
1345
+ }
1346
+ else {
1347
+ // back edge.
1348
+ hasLoop = true;
1349
+ handleLoopCarriedExprs();
1350
+ if (!label) {
1351
+ // evict all registers, most conservative approach.
1352
+ evictRegs(~_allocator.free);
1353
+ _labels.add(to, 0, _allocator);
1354
+ }
1355
+ else {
1356
+ // evict all registers, most conservative approach.
1357
+ intersectRegisterState(label->regs);
1358
+ }
1359
+ NIns *branch = asm_branch(op == LIR_jf, cond, 0, false);
1360
+ _patches.put(branch,to);
1361
+ }
1362
+ break;
1363
+ }
1364
+ case LIR_label:
1365
+ {
1366
+ countlir_label();
1367
+ LabelState *label = _labels.get(ins);
1368
+ if (!label) {
1369
+ // label seen first, normal target of forward jump, save addr & allocator
1370
+ _labels.add(ins, _nIns, _allocator);
1371
+ }
1372
+ else {
1373
+ // we're at the top of a loop
1374
+ hasLoop = true;
1375
+ NanoAssert(label->addr == 0 && label->regs.isValid());
1376
+ //evictRegs(~_allocator.free);
1377
+ intersectRegisterState(label->regs);
1378
+ label->addr = _nIns;
1379
+ }
1380
+ verbose_only( if (_verbose) { outputAddr=true; asm_output("[%s]", _thisfrag->lirbuf->names->formatRef(ins)); } )
1381
+ break;
1382
+ }
1383
+ case LIR_xbarrier: {
1384
+ break;
1385
+ }
1386
+ #ifdef NANOJIT_IA32
1387
+ case LIR_xtbl: {
1388
+ NIns* exit = asm_exit(ins); // does intersectRegisterState()
1389
+ asm_switch(ins, exit);
1390
+ break;
1391
+ }
1392
+ #else
1393
+ case LIR_xtbl:
1394
+ NanoAssertMsg(0, "Not supported for this architecture");
1395
+ break;
1396
+ #endif
1397
+ case LIR_xt:
1398
+ case LIR_xf:
1399
+ {
1400
+ countlir_xcc();
1401
+ // we only support cmp with guard right now, also assume it is 'close' and only emit the branch
1402
+ NIns* exit = asm_exit(ins); // does intersectRegisterState()
1403
+ LIns* cond = ins->oprnd1();
1404
+ asm_branch(op == LIR_xf, cond, exit, false);
1405
+ break;
1406
+ }
1407
+ case LIR_x:
1408
+ {
1409
+ countlir_x();
1410
+ verbose_only(verbose_output(""));
1411
+ // generate the side exit branch on the main trace.
1412
+ NIns *exit = asm_exit(ins);
1413
+ JMP( exit );
1414
+ break;
1415
+ }
1416
+ case LIR_loop:
1417
+ {
1418
+ countlir_loop();
1419
+ asm_loop(ins, loopJumps);
1420
+ assignSavedRegs();
1421
+ assignParamRegs();
1422
+ break;
1423
+ }
1424
+
1425
+ case LIR_feq:
1426
+ case LIR_fle:
1427
+ case LIR_flt:
1428
+ case LIR_fgt:
1429
+ case LIR_fge:
1430
+ {
1431
+ countlir_fpu();
1432
+ asm_fcond(ins);
1433
+ break;
1434
+ }
1435
+ case LIR_eq:
1436
+ case LIR_ov:
1437
+ case LIR_cs:
1438
+ case LIR_le:
1439
+ case LIR_lt:
1440
+ case LIR_gt:
1441
+ case LIR_ge:
1442
+ case LIR_ult:
1443
+ case LIR_ule:
1444
+ case LIR_ugt:
1445
+ case LIR_uge:
1446
+ {
1447
+ countlir_alu();
1448
+ asm_cond(ins);
1449
+ break;
1450
+ }
1451
+
1452
+ case LIR_fcall:
1453
+ case LIR_fcalli:
1454
+ #if defined NANOJIT_64BIT
1455
+ case LIR_callh:
1456
+ #endif
1457
+ case LIR_call:
1458
+ case LIR_calli:
1459
+ {
1460
+ countlir_call();
1461
+ Register rr = UnknownReg;
1462
+ if ((op&LIR64))
1463
+ {
1464
+ // fcall or fcalli
1465
+ Reservation* rR = getresv(ins);
1466
+ rr = asm_prep_fcall(rR, ins);
1467
+ }
1468
+ else
1469
+ {
1470
+ rr = retRegs[0];
1471
+ prepResultReg(ins, rmask(rr));
1472
+ }
1473
+
1474
+ // do this after we've handled the call result, so we dont
1475
+ // force the call result to be spilled unnecessarily.
1476
+
1477
+ evictScratchRegs();
1478
+
1479
+ asm_call(ins);
1480
+ }
1481
+ }
1482
+
1483
+ if (error())
1484
+ return;
1485
+
1486
+ // check that all is well (don't check in exit paths since its more complicated)
1487
+ debug_only( pageValidate(); )
1488
+ debug_only( resourceConsistencyCheck(); )
1489
+ }
1490
+ }
1491
+
1492
+ /*
1493
+ * Write a jump table for the given SwitchInfo and store the table
1494
+ * address in the SwitchInfo. Every entry will initially point to
1495
+ * target.
1496
+ */
1497
+ void Assembler::emitJumpTable(SwitchInfo* si, NIns* target)
1498
+ {
1499
+ underrunProtect(si->count * sizeof(NIns*) + 20);
1500
+ // Align for platform. The branch should be optimized away and is
1501
+ // required to select the compatible int type.
1502
+ if (sizeof(NIns*) == 8) {
1503
+ _nIns = (NIns*) (uint64(_nIns) & ~7);
1504
+ } else if (sizeof(NIns*) == 4) {
1505
+ _nIns = (NIns*) (uint32(_nIns) & ~3);
1506
+ }
1507
+ for (uint32_t i = 0; i < si->count; ++i) {
1508
+ _nIns = (NIns*) (((uint8*) _nIns) - sizeof(NIns*));
1509
+ *(NIns**) _nIns = target;
1510
+ }
1511
+ si->table = (NIns**) _nIns;
1512
+ }
1513
+
1514
+ void Assembler::assignSavedRegs()
1515
+ {
1516
+ // restore saved regs
1517
+ releaseRegisters();
1518
+ LirBuffer *b = _thisfrag->lirbuf;
1519
+ for (int i=0, n = NumSavedRegs; i < n; i++) {
1520
+ LIns *p = b->savedRegs[i];
1521
+ if (p)
1522
+ findSpecificRegFor(p, savedRegs[p->imm8()]);
1523
+ }
1524
+ }
1525
+
1526
+ void Assembler::reserveSavedRegs()
1527
+ {
1528
+ LirBuffer *b = _thisfrag->lirbuf;
1529
+ for (int i=0, n = NumSavedRegs; i < n; i++) {
1530
+ LIns *p = b->savedRegs[i];
1531
+ if (p)
1532
+ findMemFor(p);
1533
+ }
1534
+ }
1535
+
1536
+ // restore parameter registers
1537
+ void Assembler::assignParamRegs()
1538
+ {
1539
+ LInsp state = _thisfrag->lirbuf->state;
1540
+ if (state)
1541
+ findSpecificRegFor(state, argRegs[state->imm8()]);
1542
+ LInsp param1 = _thisfrag->lirbuf->param1;
1543
+ if (param1)
1544
+ findSpecificRegFor(param1, argRegs[param1->imm8()]);
1545
+ }
1546
+
1547
+ void Assembler::handleLoopCarriedExprs()
1548
+ {
1549
+ // ensure that exprs spanning the loop are marked live at the end of the loop
1550
+ reserveSavedRegs();
1551
+ for (int i=0, n=pending_lives.size(); i < n; i++) {
1552
+ findMemFor(pending_lives[i]);
1553
+ }
1554
+ }
1555
+
1556
+ void Assembler::arFree(uint32_t idx)
1557
+ {
1558
+ AR &ar = _activation;
1559
+ LIns *i = ar.entry[idx];
1560
+ NanoAssert(i != 0);
1561
+ do {
1562
+ ar.entry[idx] = 0;
1563
+ idx--;
1564
+ } while (ar.entry[idx] == i);
1565
+ }
1566
+
1567
+ #ifdef NJ_VERBOSE
1568
+ void Assembler::printActivationState()
1569
+ {
1570
+ bool verbose_activation = false;
1571
+ if (!verbose_activation)
1572
+ return;
1573
+
1574
+ #ifdef NANOJIT_ARM
1575
+ // @todo Why is there here?!? This routine should be indep. of platform
1576
+ verbose_only(
1577
+ if (_verbose) {
1578
+ char* s = &outline[0];
1579
+ memset(s, ' ', 51); s[51] = '\0';
1580
+ s += strlen(s);
1581
+ sprintf(s, " SP ");
1582
+ s += strlen(s);
1583
+ for(uint32_t i=_activation.lowwatermark; i<_activation.tos;i++) {
1584
+ LInsp ins = _activation.entry[i];
1585
+ if (ins && ins !=_activation.entry[i+1]) {
1586
+ sprintf(s, "%d(%s) ", 4*i, _thisfrag->lirbuf->names->formatRef(ins));
1587
+ s += strlen(s);
1588
+ }
1589
+ }
1590
+ output(&outline[0]);
1591
+ }
1592
+ )
1593
+ #else
1594
+ verbose_only(
1595
+ char* s = &outline[0];
1596
+ if (_verbose) {
1597
+ memset(s, ' ', 51); s[51] = '\0';
1598
+ s += strlen(s);
1599
+ sprintf(s, " ebp ");
1600
+ s += strlen(s);
1601
+
1602
+ for(uint32_t i=_activation.lowwatermark; i<_activation.tos;i++) {
1603
+ LInsp ins = _activation.entry[i];
1604
+ if (ins) {
1605
+ sprintf(s, "%d(%s) ", -4*i,_thisfrag->lirbuf->names->formatRef(ins));
1606
+ s += strlen(s);
1607
+ }
1608
+ }
1609
+ output(&outline[0]);
1610
+ }
1611
+ )
1612
+ #endif
1613
+ }
1614
+ #endif
1615
+
1616
+ bool canfit(int32_t size, int32_t loc, AR &ar) {
1617
+ for (int i=0; i < size; i++) {
1618
+ if (ar.entry[loc+stack_direction(i)])
1619
+ return false;
1620
+ }
1621
+ return true;
1622
+ }
1623
+
1624
+ uint32_t Assembler::arReserve(LIns* l)
1625
+ {
1626
+ NanoAssert(!l->isTramp());
1627
+
1628
+ //verbose_only(printActivationState());
1629
+ int32_t size = l->isop(LIR_alloc) ? (l->size()>>2) : l->isQuad() ? 2 : sizeof(intptr_t)>>2;
1630
+ AR &ar = _activation;
1631
+ const int32_t tos = ar.tos;
1632
+ int32_t start = ar.lowwatermark;
1633
+ int32_t i = 0;
1634
+ NanoAssert(start>0);
1635
+
1636
+ if (size == 1) {
1637
+ // easy most common case -- find a hole, or make the frame bigger
1638
+ for (i=start; i < NJ_MAX_STACK_ENTRY; i++) {
1639
+ if (ar.entry[i] == 0) {
1640
+ // found a hole
1641
+ ar.entry[i] = l;
1642
+ break;
1643
+ }
1644
+ }
1645
+ }
1646
+ else if (size == 2) {
1647
+ if ( (start&1)==1 ) start++; // even 8 boundary
1648
+ for (i=start; i < NJ_MAX_STACK_ENTRY; i+=2) {
1649
+ if ( (ar.entry[i+stack_direction(1)] == 0) && (i==tos || (ar.entry[i] == 0)) ) {
1650
+ // found 2 adjacent aligned slots
1651
+ NanoAssert(_activation.entry[i] == 0);
1652
+ NanoAssert(_activation.entry[i+stack_direction(1)] == 0);
1653
+ ar.entry[i] = l;
1654
+ ar.entry[i+stack_direction(1)] = l;
1655
+ break;
1656
+ }
1657
+ }
1658
+ }
1659
+ else {
1660
+ // alloc larger block on 8byte boundary.
1661
+ if (start < size) start = size;
1662
+ if ((start&1)==1) start++;
1663
+ for (i=start; i < NJ_MAX_STACK_ENTRY; i+=2) {
1664
+ if (canfit(size, i, ar)) {
1665
+ // place the entry in the table and mark the instruction with it
1666
+ for (int32_t j=0; j < size; j++) {
1667
+ NanoAssert(_activation.entry[i+stack_direction(j)] == 0);
1668
+ _activation.entry[i+stack_direction(j)] = l;
1669
+ }
1670
+ break;
1671
+ }
1672
+ }
1673
+ }
1674
+ if (i >= (int32_t)ar.tos) {
1675
+ ar.tos = ar.highwatermark = i+1;
1676
+ }
1677
+ if (tos+size >= NJ_MAX_STACK_ENTRY) {
1678
+ setError(StackFull);
1679
+ }
1680
+ return i;
1681
+ }
1682
+
1683
+ /**
1684
+ * move regs around so the SavedRegs contains the highest priority regs.
1685
+ */
1686
+ void Assembler::evictScratchRegs()
1687
+ {
1688
+ // find the top GpRegs that are candidates to put in SavedRegs
1689
+
1690
+ // tosave is a binary heap stored in an array. the root is tosave[0],
1691
+ // left child is at i+1, right child is at i+2.
1692
+
1693
+ Register tosave[LastReg-FirstReg+1];
1694
+ int len=0;
1695
+ RegAlloc *regs = &_allocator;
1696
+ for (Register r = FirstReg; r <= LastReg; r = nextreg(r)) {
1697
+ if (rmask(r) & GpRegs) {
1698
+ LIns *i = regs->getActive(r);
1699
+ if (i) {
1700
+ if (canRemat(i)) {
1701
+ evict(r);
1702
+ }
1703
+ else {
1704
+ int32_t pri = regs->getPriority(r);
1705
+ // add to heap by adding to end and bubbling up
1706
+ int j = len++;
1707
+ while (j > 0 && pri > regs->getPriority(tosave[j/2])) {
1708
+ tosave[j] = tosave[j/2];
1709
+ j /= 2;
1710
+ }
1711
+ NanoAssert(size_t(j) < sizeof(tosave)/sizeof(tosave[0]));
1712
+ tosave[j] = r;
1713
+ }
1714
+ }
1715
+ }
1716
+ }
1717
+
1718
+ // now primap has the live exprs in priority order.
1719
+ // allocate each of the top priority exprs to a SavedReg
1720
+
1721
+ RegisterMask allow = SavedRegs;
1722
+ while (allow && len > 0) {
1723
+ // get the highest priority var
1724
+ Register hi = tosave[0];
1725
+ if (!(rmask(hi) & SavedRegs)) {
1726
+ LIns *i = regs->getActive(hi);
1727
+ Register r = findRegFor(i, allow);
1728
+ allow &= ~rmask(r);
1729
+ }
1730
+ else {
1731
+ // hi is already in a saved reg, leave it alone.
1732
+ allow &= ~rmask(hi);
1733
+ }
1734
+
1735
+ // remove from heap by replacing root with end element and bubbling down.
1736
+ if (allow && --len > 0) {
1737
+ Register last = tosave[len];
1738
+ int j = 0;
1739
+ while (j+1 < len) {
1740
+ int child = j+1;
1741
+ if (j+2 < len && regs->getPriority(tosave[j+2]) > regs->getPriority(tosave[j+1]))
1742
+ child++;
1743
+ if (regs->getPriority(last) > regs->getPriority(tosave[child]))
1744
+ break;
1745
+ tosave[j] = tosave[child];
1746
+ j = child;
1747
+ }
1748
+ tosave[j] = last;
1749
+ }
1750
+ }
1751
+
1752
+ // now evict everything else.
1753
+ evictRegs(~SavedRegs);
1754
+ }
1755
+
1756
+ void Assembler::evictRegs(RegisterMask regs)
1757
+ {
1758
+ // generate code to restore callee saved registers
1759
+ // @todo speed this up
1760
+ for (Register r = FirstReg; r <= LastReg; r = nextreg(r)) {
1761
+ if ((rmask(r) & regs) && _allocator.getActive(r)) {
1762
+ evict(r);
1763
+ }
1764
+ }
1765
+ }
1766
+
1767
+ /**
1768
+ * Merge the current state of the registers with a previously stored version
1769
+ * current == saved skip
1770
+ * current & saved evict current, keep saved
1771
+ * current & !saved evict current (unionRegisterState would keep)
1772
+ * !current & saved keep saved
1773
+ */
1774
+ void Assembler::intersectRegisterState(RegAlloc& saved)
1775
+ {
1776
+ // evictions and pops first
1777
+ RegisterMask skip = 0;
1778
+ verbose_only(bool shouldMention=false; )
1779
+ for (Register r=FirstReg; r <= LastReg; r = nextreg(r))
1780
+ {
1781
+ LIns * curins = _allocator.getActive(r);
1782
+ LIns * savedins = saved.getActive(r);
1783
+ if (curins == savedins)
1784
+ {
1785
+ //verbose_only( if (curins) verbose_outputf(" skip %s", regNames[r]); )
1786
+ skip |= rmask(r);
1787
+ }
1788
+ else
1789
+ {
1790
+ if (curins) {
1791
+ //_nvprof("intersect-evict",1);
1792
+ verbose_only( shouldMention=true; )
1793
+ evict(r);
1794
+ }
1795
+
1796
+ #ifdef NANOJIT_IA32
1797
+ if (savedins && (rmask(r) & x87Regs)) {
1798
+ verbose_only( shouldMention=true; )
1799
+ FSTP(r);
1800
+ }
1801
+ #endif
1802
+ }
1803
+ }
1804
+ assignSaved(saved, skip);
1805
+ verbose_only( if (shouldMention) verbose_outputf(" merging registers (intersect) with existing edge"); )
1806
+ }
1807
+
1808
+ /**
1809
+ * Merge the current state of the registers with a previously stored version.
1810
+ *
1811
+ * current == saved skip
1812
+ * current & saved evict current, keep saved
1813
+ * current & !saved keep current (intersectRegisterState would evict)
1814
+ * !current & saved keep saved
1815
+ */
1816
+ void Assembler::unionRegisterState(RegAlloc& saved)
1817
+ {
1818
+ // evictions and pops first
1819
+ verbose_only(bool shouldMention=false; )
1820
+ RegisterMask skip = 0;
1821
+ for (Register r=FirstReg; r <= LastReg; r = nextreg(r))
1822
+ {
1823
+ LIns * curins = _allocator.getActive(r);
1824
+ LIns * savedins = saved.getActive(r);
1825
+ if (curins == savedins)
1826
+ {
1827
+ //verbose_only( if (curins) verbose_outputf(" skip %s", regNames[r]); )
1828
+ skip |= rmask(r);
1829
+ }
1830
+ else
1831
+ {
1832
+ if (curins && savedins) {
1833
+ //_nvprof("union-evict",1);
1834
+ verbose_only( shouldMention=true; )
1835
+ evict(r);
1836
+ }
1837
+
1838
+ #ifdef NANOJIT_IA32
1839
+ if (rmask(r) & x87Regs) {
1840
+ if (savedins) {
1841
+ FSTP(r);
1842
+ }
1843
+ else {
1844
+ // saved state did not have fpu reg allocated,
1845
+ // so we must evict here to keep x87 stack balanced.
1846
+ evict(r);
1847
+ }
1848
+ verbose_only( shouldMention=true; )
1849
+ }
1850
+ #endif
1851
+ }
1852
+ }
1853
+ assignSaved(saved, skip);
1854
+ verbose_only( if (shouldMention) verbose_outputf(" merging registers (union) with existing edge"); )
1855
+ }
1856
+
1857
+ void Assembler::assignSaved(RegAlloc &saved, RegisterMask skip)
1858
+ {
1859
+ // now reassign mainline registers
1860
+ for (Register r=FirstReg; r <= LastReg; r = nextreg(r))
1861
+ {
1862
+ LIns *i = saved.getActive(r);
1863
+ if (i && !(skip&rmask(r)))
1864
+ findSpecificRegFor(i, r);
1865
+ }
1866
+ debug_only(saved.used = 0); // marker that we are no longer in exit path
1867
+ }
1868
+
1869
+ void Assembler::setCallTable(const CallInfo* functions)
1870
+ {
1871
+ _functions = functions;
1872
+ }
1873
+
1874
+ #ifdef NJ_VERBOSE
1875
+ char Assembler::outline[8192];
1876
+ char Assembler::outlineEOL[512];
1877
+
1878
+ void Assembler::outputForEOL(const char* format, ...)
1879
+ {
1880
+ va_list args;
1881
+ va_start(args, format);
1882
+ outlineEOL[0] = '\0';
1883
+ vsprintf(outlineEOL, format, args);
1884
+ }
1885
+
1886
+ void Assembler::outputf(const char* format, ...)
1887
+ {
1888
+ va_list args;
1889
+ va_start(args, format);
1890
+ outline[0] = '\0';
1891
+ vsprintf(outline, format, args);
1892
+ output(outline);
1893
+ }
1894
+
1895
+ void Assembler::output(const char* s)
1896
+ {
1897
+ if (_outputCache)
1898
+ {
1899
+ char* str = (char*)_gc->Alloc(strlen(s)+1);
1900
+ strcpy(str, s);
1901
+ _outputCache->add(str);
1902
+ }
1903
+ else
1904
+ {
1905
+ _frago->core()->console << s << "\n";
1906
+ }
1907
+ }
1908
+
1909
+ void Assembler::output_asm(const char* s)
1910
+ {
1911
+ if (!verbose_enabled())
1912
+ return;
1913
+ output(s);
1914
+ }
1915
+
1916
+ char* Assembler::outputAlign(char *s, int col)
1917
+ {
1918
+ int len = strlen(s);
1919
+ int add = ((col-len)>0) ? col-len : 1;
1920
+ memset(&s[len], ' ', add);
1921
+ s[col] = '\0';
1922
+ return &s[col];
1923
+ }
1924
+ #endif // verbose
1925
+
1926
+ #endif /* FEATURE_NANOJIT */
1927
+
1928
+ #if defined(FEATURE_NANOJIT) || defined(NJ_VERBOSE)
1929
+ uint32_t CallInfo::_count_args(uint32_t mask) const
1930
+ {
1931
+ uint32_t argc = 0;
1932
+ uint32_t argt = _argtypes;
1933
+ for (uint32_t i = 0; i < MAXARGS; ++i) {
1934
+ argt >>= 2;
1935
+ if (!argt)
1936
+ break;
1937
+ argc += (argt & mask) != 0;
1938
+ }
1939
+ return argc;
1940
+ }
1941
+
1942
+ uint32_t CallInfo::get_sizes(ArgSize* sizes) const
1943
+ {
1944
+ uint32_t argt = _argtypes;
1945
+ uint32_t argc = 0;
1946
+ for (uint32_t i = 0; i < MAXARGS; i++) {
1947
+ argt >>= 2;
1948
+ ArgSize a = ArgSize(argt&3);
1949
+ if (a != ARGSIZE_NONE) {
1950
+ sizes[argc++] = a;
1951
+ } else {
1952
+ break;
1953
+ }
1954
+ }
1955
+ if (isIndirect()) {
1956
+ // add one more arg for indirect call address
1957
+ argc++;
1958
+ }
1959
+ return argc;
1960
+ }
1961
+
1962
+ void LabelStateMap::add(LIns *label, NIns *addr, RegAlloc &regs) {
1963
+ LabelState *st = NJ_NEW(gc, LabelState)(addr, regs);
1964
+ labels.put(label, st);
1965
+ }
1966
+
1967
+ LabelStateMap::~LabelStateMap() {
1968
+ clear();
1969
+ }
1970
+
1971
+ void LabelStateMap::clear() {
1972
+ LabelState *st;
1973
+
1974
+ while (!labels.isEmpty()) {
1975
+ st = labels.removeLast();
1976
+ delete st;
1977
+ }
1978
+ }
1979
+
1980
+ LabelState* LabelStateMap::get(LIns *label) {
1981
+ return labels.get(label);
1982
+ }
1983
+ }
1984
+ #endif // FEATURE_NANOJIT