johnson 1.2.0 → 2.0.0.pre0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,1322 @@
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 AVMPLUS_PORTING_API
42
+ #include "portapi_nanojit.h"
43
+ #endif
44
+
45
+ #ifdef UNDER_CE
46
+ #include <cmnintrin.h>
47
+ #endif
48
+
49
+ #if defined(AVMPLUS_LINUX)
50
+ #include <asm/unistd.h>
51
+ #endif
52
+
53
+ namespace nanojit
54
+ {
55
+ #ifdef FEATURE_NANOJIT
56
+
57
+ #ifdef NJ_VERBOSE
58
+ const char* regNames[] = {"r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","r10","r11","IP","SP","LR","PC"};
59
+
60
+ #endif
61
+ const Register Assembler::argRegs[] = { R0, R1, R2, R3 };
62
+ const Register Assembler::retRegs[] = { R0, R1 };
63
+ const Register Assembler::savedRegs[] = { R4, R5, R6, R7 };
64
+
65
+ void Assembler::nInit(AvmCore*)
66
+ {
67
+ // Thumb mode does not have conditional move, alas
68
+ has_cmov = false;
69
+ }
70
+
71
+ NIns* Assembler::genPrologue(RegisterMask needSaving)
72
+ {
73
+ /**
74
+ * Prologue
75
+ */
76
+
77
+ // NJ_RESV_OFFSET is space at the top of the stack for us
78
+ // to use for parameter passing (8 bytes at the moment)
79
+ uint32_t stackNeeded = 4 * _activation.highwatermark + NJ_STACK_OFFSET;
80
+ uint32_t savingCount = 0;
81
+
82
+ uint32_t savingMask = 0;
83
+ savingCount = 5; // R4-R7, LR
84
+ savingMask = 0xF0;
85
+ (void)needSaving;
86
+
87
+ // so for alignment purposes we've pushed return addr, fp, and savingCount registers
88
+ uint32_t stackPushed = 4 * (2+savingCount);
89
+ uint32_t aligned = alignUp(stackNeeded + stackPushed, NJ_ALIGN_STACK);
90
+ int32_t amt = aligned - stackPushed;
91
+
92
+ // Make room on stack for what we are doing
93
+ if (amt)
94
+ {
95
+ // largest value is 508 (7-bits << 2)
96
+ if (amt>508)
97
+ {
98
+ int size = 508;
99
+ while (size>0)
100
+ {
101
+ SUBi(SP, size);
102
+ amt -= size;
103
+ size = amt;
104
+ if (size>508)
105
+ size=508;
106
+ }
107
+ }
108
+ else
109
+ SUBi(SP, amt);
110
+
111
+ }
112
+ verbose_only( verbose_outputf(" %p:",_nIns); )
113
+ verbose_only( verbose_output(" patch entry"); )
114
+ NIns *patchEntry = _nIns;
115
+
116
+ MR(FRAME_PTR, SP);
117
+ PUSH_mask(savingMask|rmask(LR));
118
+ return patchEntry;
119
+ }
120
+
121
+ void Assembler::nFragExit(LInsp guard)
122
+ {
123
+ SideExit* exit = guard->exit();
124
+ Fragment *frag = exit->target;
125
+ GuardRecord *lr;
126
+ if (frag && frag->fragEntry)
127
+ {
128
+ JMP(frag->fragEntry);
129
+ lr = 0;
130
+ }
131
+ else
132
+ {
133
+ // target doesn't exit yet. emit jump to epilog, and set up to patch later.
134
+ lr = placeGuardRecord(guard);
135
+
136
+ BL(_epilogue);
137
+
138
+ lr->jmp = _nIns;
139
+ }
140
+
141
+ // pop the stack frame first
142
+ MR(SP, FRAME_PTR);
143
+
144
+ #ifdef NJ_VERBOSE
145
+ if (_frago->core()->config.show_stats) {
146
+ // load R1 with Fragment *fromFrag, target fragment
147
+ // will make use of this when calling fragenter().
148
+ int fromfrag = int((Fragment*)_thisfrag);
149
+ LDi(argRegs[1], fromfrag);
150
+ }
151
+ #endif
152
+
153
+ // return value is GuardRecord*
154
+ LDi(R2, int(lr));
155
+ }
156
+
157
+ NIns* Assembler::genEpilogue(RegisterMask restore)
158
+ {
159
+ (void)restore;
160
+ if (false) {
161
+ // interworking
162
+ BX(R3); // return
163
+ POPr(R3); // POP LR into R3
164
+ POP_mask(0xF0); // {R4-R7}
165
+ } else {
166
+ // return to Thumb caller
167
+ POP_mask(0xF0|rmask(PC));
168
+ }
169
+ MR(R0,R2); // return LinkRecord*
170
+ return _nIns;
171
+ }
172
+
173
+ void Assembler::asm_call(LInsp ins)
174
+ {
175
+ const CallInfo* call = ins->callInfo();
176
+ uint32_t atypes = call->_argtypes;
177
+ uint32_t roffset = 0;
178
+
179
+ // we need to detect if we have arg0 as LO followed by arg1 as F;
180
+ // in that case, we need to skip using r1 -- the F needs to be
181
+ // loaded in r2/r3, at least according to the ARM EABI and gcc 4.2's
182
+ // generated code.
183
+ bool arg0IsInt32FollowedByFloat = false;
184
+ while ((atypes & 3) != ARGSIZE_NONE) {
185
+ if (((atypes >> 4) & 3) == ARGSIZE_LO &&
186
+ ((atypes >> 2) & 3) == ARGSIZE_F &&
187
+ ((atypes >> 6) & 3) == ARGSIZE_NONE)
188
+ {
189
+ arg0IsInt32FollowedByFloat = true;
190
+ break;
191
+ }
192
+ atypes >>= 2;
193
+ }
194
+
195
+ CALL(call);
196
+ ArgSize sizes[10];
197
+ uint32_t argc = call->get_sizes(sizes);
198
+ for(uint32_t i=0; i < argc; i++)
199
+ {
200
+ uint32_t j = argc - i - 1;
201
+ ArgSize sz = sizes[j];
202
+ NanoAssert(sz == ARGSIZE_LO || sz == ARGSIZE_Q);
203
+ // pre-assign registers R0-R3 for arguments (if they fit)
204
+ Register r = (i+roffset) < 4 ? argRegs[i+roffset] : UnknownReg;
205
+ asm_arg(sz, ins->arg(j), r);
206
+
207
+ if (i == 0 && arg0IsInt32FollowedByFloat)
208
+ roffset = 1;
209
+ }
210
+ }
211
+
212
+ void Assembler::nMarkExecute(Page* page, int flags)
213
+ {
214
+ NanoAssert(sizeof(Page) == NJ_PAGE_SIZE);
215
+ #ifdef UNDER_CE
216
+ static const DWORD kProtFlags[4] =
217
+ {
218
+ PAGE_READONLY, // 0
219
+ PAGE_READWRITE, // PAGE_WRITE
220
+ PAGE_EXECUTE_READ, // PAGE_EXEC
221
+ PAGE_EXECUTE_READWRITE // PAGE_EXEC|PAGE_WRITE
222
+ };
223
+ DWORD prot = kProtFlags[flags & (PAGE_WRITE|PAGE_EXEC)];
224
+ DWORD dwOld;
225
+ BOOL res = VirtualProtect(page, NJ_PAGE_SIZE, prot, &dwOld);
226
+ if (!res)
227
+ {
228
+ // todo: we can't abort or assert here, we have to fail gracefully.
229
+ NanoAssertMsg(false, "FATAL ERROR: VirtualProtect() failed\n");
230
+ }
231
+ #endif
232
+ #ifdef AVMPLUS_PORTING_API
233
+ NanoJIT_PortAPI_MarkExecutable(page, (void*)((char*)page+NJ_PAGE_SIZE), flags);
234
+ // todo, must add error-handling to the portapi
235
+ #endif
236
+ }
237
+
238
+ Register Assembler::nRegisterAllocFromSet(int set)
239
+ {
240
+ // need to implement faster way
241
+ int i=0;
242
+ while (!(set & rmask((Register)i)))
243
+ i ++;
244
+ _allocator.free &= ~rmask((Register)i);
245
+ return (Register) i;
246
+ }
247
+
248
+ void Assembler::nRegisterResetAll(RegAlloc& a)
249
+ {
250
+ // add scratch registers to our free list for the allocator
251
+ a.clear();
252
+ a.used = 0;
253
+ a.free = rmask(R0) | rmask(R1) | rmask(R2) | rmask(R3) | rmask(R4) | rmask(R5);
254
+ debug_only(a.managed = a.free);
255
+ }
256
+
257
+ void Assembler::nPatchBranch(NIns* branch, NIns* target)
258
+ {
259
+ // Patch the jump in a loop
260
+
261
+ // This is ALWAYS going to be a long branch (using the BL instruction)
262
+ // Which is really 2 instructions, so we need to modify both
263
+ // XXX -- this is B, not BL, at least on non-Thumb..
264
+
265
+ // branch+2 because PC is always 2 instructions ahead on ARM/Thumb
266
+ int32_t offset = int(target) - int(branch+2);
267
+
268
+ //printf("---patching branch at 0x%08x to location 0x%08x (%d-0x%08x)\n", branch, target, offset, offset);
269
+
270
+ NanoAssert(-(1<<21) <= offset && offset < (1<<21));
271
+ *branch++ = (NIns)(0xF000 | (offset>>12)&0x7FF);
272
+ *branch = (NIns)(0xF800 | (offset>>1)&0x7FF);
273
+ }
274
+
275
+ RegisterMask Assembler::hint(LIns* i, RegisterMask allow /* = ~0 */)
276
+ {
277
+ uint32_t op = i->opcode();
278
+ int prefer = ~0;
279
+
280
+ if (op==LIR_call || op==LIR_fcall)
281
+ prefer = rmask(R0);
282
+ else if (op == LIR_callh)
283
+ prefer = rmask(R1);
284
+ else if (op == LIR_param)
285
+ prefer = rmask(imm2register(argRegs[i->imm8()]));
286
+
287
+ if (_allocator.free & allow & prefer)
288
+ allow &= prefer;
289
+ return allow;
290
+ }
291
+
292
+ void Assembler::asm_qjoin(LIns *ins)
293
+ {
294
+ int d = findMemFor(ins);
295
+ AvmAssert(d);
296
+ LIns* lo = ins->oprnd1();
297
+ LIns* hi = ins->oprnd2();
298
+
299
+ Register r = findRegFor(hi, GpRegs);
300
+ ST(FP, d+4, r);
301
+
302
+ // okay if r gets recycled.
303
+ r = findRegFor(lo, GpRegs);
304
+ ST(FP, d, r);
305
+ freeRsrcOf(ins, false); // if we had a reg in use, emit a ST to flush it to mem
306
+ }
307
+
308
+ void Assembler::asm_store32(LIns *value, int dr, LIns *base)
309
+ {
310
+ // make sure what is in a register
311
+ Reservation *rA, *rB;
312
+ findRegFor2(GpRegs, value, rA, base, rB);
313
+ Register ra = rA->reg;
314
+ Register rb = rB->reg;
315
+ ST(rb, dr, ra);
316
+ }
317
+
318
+ void Assembler::asm_restore(LInsp i, Reservation *resv, Register r)
319
+ {
320
+ (void)resv;
321
+ int d = findMemFor(i);
322
+ LD(r, d, FP);
323
+ verbose_only(if (_verbose) {
324
+ outputf(" restore %s",_thisfrag->lirbuf->names->formatRef(i));
325
+ })
326
+ }
327
+
328
+ void Assembler::asm_spill(LInsp i, Reservation *resv, bool pop)
329
+ {
330
+ (void)i;
331
+ (void)pop;
332
+ if (resv->arIndex)
333
+ {
334
+ int d = disp(resv);
335
+ // save to spill location
336
+ Register rr = resv->reg;
337
+ ST(FP, d, rr);
338
+ verbose_only(if (_verbose){
339
+ outputf(" spill %s",_thisfrag->lirbuf->names->formatRef(i));
340
+ })
341
+ }
342
+ }
343
+
344
+ void Assembler::asm_load64(LInsp ins)
345
+ {
346
+ LIns* base = ins->oprnd1();
347
+ int db = ins->oprnd2()->constval();
348
+ Reservation *resv = getresv(ins);
349
+ int dr = disp(resv);
350
+ NanoAssert(resv->reg == UnknownReg && dr != 0);
351
+
352
+ Register rb = findRegFor(base, GpRegs);
353
+ resv->reg = UnknownReg;
354
+ asm_mmq(FP, dr, rb, db);
355
+ freeRsrcOf(ins, false);
356
+ }
357
+
358
+ void Assembler::asm_store64(LInsp value, int dr, LInsp base)
359
+ {
360
+ int da = findMemFor(value);
361
+ Register rb = findRegFor(base, GpRegs);
362
+ asm_mmq(rb, dr, FP, da);
363
+ }
364
+
365
+
366
+ void Assembler::asm_quad(LInsp ins)
367
+ {
368
+ Reservation *rR = getresv(ins);
369
+ int d = disp(rR);
370
+ freeRsrcOf(ins, false);
371
+ if (d)
372
+ {
373
+ const int32_t* p = (const int32_t*) (ins-2);
374
+ STi(FP,d+4,p[1]);
375
+ STi(FP,d,p[0]);
376
+ }
377
+ }
378
+
379
+ NIns* Assembler::asm_branch(bool branchOnFalse, LInsp cond, NIns* targ, bool isfar)
380
+ {
381
+ NIns* at = 0;
382
+ LOpcode condop = cond->opcode();
383
+ NanoAssert(cond->isCond());
384
+ #ifndef NJ_SOFTFLOAT
385
+ if (condop >= LIR_feq && condop <= LIR_fge)
386
+ {
387
+ return asm_jmpcc(branchOnFalse, cond, targ);
388
+ }
389
+ #endif
390
+ // produce the branch
391
+ if (branchOnFalse)
392
+ {
393
+ if (condop == LIR_eq)
394
+ JNE(targ);
395
+ else if (condop == LIR_ov)
396
+ JNO(targ);
397
+ else if (condop == LIR_cs)
398
+ JNC(targ);
399
+ else if (condop == LIR_lt)
400
+ JNL(targ);
401
+ else if (condop == LIR_le)
402
+ JNLE(targ);
403
+ else if (condop == LIR_gt)
404
+ JNG(targ);
405
+ else if (condop == LIR_ge)
406
+ JNGE(targ);
407
+ else if (condop == LIR_ult)
408
+ JNB(targ);
409
+ else if (condop == LIR_ule)
410
+ JNBE(targ);
411
+ else if (condop == LIR_ugt)
412
+ JNA(targ);
413
+ else //if (condop == LIR_uge)
414
+ JNAE(targ);
415
+ }
416
+ else // op == LIR_xt
417
+ {
418
+ if (condop == LIR_eq)
419
+ JE(targ);
420
+ else if (condop == LIR_ov)
421
+ JO(targ);
422
+ else if (condop == LIR_cs)
423
+ JC(targ);
424
+ else if (condop == LIR_lt)
425
+ JL(targ);
426
+ else if (condop == LIR_le)
427
+ JLE(targ);
428
+ else if (condop == LIR_gt)
429
+ JG(targ);
430
+ else if (condop == LIR_ge)
431
+ JGE(targ);
432
+ else if (condop == LIR_ult)
433
+ JB(targ);
434
+ else if (condop == LIR_ule)
435
+ JBE(targ);
436
+ else if (condop == LIR_ugt)
437
+ JA(targ);
438
+ else //if (condop == LIR_uge)
439
+ JAE(targ);
440
+ }
441
+ at = _nIns;
442
+ asm_cmp(cond);
443
+ return at;
444
+ }
445
+
446
+ void Assembler::asm_cmp(LIns *cond)
447
+ {
448
+ LOpcode condop = cond->opcode();
449
+
450
+ // LIR_ov and LIR_cs recycle the flags set by arithmetic ops
451
+ if ((condop == LIR_ov) || (condop == LIR_cs))
452
+ return;
453
+
454
+ LInsp lhs = cond->oprnd1();
455
+ LInsp rhs = cond->oprnd2();
456
+ Reservation *rA, *rB;
457
+
458
+ // Not supported yet.
459
+ NanoAssert(!lhs->isQuad() && !rhs->isQuad());
460
+
461
+ // ready to issue the compare
462
+ if (rhs->isconst())
463
+ {
464
+ int c = rhs->constval();
465
+ if (c == 0 && cond->isop(LIR_eq)) {
466
+ Register r = findRegFor(lhs, GpRegs);
467
+ TEST(r,r);
468
+ // No 64-bit immediates so fall-back to below
469
+ }
470
+ else if (!rhs->isQuad()) {
471
+ Register r = getBaseReg(lhs, c, GpRegs);
472
+ CMPi(r, c);
473
+ }
474
+ }
475
+ else
476
+ {
477
+ findRegFor2(GpRegs, lhs, rA, rhs, rB);
478
+ Register ra = rA->reg;
479
+ Register rb = rB->reg;
480
+ CMP(ra, rb);
481
+ }
482
+ }
483
+
484
+ void Assembler::asm_loop(LInsp ins, NInsList& loopJumps)
485
+ {
486
+ (void)ins;
487
+ JMP_long_placeholder(); // jump to SOT
488
+ verbose_only( if (_verbose && _outputCache) { _outputCache->removeLast(); outputf(" jmp SOT"); } );
489
+
490
+ loopJumps.add(_nIns);
491
+
492
+ #ifdef NJ_VERBOSE
493
+ // branching from this frag to ourself.
494
+ if (_frago->core()->config.show_stats)
495
+ LDi(argRegs[1], int((Fragment*)_thisfrag));
496
+ #endif
497
+
498
+ assignSavedParams();
499
+
500
+ // restore first parameter, the only one we use
501
+ LInsp state = _thisfrag->lirbuf->state;
502
+ findSpecificRegFor(state, argRegs[state->imm8()]);
503
+ }
504
+
505
+ void Assembler::asm_fcond(LInsp ins)
506
+ {
507
+ // only want certain regs
508
+ Register r = prepResultReg(ins, AllowableFlagRegs);
509
+ asm_setcc(r, ins);
510
+ #ifdef NJ_ARM_VFP
511
+ SETE(r);
512
+ #else
513
+ // SETcc only sets low 8 bits, so extend
514
+ MOVZX8(r,r);
515
+ SETNP(r);
516
+ #endif
517
+ asm_fcmp(ins);
518
+ }
519
+
520
+ void Assembler::asm_cond(LInsp ins)
521
+ {
522
+ // only want certain regs
523
+ LOpcode op = ins->opcode();
524
+ Register r = prepResultReg(ins, AllowableFlagRegs);
525
+ // SETcc only sets low 8 bits, so extend
526
+ MOVZX8(r,r);
527
+ if (op == LIR_eq)
528
+ SETE(r);
529
+ else if (op == LIR_ov)
530
+ SETO(r);
531
+ else if (op == LIR_cs)
532
+ SETC(r);
533
+ else if (op == LIR_lt)
534
+ SETL(r);
535
+ else if (op == LIR_le)
536
+ SETLE(r);
537
+ else if (op == LIR_gt)
538
+ SETG(r);
539
+ else if (op == LIR_ge)
540
+ SETGE(r);
541
+ else if (op == LIR_ult)
542
+ SETB(r);
543
+ else if (op == LIR_ule)
544
+ SETBE(r);
545
+ else if (op == LIR_ugt)
546
+ SETA(r);
547
+ else // if (op == LIR_uge)
548
+ SETAE(r);
549
+ asm_cmp(ins);
550
+ }
551
+
552
+ void Assembler::asm_arith(LInsp ins)
553
+ {
554
+ LOpcode op = ins->opcode();
555
+ LInsp lhs = ins->oprnd1();
556
+ LInsp rhs = ins->oprnd2();
557
+
558
+ Register rb = UnknownReg;
559
+ RegisterMask allow = GpRegs;
560
+ bool forceReg = (op == LIR_mul || !rhs->isconst());
561
+
562
+ #ifdef NANOJIT_ARM
563
+ // Arm can't do an immediate op with immediates
564
+ // outside of +/-255 (for AND) r outside of
565
+ // 0..255 for others.
566
+ if (!forceReg)
567
+ {
568
+ if (rhs->isconst() && !isU8(rhs->constval()))
569
+ forceReg = true;
570
+ }
571
+ #endif
572
+
573
+ if (lhs != rhs && forceReg)
574
+ {
575
+ if ((rb = asm_binop_rhs_reg(ins)) == UnknownReg) {
576
+ rb = findRegFor(rhs, allow);
577
+ }
578
+ allow &= ~rmask(rb);
579
+ }
580
+ else if ((op == LIR_add||op == LIR_addp) && lhs->isop(LIR_alloc) && rhs->isconst()) {
581
+ // add alloc+const, use lea
582
+ Register rr = prepResultReg(ins, allow);
583
+ int d = findMemFor(lhs) + rhs->constval();
584
+ LEA(rr, d, FP);
585
+ }
586
+
587
+ Register rr = prepResultReg(ins, allow);
588
+ Reservation* rA = getresv(lhs);
589
+ Register ra;
590
+ // if this is last use of lhs in reg, we can re-use result reg
591
+ if (rA == 0 || (ra = rA->reg) == UnknownReg)
592
+ ra = findSpecificRegFor(lhs, rr);
593
+ // else, rA already has a register assigned.
594
+
595
+ if (forceReg)
596
+ {
597
+ if (lhs == rhs)
598
+ rb = ra;
599
+
600
+ if (op == LIR_add || op == LIR_addp)
601
+ ADD(rr, rb);
602
+ else if (op == LIR_sub)
603
+ SUB(rr, rb);
604
+ else if (op == LIR_mul)
605
+ MUL(rr, rb);
606
+ else if (op == LIR_and)
607
+ AND(rr, rb);
608
+ else if (op == LIR_or)
609
+ OR(rr, rb);
610
+ else if (op == LIR_xor)
611
+ XOR(rr, rb);
612
+ else if (op == LIR_lsh)
613
+ SHL(rr, rb);
614
+ else if (op == LIR_rsh)
615
+ SAR(rr, rb);
616
+ else if (op == LIR_ush)
617
+ SHR(rr, rb);
618
+ else
619
+ NanoAssertMsg(0, "Unsupported");
620
+ }
621
+ else
622
+ {
623
+ int c = rhs->constval();
624
+ if (op == LIR_add || op == LIR_addp) {
625
+ {
626
+ ADDi(rr, c);
627
+ }
628
+ } else if (op == LIR_sub) {
629
+ {
630
+ SUBi(rr, c);
631
+ }
632
+ } else if (op == LIR_and)
633
+ ANDi(rr, c);
634
+ else if (op == LIR_or)
635
+ ORi(rr, c);
636
+ else if (op == LIR_xor)
637
+ XORi(rr, c);
638
+ else if (op == LIR_lsh)
639
+ SHLi(rr, c);
640
+ else if (op == LIR_rsh)
641
+ SARi(rr, c);
642
+ else if (op == LIR_ush)
643
+ SHRi(rr, c);
644
+ else
645
+ NanoAssertMsg(0, "Unsupported");
646
+ }
647
+
648
+ if ( rr != ra )
649
+ MR(rr,ra);
650
+ }
651
+
652
+ void Assembler::asm_neg_not(LInsp ins)
653
+ {
654
+ LOpcode op = ins->opcode();
655
+ Register rr = prepResultReg(ins, GpRegs);
656
+
657
+ LIns* lhs = ins->oprnd1();
658
+ Reservation *rA = getresv(lhs);
659
+ // if this is last use of lhs in reg, we can re-use result reg
660
+ Register ra;
661
+ if (rA == 0 || (ra=rA->reg) == UnknownReg)
662
+ ra = findSpecificRegFor(lhs, rr);
663
+ // else, rA already has a register assigned.
664
+
665
+ if (op == LIR_not)
666
+ NOT(rr);
667
+ else
668
+ NEG(rr);
669
+
670
+ if ( rr != ra )
671
+ MR(rr,ra);
672
+ }
673
+
674
+ void Assembler::asm_ld(LInsp ins)
675
+ {
676
+ LOpcode op = ins->opcode();
677
+ LIns* base = ins->oprnd1();
678
+ LIns* disp = ins->oprnd2();
679
+ Register rr = prepResultReg(ins, GpRegs);
680
+ int d = disp->constval();
681
+ Register ra = getBaseReg(base, d, GpRegs);
682
+ if (op == LIR_ldcb)
683
+ LD8Z(rr, d, ra);
684
+ else
685
+ LD(rr, d, ra);
686
+ }
687
+
688
+ void Assembler::asm_cmov(LInsp ins)
689
+ {
690
+ LOpcode op = ins->opcode();
691
+ LIns* condval = ins->oprnd1();
692
+ NanoAssert(condval->isCmp());
693
+
694
+ LIns* values = ins->oprnd2();
695
+
696
+ NanoAssert(values->opcode() == LIR_2);
697
+ LIns* iftrue = values->oprnd1();
698
+ LIns* iffalse = values->oprnd2();
699
+
700
+ NanoAssert(op == LIR_qcmov || (!iftrue->isQuad() && !iffalse->isQuad()));
701
+
702
+ const Register rr = prepResultReg(ins, GpRegs);
703
+
704
+ // this code assumes that neither LD nor MR nor MRcc set any of the condition flags.
705
+ // (This is true on Intel, is it true on all architectures?)
706
+ const Register iffalsereg = findRegFor(iffalse, GpRegs & ~rmask(rr));
707
+ if (op == LIR_cmov) {
708
+ switch (condval->opcode())
709
+ {
710
+ // note that these are all opposites...
711
+ case LIR_eq: MRNE(rr, iffalsereg); break;
712
+ case LIR_ov: MRNO(rr, iffalsereg); break;
713
+ case LIR_cs: MRNC(rr, iffalsereg); break;
714
+ case LIR_lt: MRGE(rr, iffalsereg); break;
715
+ case LIR_le: MRG(rr, iffalsereg); break;
716
+ case LIR_gt: MRLE(rr, iffalsereg); break;
717
+ case LIR_ge: MRL(rr, iffalsereg); break;
718
+ case LIR_ult: MRAE(rr, iffalsereg); break;
719
+ case LIR_ule: MRA(rr, iffalsereg); break;
720
+ case LIR_ugt: MRBE(rr, iffalsereg); break;
721
+ case LIR_uge: MRB(rr, iffalsereg); break;
722
+ debug_only( default: NanoAssert(0); break; )
723
+ }
724
+ } else if (op == LIR_qcmov) {
725
+ NanoAssert(0);
726
+ }
727
+ /*const Register iftruereg =*/ findSpecificRegFor(iftrue, rr);
728
+ asm_cmp(condval);
729
+ }
730
+
731
+ void Assembler::asm_qhi(LInsp ins)
732
+ {
733
+ Register rr = prepResultReg(ins, GpRegs);
734
+ LIns *q = ins->oprnd1();
735
+ int d = findMemFor(q);
736
+ LD(rr, d+4, FP);
737
+ }
738
+
739
+ void Assembler::asm_param(LInsp ins)
740
+ {
741
+ uint32_t a = ins->imm8();
742
+ uint32_t kind = ins->imm8b();
743
+ if (kind == 0) {
744
+ // ordinary param
745
+ AbiKind abi = _thisfrag->lirbuf->abi;
746
+ uint32_t abi_regcount = abi == ABI_FASTCALL ? 2 : abi == ABI_THISCALL ? 1 : 0;
747
+ if (a < abi_regcount) {
748
+ // incoming arg in register
749
+ prepResultReg(ins, rmask(argRegs[a]));
750
+ } else {
751
+ // incoming arg is on stack, and EBP points nearby (see genPrologue)
752
+ Register r = prepResultReg(ins, GpRegs);
753
+ int d = (a - abi_regcount) * sizeof(intptr_t) + 8;
754
+ LD(r, d, FP);
755
+ }
756
+ }
757
+ else {
758
+ // saved param
759
+ prepResultReg(ins, rmask(savedRegs[a]));
760
+ }
761
+ }
762
+
763
+ void Assembler::asm_short(LInsp ins)
764
+ {
765
+ Register rr = prepResultReg(ins, GpRegs);
766
+ int32_t val = ins->imm16();
767
+ if (val == 0)
768
+ XOR(rr,rr);
769
+ else
770
+ LDi(rr, val);
771
+ }
772
+
773
+ void Assembler::asm_int(LInsp ins)
774
+ {
775
+ Register rr = prepResultReg(ins, GpRegs);
776
+ int32_t val = ins->imm32();
777
+ if (val == 0)
778
+ XOR(rr,rr);
779
+ else
780
+ LDi(rr, val);
781
+ }
782
+
783
+ void Assembler::asm_quad(LInsp ins)
784
+ {
785
+ Reservation *rR = getresv(ins);
786
+ Register rr = rR->reg;
787
+ if (rr != UnknownReg)
788
+ {
789
+ // @todo -- add special-cases for 0 and 1
790
+ _allocator.retire(rr);
791
+ rR->reg = UnknownReg;
792
+ NanoAssert((rmask(rr) & FpRegs) != 0);
793
+
794
+ const double d = ins->constvalf();
795
+ const uint64_t q = ins->constvalq();
796
+ if (rmask(rr) & XmmRegs) {
797
+ if (q == 0.0) {
798
+ // test (int64)0 since -0.0 == 0.0
799
+ SSE_XORPDr(rr, rr);
800
+ } else if (d == 1.0) {
801
+ // 1.0 is extremely frequent and worth special-casing!
802
+ static const double k_ONE = 1.0;
803
+ LDSDm(rr, &k_ONE);
804
+ } else {
805
+ findMemFor(ins);
806
+ const int d = disp(rR);
807
+ SSE_LDQ(rr, d, FP);
808
+ }
809
+ } else {
810
+ if (q == 0.0) {
811
+ // test (int64)0 since -0.0 == 0.0
812
+ FLDZ();
813
+ } else if (d == 1.0) {
814
+ FLD1();
815
+ } else {
816
+ findMemFor(ins);
817
+ int d = disp(rR);
818
+ FLDQ(d,FP);
819
+ }
820
+ }
821
+ }
822
+
823
+ // @todo, if we used xor, ldsd, fldz, etc above, we don't need mem here
824
+ int d = disp(rR);
825
+ freeRsrcOf(ins, false);
826
+ if (d)
827
+ {
828
+ const int32_t* p = (const int32_t*) (ins-2);
829
+ STi(FP,d+4,p[1]);
830
+ STi(FP,d,p[0]);
831
+ }
832
+ }
833
+
834
+ void Assembler::asm_qlo(LInsp ins)
835
+ {
836
+ LIns *q = ins->oprnd1();
837
+ Reservation *resv = getresv(ins);
838
+ Register rr = resv->reg;
839
+ if (rr == UnknownReg) {
840
+ // store quad in spill loc
841
+ int d = disp(resv);
842
+ freeRsrcOf(ins, false);
843
+ Register qr = findRegFor(q, XmmRegs);
844
+ SSE_MOVDm(d, FP, qr);
845
+ } else {
846
+ freeRsrcOf(ins, false);
847
+ Register qr = findRegFor(q, XmmRegs);
848
+ SSE_MOVD(rr,qr);
849
+ }
850
+ }
851
+
852
+ void Assembler::asm_nongp_copy(Register r, Register s)
853
+ {
854
+ // we will need this for VFP support
855
+ (void)r; (void)s;
856
+ NanoAssert(false);
857
+ }
858
+
859
+ Register Assembler::asm_binop_rhs_reg(LInsp ins)
860
+ {
861
+ return UnknownReg;
862
+ }
863
+
864
+ /**
865
+ * copy 64 bits: (rd+dd) <- (rs+ds)
866
+ */
867
+ void Assembler::asm_mmq(Register rd, int dd, Register rs, int ds)
868
+ {
869
+ // value is either a 64bit struct or maybe a float
870
+ // that isn't live in an FPU reg. Either way, don't
871
+ // put it in an FPU reg just to load & store it.
872
+ // get a scratch reg
873
+ Register t = registerAlloc(GpRegs & ~(rmask(rd)|rmask(rs)));
874
+ _allocator.addFree(t);
875
+ ST(rd, dd+4, t);
876
+ LD(t, ds+4, rs);
877
+ ST(rd, dd, t);
878
+ LD(t, ds, rs);
879
+ }
880
+
881
+ void Assembler::asm_pusharg(LInsp p)
882
+ {
883
+ // arg goes on stack
884
+ Reservation* rA = getresv(p);
885
+ if (rA == 0)
886
+ {
887
+ Register ra = findRegFor(p, GpRegs);
888
+ ST(SP,0,ra);
889
+ }
890
+ else if (rA->reg == UnknownReg)
891
+ {
892
+ ST(SP,0,Scratch);
893
+ LD(Scratch,disp(rA),FP);
894
+ }
895
+ else
896
+ {
897
+ ST(SP,0,rA->reg);
898
+ }
899
+ }
900
+
901
+ void Assembler::nativePageReset()
902
+ {
903
+ _nPool = 0;
904
+ _nSlot = 0;
905
+ _nExitPool = 0;
906
+ _nExitSlot = 0;
907
+ }
908
+
909
+ void Assembler::nativePageSetup()
910
+ {
911
+ if (!_nIns) _nIns = pageAlloc();
912
+ if (!_nExitIns) _nExitIns = pageAlloc(true);
913
+ //fprintf(stderr, "assemble onto %x exits into %x\n", (int)_nIns, (int)_nExitIns);
914
+
915
+ if (!_nPool) {
916
+ _nSlot = _nPool = (int*)_nIns;
917
+
918
+ // Make original pool at end of page. Currently
919
+ // we are pointing off the end of the original page,
920
+ // so back up 1+NJ_CPOOL_SIZE
921
+ _nPool = (int*)((int)_nIns - (sizeof(int32_t)*NJ_CPOOL_SIZE));
922
+
923
+ // _nSlot points at last slot in pool (fill upwards)
924
+ _nSlot = _nPool + (NJ_CPOOL_SIZE-1);
925
+
926
+ // Move _nIns to the top of the pool
927
+ _nIns = (NIns*)_nPool;
928
+
929
+ // no branch needed since this follows the epilogue
930
+ }
931
+ }
932
+
933
+ void Assembler::flushCache(NIns* n1, NIns* n2) {
934
+ #if defined(UNDER_CE)
935
+ // we changed the code, so we need to do this (sadly)
936
+ FlushInstructionCache(GetCurrentProcess(), NULL, NULL);
937
+ #elif defined(AVMPLUS_LINUX)
938
+ // Just need to clear this one page (not even the whole page really)
939
+ //Page *page = (Page*)pageTop(_nIns);
940
+ register unsigned long _beg __asm("a1") = (unsigned long)(n1);
941
+ register unsigned long _end __asm("a2") = (unsigned long)(n2);
942
+ register unsigned long _flg __asm("a3") = 0;
943
+ register unsigned long _swi __asm("r7") = 0xF0002;
944
+ __asm __volatile ("swi 0 @ sys_cacheflush" : "=r" (_beg) : "0" (_beg), "r" (_end), "r" (_flg), "r" (_swi));
945
+ #endif
946
+ }
947
+
948
+ NIns* Assembler::asm_adjustBranch(NIns* at, NIns* target)
949
+ {
950
+ NIns* save = _nIns;
951
+ NIns* was = (NIns*) (((((*(at+2))&0x7ff)<<12) | (((*(at+1))&0x7ff)<<1)) + (at-2+2));
952
+
953
+ _nIns = at + 2;
954
+ BL(target);
955
+
956
+ flushCache(_nIns, _nIns+2);
957
+
958
+ #ifdef AVMPLUS_PORTING_API
959
+ // XXX save.._nIns+2? really?
960
+ NanoJIT_PortAPI_FlushInstructionCache(save, _nIns+2);
961
+ #endif
962
+
963
+ _nIns = save;
964
+
965
+ return was;
966
+ }
967
+
968
+ void Assembler::STi(Register b, int32_t d, int32_t v)
969
+ {
970
+ ST(b, d, Scratch);
971
+ LDi(Scratch, v);
972
+ }
973
+
974
+ bool isB11(NIns *target, NIns *cur)
975
+ {
976
+ NIns *br_base = (cur-1)+2;
977
+ int br_off = int(target) - int(br_base);
978
+ return (-(1<<11) <= br_off && br_off < (1<<11));
979
+ }
980
+
981
+ void Assembler::underrunProtect(int bytes)
982
+ {
983
+ NanoAssertMsg(bytes<=LARGEST_UNDERRUN_PROT, "constant LARGEST_UNDERRUN_PROT is too small");
984
+
985
+ // perhaps bytes + sizeof(PageHeader)/sizeof(NIns) + 4 ?
986
+ intptr_t u = bytes + 4;
987
+ if (!samepage(_nIns-u, _nIns-1)) {
988
+ NIns* target = _nIns;
989
+ _nIns = pageAlloc(_inExit);
990
+ // might be able to do a B instead of BL (save an instruction)
991
+ if (isB11(target, _nIns))
992
+ {
993
+ NIns *br_base = (_nIns-1)+2;
994
+ int br_off = int(target) - int(br_base);
995
+ *(--_nIns) = (NIns)(0xE000 | ((br_off>>1)&0x7FF));
996
+ }
997
+ else
998
+ {
999
+ int offset = int(target)-int(_nIns-2+2);
1000
+ *(--_nIns) = (NIns)(0xF800 | ((offset>>1)&0x7FF) );
1001
+ *(--_nIns) = (NIns)(0xF000 | ((offset>>12)&0x7FF) );
1002
+ }
1003
+ }
1004
+ }
1005
+
1006
+ bool isB22(NIns *target, NIns *cur)
1007
+ {
1008
+ int offset = int(target)-int(cur-2+2);
1009
+ return (-(1<<22) <= offset && offset < (1<<22));
1010
+ }
1011
+
1012
+ void Assembler::BL(NIns* target)
1013
+ {
1014
+ underrunProtect(4);
1015
+ NanoAssert(isB22(target,_nIns));
1016
+ int offset = int(target)-int(_nIns-2+2);
1017
+ *(--_nIns) = (NIns)(0xF800 | ((offset>>1)&0x7FF) );
1018
+ *(--_nIns) = (NIns)(0xF000 | ((offset>>12)&0x7FF) );
1019
+ asm_output("bl %X offset=%d",(int)target, offset);
1020
+ }
1021
+
1022
+
1023
+ void Assembler::B(NIns *target)
1024
+ {
1025
+ underrunProtect(2);
1026
+ NanoAssert(isB11(target,_nIns));
1027
+ NIns *br_base = (_nIns-1)+2;
1028
+ int br_off = int(target) - int(br_base);
1029
+ NanoAssert(-(1<<11) <= br_off && br_off < (1<<11));
1030
+ *(--_nIns) = (NIns)(0xE000 | ((br_off>>1)&0x7FF));
1031
+ asm_output("b %X offset=%d", (int)target, br_off);
1032
+ }
1033
+
1034
+ void Assembler::JMP(NIns *target)
1035
+ {
1036
+ underrunProtect(4);
1037
+ if (isB11(target,_nIns))
1038
+ B(target);
1039
+ else
1040
+ BL(target);
1041
+ }
1042
+
1043
+ void Assembler::PUSH_mask(RegisterMask mask)
1044
+ {
1045
+ NanoAssert((mask&(0xff|rmask(LR)))==mask);
1046
+ underrunProtect(2);
1047
+ if (mask & rmask(LR)) {
1048
+ mask &= ~rmask(LR);
1049
+ mask |= rmask(R8);
1050
+ }
1051
+ *(--_nIns) = (NIns)(0xB400 | mask);
1052
+ asm_output("push {%x}", mask);
1053
+ }
1054
+
1055
+ void Assembler::POPr(Register r)
1056
+ {
1057
+ underrunProtect(2);
1058
+ NanoAssert(((unsigned)r)<8 || r == PC);
1059
+ if (r == PC)
1060
+ r = R8;
1061
+ *(--_nIns) = (NIns)(0xBC00 | (1<<(r)));
1062
+ asm_output("pop {%s}",gpn(r));
1063
+ }
1064
+
1065
+ void Assembler::POP_mask(RegisterMask mask)
1066
+ {
1067
+ NanoAssert((mask&(0xff|rmask(PC)))==mask);
1068
+ underrunProtect(2);
1069
+ if (mask & rmask(PC)) {
1070
+ mask &= ~rmask(PC);
1071
+ mask |= rmask(R8);
1072
+ }
1073
+ *(--_nIns) = (NIns)(0xBC00 | mask);
1074
+ asm_output("pop {%x}", mask);
1075
+ }
1076
+
1077
+ void Assembler::MOVi(Register r, int32_t v)
1078
+ {
1079
+ NanoAssert(isU8(v));
1080
+ underrunProtect(2);
1081
+ *(--_nIns) = (NIns)(0x2000 | r<<8 | v);
1082
+ asm_output("mov %s,#%d",gpn(r),v);
1083
+ }
1084
+
1085
+ void Assembler::LDi(Register r, int32_t v)
1086
+ {
1087
+ if (isU8(v)) {
1088
+ MOVi(r,v);
1089
+ } else if (isU8(-v)) {
1090
+ NEG(r);
1091
+ MOVi(r,-v);
1092
+ } else {
1093
+ underrunProtect(2);
1094
+ LD32_nochk(r, v);
1095
+ }
1096
+ }
1097
+
1098
+ void Assembler::B_cond(int c, NIns *target)
1099
+ {
1100
+ #ifdef NJ_VERBOSE
1101
+ static const char *ccname[] = { "eq","ne","hs","lo","mi","pl","vs","vc","hi","ls","ge","lt","gt","le","al","nv" };
1102
+ #endif
1103
+
1104
+ underrunProtect(6);
1105
+ int tt = int(target) - int(_nIns-1+2);
1106
+ if (tt < (1<<8) && tt >= -(1<<8)) {
1107
+ *(--_nIns) = (NIns)(0xD000 | ((c)<<8) | (tt>>1)&0xFF );
1108
+ asm_output("b%s %X offset=%d", ccname[c], target, tt);
1109
+ } else {
1110
+ NIns *skip = _nIns;
1111
+ BL(target);
1112
+ c ^= 1;
1113
+ *(--_nIns) = (NIns)(0xD000 | c<<8 | 1 );
1114
+ asm_output("b%s %X", ccname[c], skip);
1115
+ }
1116
+ }
1117
+
1118
+ void Assembler::STR_sp(int32_t offset, Register reg)
1119
+ {
1120
+ NanoAssert((offset&3)==0);// require natural alignment
1121
+ int32_t off = offset>>2;
1122
+ NanoAssert(isU8(off));
1123
+ underrunProtect(2);
1124
+ *(--_nIns) = (NIns)(0x9000 | ((reg)<<8) | off );
1125
+ asm_output("str %s, %d(%s)", gpn(reg), offset, gpn(SP));
1126
+ }
1127
+
1128
+ void Assembler::STR_index(Register base, Register off, Register reg)
1129
+ {
1130
+ underrunProtect(2);
1131
+ *(--_nIns) = (NIns)(0x5000 | (off<<6) | (base<<3) | (reg));
1132
+ asm_output("str %s,(%s+%s)",gpn(reg),gpn(base),gpn(off));
1133
+ }
1134
+
1135
+ void Assembler::STR_m(Register base, int32_t offset, Register reg)
1136
+ {
1137
+ NanoAssert(offset >= 0 && offset < 128 && (offset&3)==0);
1138
+ underrunProtect(2);
1139
+ int32_t off = offset>>2;
1140
+ *(--_nIns) = (NIns)(0x6000 | off<<6 | base<<3 | reg);
1141
+ asm_output("str %s,%d(%s)", gpn(reg), offset, gpn(base));
1142
+ }
1143
+
1144
+ void Assembler::LDMIA(Register base, RegisterMask regs)
1145
+ {
1146
+ underrunProtect(2);
1147
+ NanoAssert((regs&rmask(base))==0 && isU8(regs));
1148
+ *(--_nIns) = (NIns)(0xC800 | base<<8 | regs);
1149
+ asm_output("ldmia %s!,{%x}", gpn(base), regs);
1150
+ }
1151
+
1152
+ void Assembler::STMIA(Register base, RegisterMask regs)
1153
+ {
1154
+ underrunProtect(2);
1155
+ NanoAssert((regs&rmask(base))==0 && isU8(regs));
1156
+ *(--_nIns) = (NIns)(0xC000 | base<<8 | regs);
1157
+ asm_output("stmia %s!,{%x}", gpn(base), regs);
1158
+ }
1159
+
1160
+ void Assembler::ST(Register base, int32_t offset, Register reg)
1161
+ {
1162
+ NanoAssert((offset&3)==0);// require natural alignment
1163
+ int off = offset>>2;
1164
+ if (base==SP) {
1165
+ STR_sp(offset, reg);
1166
+ } else if ((offset)<0) {
1167
+ STR_index(base, Scratch, reg);
1168
+ NEG(Scratch);
1169
+ if (offset < -255) {
1170
+ NanoAssert(offset >= -1020);
1171
+ SHLi(Scratch, 2);
1172
+ MOVi(Scratch, -off);
1173
+ }
1174
+ else {
1175
+ MOVi(Scratch, -offset);
1176
+ }
1177
+ } else {
1178
+ underrunProtect(6);
1179
+ if (off<32) {
1180
+ STR_m(base, offset, reg);
1181
+ }
1182
+ else {
1183
+ STR_index(base, Scratch, reg);
1184
+ if (offset > 255) {
1185
+ SHLi(Scratch, 2);
1186
+ MOVi(Scratch, off);
1187
+ }
1188
+ else {
1189
+ MOVi(Scratch, offset);
1190
+ }
1191
+ }
1192
+ }
1193
+ }
1194
+
1195
+ void Assembler::ADDi8(Register r, int32_t i)
1196
+ {
1197
+ underrunProtect(2);
1198
+ NanoAssert(isU8(i));
1199
+ *(--_nIns) = (NIns)(0x3000 | r<<8 | i);
1200
+ asm_output("add %s,#%d", gpn(r), i);
1201
+ }
1202
+
1203
+ void Assembler::ADDi(Register r, int32_t i)
1204
+ {
1205
+ if (i < 0 && i != 0x80000000) {
1206
+ SUBi(r, -i);
1207
+ }
1208
+ else if (r == SP) {
1209
+ NanoAssert((i&3)==0 && i >= 0 && i < (1<<9));
1210
+ underrunProtect(2);
1211
+ *(--_nIns) = (NIns)(0xB000 | i>>2);
1212
+ asm_output("add %s,#%d", gpn(SP), i);
1213
+ }
1214
+ else if (isU8(i)) {
1215
+ ADDi8(r,i);
1216
+ }
1217
+ else if (i >= 0 && i <= (255+255)) {
1218
+ ADDi8(r,i-255);
1219
+ ADDi8(r,255);
1220
+ }
1221
+ else {
1222
+ ADD(r, Scratch);
1223
+ LDi(Scratch, i);
1224
+ }
1225
+ }
1226
+
1227
+ void Assembler::SUBi8(Register r, int32_t i)
1228
+ {
1229
+ underrunProtect(2);
1230
+ NanoAssert(isU8(i));
1231
+ *(--_nIns) = (NIns)(0x3800 | r<<8 | i);
1232
+ asm_output("sub %s,#%d", gpn(r), i);
1233
+ }
1234
+
1235
+ void Assembler::SUBi(Register r, int32_t i)
1236
+ {
1237
+ if (i < 0 && i != 0x80000000) {
1238
+ ADDi(r, -i);
1239
+ }
1240
+ else if (r == SP) {
1241
+ NanoAssert((i&3)==0 && i >= 0 && i < (1<<9));
1242
+ underrunProtect(2);
1243
+ *(--_nIns) = (NIns)(0xB080 | i>>2);
1244
+ asm_output("sub %s,#%d", gpn(SP), i);
1245
+ }
1246
+ else if (isU8(i)) {
1247
+ SUBi8(r,i);
1248
+ }
1249
+ else if (i >= 0 && i <= (255+255)) {
1250
+ SUBi8(r,i-255);
1251
+ SUBi8(r,255);
1252
+ }
1253
+ else {
1254
+ SUB(r, Scratch);
1255
+ LDi(Scratch, i);
1256
+ }
1257
+ }
1258
+
1259
+ void Assembler::CALL(const CallInfo *ci)
1260
+ {
1261
+ intptr_t addr = ci->_address;
1262
+ if (isB22((NIns*)addr, _nIns)) {
1263
+ int offset = int(addr)-int(_nIns-2+2);
1264
+ *(--_nIns) = (NIns)(0xF800 | ((offset>>1)&0x7FF) );
1265
+ *(--_nIns) = (NIns)(0xF000 | ((offset>>12)&0x7FF) );
1266
+ asm_output("call %08X:%s", addr, ci->_name);
1267
+ }
1268
+ else
1269
+ {
1270
+ underrunProtect(2*(10));
1271
+
1272
+ if ( (((int(_nIns))&0xFFFF)%4) != 0)
1273
+ *(--_nIns) = (NIns)0;
1274
+
1275
+ *(--_nIns) = (NIns)(0xF800 | (((-14)&0xFFF)>>1) );
1276
+ *(--_nIns) = (NIns)(0xF000 | (((-14)>>12)&0x7FF) );
1277
+
1278
+ *(--_nIns) = (NIns)(0x4600 | (1<<7) | (Scratch<<3) | (IP&7));
1279
+ *(--_nIns) = (NIns)0;
1280
+ *(--_nIns) = (short)((addr) >> 16);
1281
+ *(--_nIns) = (short)((addr) & 0xFFFF);
1282
+ *(--_nIns) = (NIns)(0x4700 | (IP<<3));
1283
+ *(--_nIns) = (NIns)(0xE000 | (4>>1));
1284
+ *(--_nIns) = (NIns)(0x4800 | (Scratch<<8) | (1));
1285
+ asm_output("call %08X:%s", addr, ci->_name);
1286
+ }
1287
+ }
1288
+
1289
+ void Assembler::LD32_nochk(Register r, int32_t imm)
1290
+ {
1291
+ // Can we reach the current slot/pool?
1292
+ int offset = (int)(_nSlot) - (int)(_nIns);
1293
+ if ((offset>=NJ_MAX_CPOOL_OFFSET || offset<0) ||
1294
+ (_nSlot < _nPool))
1295
+ {
1296
+ // cant reach, or no room
1297
+ // need a new pool
1298
+
1299
+ // Make sure we have space for a pool and the LDR
1300
+ underrunProtect(sizeof(int32_t)*NJ_CPOOL_SIZE+1);
1301
+
1302
+ NIns* skip = _nIns;
1303
+
1304
+ _nPool = (int*)(((int)_nIns - (sizeof(int32_t)*NJ_CPOOL_SIZE)) &~3);
1305
+ _nSlot = _nPool + (NJ_CPOOL_SIZE-1);
1306
+ _nIns = (NIns*)_nPool;
1307
+
1308
+ // jump over the pool
1309
+ B(skip);
1310
+ //*(--_nIns) = (NIns)( COND_AL | (0x5<<25) | (NJ_CPOOL_SIZE-1) );
1311
+ }
1312
+
1313
+ *(_nSlot--) = (int)imm;
1314
+
1315
+ NIns *data = (NIns*)(_nSlot+1);;
1316
+
1317
+ int data_off = int(data) - (int(_nIns+1)&~3);
1318
+ *(--_nIns) = (NIns)(0x4800 | r<<8 | data_off>>2);
1319
+ asm_output("ldr %s,%d(PC) [%X]",gpn(r),data_off,(int)data);
1320
+ }
1321
+ #endif /* FEATURE_NANOJIT */
1322
+ }