johnson 1.2.0 → 2.0.0.pre0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,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