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.
- data/CHANGELOG.rdoc +8 -0
- data/Manifest.txt +762 -48
- data/README.rdoc +2 -1
- data/Rakefile +90 -18
- data/ext/spidermonkey/conversions.c +9 -2
- data/ext/spidermonkey/ruby_land_proxy.c +1 -1
- data/ext/spidermonkey/runtime.h +1 -1
- data/ext/tracemonkey/context.cc +125 -0
- data/ext/tracemonkey/context.h +19 -0
- data/ext/tracemonkey/conversions.cc +365 -0
- data/ext/tracemonkey/conversions.h +32 -0
- data/ext/tracemonkey/debugger.cc +234 -0
- data/ext/tracemonkey/debugger.h +10 -0
- data/ext/tracemonkey/extconf.rb +37 -0
- data/ext/tracemonkey/extensions.cc +37 -0
- data/ext/tracemonkey/extensions.h +12 -0
- data/ext/tracemonkey/global.cc +40 -0
- data/ext/tracemonkey/global.h +11 -0
- data/ext/tracemonkey/idhash.cc +16 -0
- data/ext/tracemonkey/idhash.h +8 -0
- data/ext/tracemonkey/immutable_node.cc +1199 -0
- data/ext/tracemonkey/immutable_node.cc.erb +559 -0
- data/ext/tracemonkey/immutable_node.h +22 -0
- data/ext/tracemonkey/jroot.h +215 -0
- data/ext/tracemonkey/js_land_proxy.cc +620 -0
- data/ext/tracemonkey/js_land_proxy.h +20 -0
- data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
- data/ext/tracemonkey/ruby_land_proxy.h +38 -0
- data/ext/tracemonkey/runtime.cc +454 -0
- data/ext/tracemonkey/runtime.h +27 -0
- data/ext/tracemonkey/split_global.cc +392 -0
- data/ext/tracemonkey/split_global.h +11 -0
- data/ext/tracemonkey/tracemonkey.cc +23 -0
- data/ext/tracemonkey/tracemonkey.h +32 -0
- data/lib/johnson.rb +12 -4
- data/lib/johnson/error.rb +5 -0
- data/lib/johnson/js/prelude.js +16 -1
- data/lib/johnson/parser.rb +2 -1
- data/lib/johnson/runtime.rb +87 -26
- data/lib/johnson/spidermonkey/runtime.rb +7 -16
- data/lib/johnson/tracemonkey.rb +13 -0
- data/lib/johnson/tracemonkey/context.rb +10 -0
- data/lib/johnson/tracemonkey/debugger.rb +67 -0
- data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
- data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
- data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
- data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
- data/lib/johnson/tracemonkey/runtime.rb +80 -0
- data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
- data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
- data/test/helper.rb +23 -4
- data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
- data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
- data/test/johnson/generic/conversions/helper.rb +1 -0
- data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
- data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
- data/test/johnson/generic/default_test.rb +12 -0
- data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
- data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
- data/test/johnson/generic/helper.rb +1 -0
- data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
- data/test/johnson/generic/nodes/export_test.rb +11 -0
- data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
- data/test/johnson/generic/nodes/helper.rb +1 -0
- data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
- data/test/johnson/generic/nodes/import_test.rb +15 -0
- data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
- data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
- data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
- data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
- data/test/johnson/generic/version_test.rb +13 -0
- data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
- data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
- data/test/johnson/generic/visitors/helper.rb +1 -0
- data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
- data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
- data/test/johnson/tracemonkey/context_test.rb +21 -0
- data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
- data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
- data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
- data/test/johnson/tracemonkey/runtime_test.rb +41 -0
- data/test/johnson/tracemonkey/split_global_test.rb +32 -0
- data/vendor/spidermonkey/js.pkg +2 -0
- data/vendor/tracemonkey/Makefile.in +668 -0
- data/vendor/tracemonkey/Makefile.ref +483 -0
- data/vendor/tracemonkey/README.html +54 -0
- data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
- data/vendor/tracemonkey/Y.js +19 -0
- data/vendor/tracemonkey/aclocal.m4 +9 -0
- data/vendor/tracemonkey/bench.sh +5 -0
- data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
- data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
- data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
- data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
- data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
- data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
- data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
- data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
- data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
- data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
- data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
- data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
- data/vendor/tracemonkey/build/hcc +111 -0
- data/vendor/tracemonkey/build/hcpp +155 -0
- data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
- data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
- data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
- data/vendor/tracemonkey/builtins.tbl +91 -0
- data/vendor/tracemonkey/call.js +13 -0
- data/vendor/tracemonkey/config.mk +206 -0
- data/vendor/tracemonkey/config/Makefile.in +106 -0
- data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
- data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
- data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
- data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
- data/vendor/tracemonkey/config/config.mk +881 -0
- data/vendor/tracemonkey/config/fastcwd.pl +66 -0
- data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
- data/vendor/tracemonkey/config/insure.mk +53 -0
- data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
- data/vendor/tracemonkey/config/milestone.pl +112 -0
- data/vendor/tracemonkey/config/milestone.txt +13 -0
- data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
- data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
- data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
- data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
- data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
- data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
- data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
- data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
- data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
- data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
- data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
- data/vendor/tracemonkey/config/nfspwd.pl +50 -0
- data/vendor/tracemonkey/config/nsinstall.c +481 -0
- data/vendor/tracemonkey/config/nsinstall.py +155 -0
- data/vendor/tracemonkey/config/pathsub.c +247 -0
- data/vendor/tracemonkey/config/pathsub.h +74 -0
- data/vendor/tracemonkey/config/preprocessor.pl +671 -0
- data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
- data/vendor/tracemonkey/config/revdepth.pl +51 -0
- data/vendor/tracemonkey/config/rules.mk +2310 -0
- data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
- data/vendor/tracemonkey/config/static-checking.js +92 -0
- data/vendor/tracemonkey/config/string-format.js +61 -0
- data/vendor/tracemonkey/config/system-headers +1035 -0
- data/vendor/tracemonkey/config/version.mk +85 -0
- data/vendor/tracemonkey/config/version_win.pl +442 -0
- data/vendor/tracemonkey/configure +14183 -0
- data/vendor/tracemonkey/configure.in +5363 -0
- data/vendor/tracemonkey/correct.sh +23 -0
- data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
- data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
- data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
- data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
- data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
- data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
- data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
- data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
- data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
- data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
- data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
- data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
- data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
- data/vendor/tracemonkey/correct/check-mont.js +119 -0
- data/vendor/tracemonkey/dtoa.c +3335 -0
- data/vendor/tracemonkey/editline/Makefile.in +55 -0
- data/vendor/tracemonkey/editline/Makefile.ref +143 -0
- data/vendor/tracemonkey/editline/README +83 -0
- data/vendor/tracemonkey/editline/editline.3 +175 -0
- data/vendor/tracemonkey/editline/editline.c +1371 -0
- data/vendor/tracemonkey/editline/editline.h +135 -0
- data/vendor/tracemonkey/editline/sysunix.c +182 -0
- data/vendor/tracemonkey/editline/unix.h +82 -0
- data/vendor/tracemonkey/if.js +13 -0
- data/vendor/tracemonkey/imacro_asm.js.in +396 -0
- data/vendor/tracemonkey/imacros.c.out +1034 -0
- data/vendor/tracemonkey/imacros.jsasm +770 -0
- data/vendor/tracemonkey/javascript-trace.d +73 -0
- data/vendor/tracemonkey/jitstats.tbl +55 -0
- data/vendor/tracemonkey/js-config.h.in +82 -0
- data/vendor/tracemonkey/js-config.in +111 -0
- data/vendor/tracemonkey/js.mdp +0 -0
- data/vendor/tracemonkey/js.msg +312 -0
- data/vendor/tracemonkey/js3240.rc +79 -0
- data/vendor/tracemonkey/jsOS240.def +654 -0
- data/vendor/tracemonkey/jsapi.cpp +6005 -0
- data/vendor/tracemonkey/jsapi.h +2727 -0
- data/vendor/tracemonkey/jsarena.cpp +450 -0
- data/vendor/tracemonkey/jsarena.h +318 -0
- data/vendor/tracemonkey/jsarray.cpp +3664 -0
- data/vendor/tracemonkey/jsarray.h +238 -0
- data/vendor/tracemonkey/jsatom.cpp +1244 -0
- data/vendor/tracemonkey/jsatom.h +493 -0
- data/vendor/tracemonkey/jsbit.h +249 -0
- data/vendor/tracemonkey/jsbool.cpp +184 -0
- data/vendor/tracemonkey/jsbool.h +88 -0
- data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
- data/vendor/tracemonkey/jsbuiltins.h +456 -0
- data/vendor/tracemonkey/jsclist.h +139 -0
- data/vendor/tracemonkey/jscntxt.cpp +1816 -0
- data/vendor/tracemonkey/jscntxt.h +1541 -0
- data/vendor/tracemonkey/jscompat.h +57 -0
- data/vendor/tracemonkey/jsconfig.mk +181 -0
- data/vendor/tracemonkey/jscpucfg.cpp +194 -0
- data/vendor/tracemonkey/jscpucfg.h +91 -0
- data/vendor/tracemonkey/jsdate.cpp +2465 -0
- data/vendor/tracemonkey/jsdate.h +129 -0
- data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
- data/vendor/tracemonkey/jsdbgapi.h +500 -0
- data/vendor/tracemonkey/jsdhash.cpp +876 -0
- data/vendor/tracemonkey/jsdhash.h +588 -0
- data/vendor/tracemonkey/jsdtoa.cpp +572 -0
- data/vendor/tracemonkey/jsdtoa.h +131 -0
- data/vendor/tracemonkey/jsdtracef.c +318 -0
- data/vendor/tracemonkey/jsdtracef.h +81 -0
- data/vendor/tracemonkey/jsemit.cpp +7292 -0
- data/vendor/tracemonkey/jsemit.h +802 -0
- data/vendor/tracemonkey/jsexn.cpp +1337 -0
- data/vendor/tracemonkey/jsexn.h +96 -0
- data/vendor/tracemonkey/jsfile.cpp +2747 -0
- data/vendor/tracemonkey/jsfile.h +56 -0
- data/vendor/tracemonkey/jsfile.msg +90 -0
- data/vendor/tracemonkey/jsfun.cpp +3089 -0
- data/vendor/tracemonkey/jsfun.h +366 -0
- data/vendor/tracemonkey/jsgc.cpp +3816 -0
- data/vendor/tracemonkey/jsgc.h +429 -0
- data/vendor/tracemonkey/jshash.cpp +477 -0
- data/vendor/tracemonkey/jshash.h +151 -0
- data/vendor/tracemonkey/jsify.pl +483 -0
- data/vendor/tracemonkey/jsinterp.cpp +7441 -0
- data/vendor/tracemonkey/jsinterp.h +666 -0
- data/vendor/tracemonkey/jsinvoke.cpp +42 -0
- data/vendor/tracemonkey/jsiter.cpp +1040 -0
- data/vendor/tracemonkey/jsiter.h +140 -0
- data/vendor/tracemonkey/jskeyword.tbl +124 -0
- data/vendor/tracemonkey/jskwgen.cpp +460 -0
- data/vendor/tracemonkey/jslibmath.h +69 -0
- data/vendor/tracemonkey/jslock.cpp +1512 -0
- data/vendor/tracemonkey/jslock.h +325 -0
- data/vendor/tracemonkey/jslocko.asm +60 -0
- data/vendor/tracemonkey/jslog2.cpp +111 -0
- data/vendor/tracemonkey/jslong.h +167 -0
- data/vendor/tracemonkey/jsmath.cpp +806 -0
- data/vendor/tracemonkey/jsmath.h +63 -0
- data/vendor/tracemonkey/jsnum.cpp +1374 -0
- data/vendor/tracemonkey/jsnum.h +280 -0
- data/vendor/tracemonkey/jsobj.cpp +6165 -0
- data/vendor/tracemonkey/jsobj.h +870 -0
- data/vendor/tracemonkey/json.cpp +1338 -0
- data/vendor/tracemonkey/json.h +108 -0
- data/vendor/tracemonkey/jsopcode.cpp +5484 -0
- data/vendor/tracemonkey/jsopcode.h +434 -0
- data/vendor/tracemonkey/jsopcode.tbl +591 -0
- data/vendor/tracemonkey/jsoplengen.cpp +121 -0
- data/vendor/tracemonkey/jsotypes.h +202 -0
- data/vendor/tracemonkey/jsparse.cpp +9257 -0
- data/vendor/tracemonkey/jsparse.h +900 -0
- data/vendor/tracemonkey/jsprf.cpp +1262 -0
- data/vendor/tracemonkey/jsprf.h +150 -0
- data/vendor/tracemonkey/jsproto.tbl +117 -0
- data/vendor/tracemonkey/jsprvtd.h +366 -0
- data/vendor/tracemonkey/jspubtd.h +585 -0
- data/vendor/tracemonkey/jsregexp.cpp +5051 -0
- data/vendor/tracemonkey/jsregexp.h +199 -0
- data/vendor/tracemonkey/jsreops.tbl +145 -0
- data/vendor/tracemonkey/jsscan.cpp +2040 -0
- data/vendor/tracemonkey/jsscan.h +467 -0
- data/vendor/tracemonkey/jsscope.cpp +1966 -0
- data/vendor/tracemonkey/jsscope.h +487 -0
- data/vendor/tracemonkey/jsscript.cpp +1932 -0
- data/vendor/tracemonkey/jsscript.h +345 -0
- data/vendor/tracemonkey/jsshell.msg +54 -0
- data/vendor/tracemonkey/jsstack.js +167 -0
- data/vendor/tracemonkey/jsstaticcheck.h +69 -0
- data/vendor/tracemonkey/jsstddef.h +87 -0
- data/vendor/tracemonkey/jsstdint.h +96 -0
- data/vendor/tracemonkey/jsstr.cpp +5277 -0
- data/vendor/tracemonkey/jsstr.h +702 -0
- data/vendor/tracemonkey/jstracer.cpp +10991 -0
- data/vendor/tracemonkey/jstracer.h +794 -0
- data/vendor/tracemonkey/jstypes.h +481 -0
- data/vendor/tracemonkey/jsutil.cpp +361 -0
- data/vendor/tracemonkey/jsutil.h +178 -0
- data/vendor/tracemonkey/jsversion.h +243 -0
- data/vendor/tracemonkey/jswince.asm +44 -0
- data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
- data/vendor/tracemonkey/jsxdrapi.h +220 -0
- data/vendor/tracemonkey/jsxml.cpp +8327 -0
- data/vendor/tracemonkey/jsxml.h +305 -0
- data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
- data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
- data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
- data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
- data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
- data/vendor/tracemonkey/liveconnect/README.html +712 -0
- data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
- data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
- data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
- data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
- data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
- data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
- data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
- data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
- data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
- data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
- data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
- data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
- data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
- data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
- data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
- data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
- data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
- data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
- data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
- data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
- data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
- data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
- data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
- data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
- data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
- data/vendor/tracemonkey/lock_SunOS.s +119 -0
- data/vendor/tracemonkey/mandelbrot-results.js +3 -0
- data/vendor/tracemonkey/math-partial-sums.js +32 -0
- data/vendor/tracemonkey/math-trace-tests.js +507 -0
- data/vendor/tracemonkey/md5.js +289 -0
- data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
- data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
- data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
- data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
- data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
- data/vendor/tracemonkey/nanojit/LIR.h +879 -0
- data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
- data/vendor/tracemonkey/nanojit/Native.h +127 -0
- data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
- data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
- data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
- data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
- data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
- data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
- data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
- data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
- data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
- data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
- data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
- data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
- data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
- data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
- data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
- data/vendor/tracemonkey/perfect.js +39 -0
- data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
- data/vendor/tracemonkey/prmjtime.cpp +869 -0
- data/vendor/tracemonkey/prmjtime.h +103 -0
- data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
- data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
- data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
- data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
- data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
- data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
- data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
- data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
- data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
- data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
- data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
- data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
- data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
- data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
- data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
- data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
- data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
- data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
- data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
- data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
- data/vendor/tracemonkey/resource.h +15 -0
- data/vendor/tracemonkey/rules.mk +206 -0
- data/vendor/tracemonkey/shell/Makefile.in +72 -0
- data/vendor/tracemonkey/shell/js.cpp +4719 -0
- data/vendor/tracemonkey/t/3d-cube.js +337 -0
- data/vendor/tracemonkey/t/3d-morph.js +54 -0
- data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
- data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
- data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
- data/vendor/tracemonkey/t/access-nbody.js +169 -0
- data/vendor/tracemonkey/t/access-nsieve.js +38 -0
- data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
- data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
- data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
- data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
- data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
- data/vendor/tracemonkey/t/crypto-aes.js +422 -0
- data/vendor/tracemonkey/t/crypto-md5.js +286 -0
- data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
- data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
- data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
- data/vendor/tracemonkey/t/math-cordic.js +95 -0
- data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
- data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
- data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
- data/vendor/tracemonkey/t/string-base64.js +135 -0
- data/vendor/tracemonkey/t/string-fasta.js +85 -0
- data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
- data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
- data/vendor/tracemonkey/t/string-validate-input.js +89 -0
- data/vendor/tracemonkey/time.sh +13 -0
- data/vendor/tracemonkey/trace-test.js +5564 -0
- data/vendor/tracemonkey/v8/base.js +187 -0
- data/vendor/tracemonkey/v8/crypto.js +1689 -0
- data/vendor/tracemonkey/v8/deltablue.js +880 -0
- data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
- data/vendor/tracemonkey/v8/raytrace.js +3418 -0
- data/vendor/tracemonkey/v8/richards.js +539 -0
- data/vendor/tracemonkey/v8/run-crypto.js +44 -0
- data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
- data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
- data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
- data/vendor/tracemonkey/v8/run-richards.js +44 -0
- data/vendor/tracemonkey/v8/run.js +49 -0
- data/vendor/tracemonkey/vprof/readme.txt +93 -0
- data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
- data/vendor/tracemonkey/vprof/vprof.h +245 -0
- data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
- data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
- data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
- data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
- data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
- data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
- data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
- data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
- data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
- data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
- data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
- data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
- data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
- data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
- data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
- data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
- data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
- data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
- data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
- data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
- data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
- data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
- data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
- data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
- data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
- data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
- data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
- data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
- data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
- data/vendor/tracemonkey/xpconnect/sample/README +39 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
- data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
- data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
- data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
- data/vendor/tracemonkey/xpconnect/src/README +3 -0
- data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
- data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
- data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
- data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
- data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
- data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
- data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
- data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
- data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
- data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
- data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
- data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
- data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
- data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
- data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
- data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
- data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
- data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
- data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
- data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
- data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
- data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
- data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
- data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
- data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
- data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
- data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
- data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
- data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
- data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
- data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
- data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
- data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
- data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
- data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
- data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
- data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
- data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
- data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
- data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
- data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
- data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
- data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
- data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
- data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
- data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
- data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
- data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
- data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
- data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
- data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
- data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
- data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
- data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
- data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
- data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
- data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
- data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
- metadata +782 -107
- data/test/johnson/nodes/export_test.rb +0 -9
- data/test/johnson/nodes/import_test.rb +0 -13
- 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 ®s = _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 ®s) {
|
|
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
|