immunio 0.15.4 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +0 -27
- data/ext/immunio/Rakefile +9 -0
- data/lib/immunio/plugins/active_record.rb +1 -1
- data/lib/immunio/plugins/active_record_relation.rb +1 -1
- data/lib/immunio/plugins/environment_reporter.rb +20 -0
- data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
- data/lib/immunio/version.rb +1 -1
- data/lib/immunio/vm.rb +1 -2
- data/lua-hooks/Makefile +97 -0
- data/lua-hooks/ext/all.c +41 -52
- data/lua-hooks/ext/all.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
- data/lua-hooks/ext/libinjection/lualib.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.o +0 -0
- data/lua-hooks/ext/lpeg/lpcode.c +2 -2
- data/lua-hooks/ext/lpeg/lpcode.h +1 -1
- data/lua-hooks/ext/lpeg/lpcode.o +0 -0
- data/lua-hooks/ext/lpeg/lpprint.o +0 -0
- data/lua-hooks/ext/lpeg/lptree.c +2 -2
- data/lua-hooks/ext/lpeg/lptypes.h +1 -1
- data/lua-hooks/ext/lpeg/lpvm.c +2 -2
- data/lua-hooks/ext/lpeg/lpvm.o +0 -0
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
- data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
- data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
- data/lua-hooks/ext/luajit/Makefile +159 -0
- data/lua-hooks/ext/luajit/README +16 -0
- data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
- data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
- data/lua-hooks/ext/luajit/doc/changes.html +804 -0
- data/lua-hooks/ext/luajit/doc/contact.html +104 -0
- data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
- data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
- data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
- data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
- data/lua-hooks/ext/luajit/doc/faq.html +186 -0
- data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
- data/lua-hooks/ext/luajit/doc/install.html +659 -0
- data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
- data/lua-hooks/ext/luajit/doc/running.html +309 -0
- data/lua-hooks/ext/luajit/doc/status.html +118 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
- data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
- data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
- data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
- data/lua-hooks/ext/luajit/src/Makefile +697 -0
- data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
- data/lua-hooks/ext/luajit/src/host/README +4 -0
- data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
- data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
- data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
- data/lua-hooks/ext/luajit/src/host/minilua +0 -0
- data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
- data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
- data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
- data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
- data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
- data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
- data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
- data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
- data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
- data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
- data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
- data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
- data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
- data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
- data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
- data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
- data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
- data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
- data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
- data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
- data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
- data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
- data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
- data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
- data/lua-hooks/ext/luajit/src/lj.supp +26 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
- data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
- data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
- data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
- data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
- data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
- data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
- data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
- data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
- data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
- data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
- data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
- data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
- data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
- data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
- data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
- data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
- data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
- data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
- data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
- data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
- data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
- data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
- data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
- data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
- data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
- data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
- data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
- data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
- data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
- data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
- data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
- data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
- data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
- data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
- data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
- data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
- data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
- data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
- data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
- data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
- data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
- data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
- data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
- data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
- data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
- data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
- data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
- data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
- data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
- data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
- data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
- data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
- data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
- data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
- data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
- data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
- data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
- data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
- data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
- data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
- data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
- data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
- data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
- data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
- data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
- data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
- data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
- data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
- data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
- data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
- data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
- data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
- data/lua-hooks/ext/luajit/src/luajit +0 -0
- data/lua-hooks/ext/luajit/src/luajit.c +570 -0
- data/lua-hooks/ext/luajit/src/luajit.h +79 -0
- data/lua-hooks/ext/luajit/src/luajit.o +0 -0
- data/lua-hooks/ext/luajit/src/lualib.h +43 -0
- data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
- data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
- data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
- data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
- data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
- data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
- data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
- data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
- data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
- data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
- data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
- data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
- data/lua-hooks/lib/boot.lua +37 -2
- metadata +372 -69
- data/lua-hooks/ext/bitop/README +0 -22
- data/lua-hooks/ext/bitop/bit.c +0 -189
- data/lua-hooks/ext/extconf.rb +0 -38
- data/lua-hooks/ext/lua/COPYRIGHT +0 -34
- data/lua-hooks/ext/lua/lapi.c +0 -1087
- data/lua-hooks/ext/lua/lapi.h +0 -16
- data/lua-hooks/ext/lua/lauxlib.c +0 -652
- data/lua-hooks/ext/lua/lbaselib.c +0 -659
- data/lua-hooks/ext/lua/lcode.c +0 -831
- data/lua-hooks/ext/lua/lcode.h +0 -76
- data/lua-hooks/ext/lua/ldblib.c +0 -398
- data/lua-hooks/ext/lua/ldebug.c +0 -638
- data/lua-hooks/ext/lua/ldebug.h +0 -33
- data/lua-hooks/ext/lua/ldo.c +0 -519
- data/lua-hooks/ext/lua/ldo.h +0 -57
- data/lua-hooks/ext/lua/ldump.c +0 -164
- data/lua-hooks/ext/lua/lfunc.c +0 -174
- data/lua-hooks/ext/lua/lfunc.h +0 -34
- data/lua-hooks/ext/lua/lgc.c +0 -710
- data/lua-hooks/ext/lua/lgc.h +0 -110
- data/lua-hooks/ext/lua/linit.c +0 -38
- data/lua-hooks/ext/lua/liolib.c +0 -556
- data/lua-hooks/ext/lua/llex.c +0 -463
- data/lua-hooks/ext/lua/llex.h +0 -81
- data/lua-hooks/ext/lua/llimits.h +0 -128
- data/lua-hooks/ext/lua/lmathlib.c +0 -263
- data/lua-hooks/ext/lua/lmem.c +0 -86
- data/lua-hooks/ext/lua/lmem.h +0 -49
- data/lua-hooks/ext/lua/loadlib.c +0 -705
- data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
- data/lua-hooks/ext/lua/lobject.c +0 -214
- data/lua-hooks/ext/lua/lobject.h +0 -381
- data/lua-hooks/ext/lua/lopcodes.c +0 -102
- data/lua-hooks/ext/lua/lopcodes.h +0 -268
- data/lua-hooks/ext/lua/loslib.c +0 -243
- data/lua-hooks/ext/lua/lparser.c +0 -1339
- data/lua-hooks/ext/lua/lparser.h +0 -82
- data/lua-hooks/ext/lua/lstate.c +0 -214
- data/lua-hooks/ext/lua/lstate.h +0 -169
- data/lua-hooks/ext/lua/lstring.c +0 -111
- data/lua-hooks/ext/lua/lstring.h +0 -31
- data/lua-hooks/ext/lua/lstrlib.c +0 -871
- data/lua-hooks/ext/lua/ltable.c +0 -588
- data/lua-hooks/ext/lua/ltable.h +0 -40
- data/lua-hooks/ext/lua/ltablib.c +0 -287
- data/lua-hooks/ext/lua/ltm.c +0 -75
- data/lua-hooks/ext/lua/ltm.h +0 -54
- data/lua-hooks/ext/lua/lua.c +0 -392
- data/lua-hooks/ext/lua/lua.def +0 -131
- data/lua-hooks/ext/lua/lua.rc +0 -28
- data/lua-hooks/ext/lua/lua_dll.rc +0 -26
- data/lua-hooks/ext/lua/luac.c +0 -200
- data/lua-hooks/ext/lua/luac.rc +0 -1
- data/lua-hooks/ext/lua/luaconf.h +0 -763
- data/lua-hooks/ext/lua/luaconf.h.in +0 -724
- data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
- data/lua-hooks/ext/lua/lualib.h +0 -53
- data/lua-hooks/ext/lua/lundump.c +0 -227
- data/lua-hooks/ext/lua/lundump.h +0 -36
- data/lua-hooks/ext/lua/lvm.c +0 -767
- data/lua-hooks/ext/lua/lvm.h +0 -36
- data/lua-hooks/ext/lua/lzio.c +0 -82
- data/lua-hooks/ext/lua/lzio.h +0 -67
- data/lua-hooks/ext/lua/print.c +0 -227
@@ -0,0 +1,65 @@
|
|
1
|
+
/*
|
2
|
+
** Debugging and introspection.
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
4
|
+
*/
|
5
|
+
|
6
|
+
#ifndef _LJ_DEBUG_H
|
7
|
+
#define _LJ_DEBUG_H
|
8
|
+
|
9
|
+
#include "lj_obj.h"
|
10
|
+
|
11
|
+
typedef struct lj_Debug {
|
12
|
+
/* Common fields. Must be in the same order as in lua.h. */
|
13
|
+
int event;
|
14
|
+
const char *name;
|
15
|
+
const char *namewhat;
|
16
|
+
const char *what;
|
17
|
+
const char *source;
|
18
|
+
int currentline;
|
19
|
+
int nups;
|
20
|
+
int linedefined;
|
21
|
+
int lastlinedefined;
|
22
|
+
char short_src[LUA_IDSIZE];
|
23
|
+
int i_ci;
|
24
|
+
/* Extended fields. Only valid if lj_debug_getinfo() is called with ext = 1.*/
|
25
|
+
int nparams;
|
26
|
+
int isvararg;
|
27
|
+
} lj_Debug;
|
28
|
+
|
29
|
+
LJ_FUNC cTValue *lj_debug_frame(lua_State *L, int level, int *size);
|
30
|
+
LJ_FUNC BCLine LJ_FASTCALL lj_debug_line(GCproto *pt, BCPos pc);
|
31
|
+
LJ_FUNC const char *lj_debug_uvname(GCproto *pt, uint32_t idx);
|
32
|
+
LJ_FUNC const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp);
|
33
|
+
LJ_FUNC const char *lj_debug_slotname(GCproto *pt, const BCIns *pc,
|
34
|
+
BCReg slot, const char **name);
|
35
|
+
LJ_FUNC const char *lj_debug_funcname(lua_State *L, cTValue *frame,
|
36
|
+
const char **name);
|
37
|
+
LJ_FUNC void lj_debug_shortname(char *out, GCstr *str, BCLine line);
|
38
|
+
LJ_FUNC void lj_debug_addloc(lua_State *L, const char *msg,
|
39
|
+
cTValue *frame, cTValue *nextframe);
|
40
|
+
LJ_FUNC void lj_debug_pushloc(lua_State *L, GCproto *pt, BCPos pc);
|
41
|
+
LJ_FUNC int lj_debug_getinfo(lua_State *L, const char *what, lj_Debug *ar,
|
42
|
+
int ext);
|
43
|
+
#if LJ_HASPROFILE
|
44
|
+
LJ_FUNC void lj_debug_dumpstack(lua_State *L, SBuf *sb, const char *fmt,
|
45
|
+
int depth);
|
46
|
+
#endif
|
47
|
+
|
48
|
+
/* Fixed internal variable names. */
|
49
|
+
#define VARNAMEDEF(_) \
|
50
|
+
_(FOR_IDX, "(for index)") \
|
51
|
+
_(FOR_STOP, "(for limit)") \
|
52
|
+
_(FOR_STEP, "(for step)") \
|
53
|
+
_(FOR_GEN, "(for generator)") \
|
54
|
+
_(FOR_STATE, "(for state)") \
|
55
|
+
_(FOR_CTL, "(for control)")
|
56
|
+
|
57
|
+
enum {
|
58
|
+
VARNAME_END,
|
59
|
+
#define VARNAMEENUM(name, str) VARNAME_##name,
|
60
|
+
VARNAMEDEF(VARNAMEENUM)
|
61
|
+
#undef VARNAMEENUM
|
62
|
+
VARNAME__MAX
|
63
|
+
};
|
64
|
+
|
65
|
+
#endif
|
Binary file
|
Binary file
|
@@ -0,0 +1,365 @@
|
|
1
|
+
/*
|
2
|
+
** LuaJIT common internal definitions.
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
4
|
+
*/
|
5
|
+
|
6
|
+
#ifndef _LJ_DEF_H
|
7
|
+
#define _LJ_DEF_H
|
8
|
+
|
9
|
+
#include "lua.h"
|
10
|
+
|
11
|
+
#if defined(_MSC_VER)
|
12
|
+
/* MSVC is stuck in the last century and doesn't have C99's stdint.h. */
|
13
|
+
typedef __int8 int8_t;
|
14
|
+
typedef __int16 int16_t;
|
15
|
+
typedef __int32 int32_t;
|
16
|
+
typedef __int64 int64_t;
|
17
|
+
typedef unsigned __int8 uint8_t;
|
18
|
+
typedef unsigned __int16 uint16_t;
|
19
|
+
typedef unsigned __int32 uint32_t;
|
20
|
+
typedef unsigned __int64 uint64_t;
|
21
|
+
#ifdef _WIN64
|
22
|
+
typedef __int64 intptr_t;
|
23
|
+
typedef unsigned __int64 uintptr_t;
|
24
|
+
#else
|
25
|
+
typedef __int32 intptr_t;
|
26
|
+
typedef unsigned __int32 uintptr_t;
|
27
|
+
#endif
|
28
|
+
#elif defined(__symbian__)
|
29
|
+
/* Cough. */
|
30
|
+
typedef signed char int8_t;
|
31
|
+
typedef short int int16_t;
|
32
|
+
typedef int int32_t;
|
33
|
+
typedef long long int64_t;
|
34
|
+
typedef unsigned char uint8_t;
|
35
|
+
typedef unsigned short int uint16_t;
|
36
|
+
typedef unsigned int uint32_t;
|
37
|
+
typedef unsigned long long uint64_t;
|
38
|
+
typedef int intptr_t;
|
39
|
+
typedef unsigned int uintptr_t;
|
40
|
+
#else
|
41
|
+
#include <stdint.h>
|
42
|
+
#endif
|
43
|
+
|
44
|
+
/* Needed everywhere. */
|
45
|
+
#include <string.h>
|
46
|
+
#include <stdlib.h>
|
47
|
+
|
48
|
+
/* Various VM limits. */
|
49
|
+
#define LJ_MAX_MEM32 0x7fffff00 /* Max. 32 bit memory allocation. */
|
50
|
+
#define LJ_MAX_MEM64 ((uint64_t)1<<47) /* Max. 64 bit memory allocation. */
|
51
|
+
/* Max. total memory allocation. */
|
52
|
+
#define LJ_MAX_MEM (LJ_GC64 ? LJ_MAX_MEM64 : LJ_MAX_MEM32)
|
53
|
+
#define LJ_MAX_ALLOC LJ_MAX_MEM /* Max. individual allocation length. */
|
54
|
+
#define LJ_MAX_STR LJ_MAX_MEM32 /* Max. string length. */
|
55
|
+
#define LJ_MAX_BUF LJ_MAX_MEM32 /* Max. buffer length. */
|
56
|
+
#define LJ_MAX_UDATA LJ_MAX_MEM32 /* Max. userdata length. */
|
57
|
+
|
58
|
+
#define LJ_MAX_STRTAB (1<<26) /* Max. string table size. */
|
59
|
+
#define LJ_MAX_HBITS 26 /* Max. hash bits. */
|
60
|
+
#define LJ_MAX_ABITS 28 /* Max. bits of array key. */
|
61
|
+
#define LJ_MAX_ASIZE ((1<<(LJ_MAX_ABITS-1))+1) /* Max. array part size. */
|
62
|
+
#define LJ_MAX_COLOSIZE 16 /* Max. elems for colocated array. */
|
63
|
+
|
64
|
+
#define LJ_MAX_LINE LJ_MAX_MEM32 /* Max. source code line number. */
|
65
|
+
#define LJ_MAX_XLEVEL 200 /* Max. syntactic nesting level. */
|
66
|
+
#define LJ_MAX_BCINS (1<<26) /* Max. # of bytecode instructions. */
|
67
|
+
#define LJ_MAX_SLOTS 250 /* Max. # of slots in a Lua func. */
|
68
|
+
#define LJ_MAX_LOCVAR 200 /* Max. # of local variables. */
|
69
|
+
#define LJ_MAX_UPVAL 60 /* Max. # of upvalues. */
|
70
|
+
|
71
|
+
#define LJ_MAX_IDXCHAIN 100 /* __index/__newindex chain limit. */
|
72
|
+
#define LJ_STACK_EXTRA (5+2*LJ_FR2) /* Extra stack space (metamethods). */
|
73
|
+
|
74
|
+
#define LJ_NUM_CBPAGE 1 /* Number of FFI callback pages. */
|
75
|
+
|
76
|
+
/* Minimum table/buffer sizes. */
|
77
|
+
#define LJ_MIN_GLOBAL 6 /* Min. global table size (hbits). */
|
78
|
+
#define LJ_MIN_REGISTRY 2 /* Min. registry size (hbits). */
|
79
|
+
#define LJ_MIN_STRTAB 256 /* Min. string table size (pow2). */
|
80
|
+
#define LJ_MIN_SBUF 32 /* Min. string buffer length. */
|
81
|
+
#define LJ_MIN_VECSZ 8 /* Min. size for growable vectors. */
|
82
|
+
#define LJ_MIN_IRSZ 32 /* Min. size for growable IR. */
|
83
|
+
#define LJ_MIN_K64SZ 16 /* Min. size for chained K64Array. */
|
84
|
+
|
85
|
+
/* JIT compiler limits. */
|
86
|
+
#define LJ_MAX_JSLOTS 250 /* Max. # of stack slots for a trace. */
|
87
|
+
#define LJ_MAX_PHI 64 /* Max. # of PHIs for a loop. */
|
88
|
+
#define LJ_MAX_EXITSTUBGR 16 /* Max. # of exit stub groups. */
|
89
|
+
|
90
|
+
/* Various macros. */
|
91
|
+
#ifndef UNUSED
|
92
|
+
#define UNUSED(x) ((void)(x)) /* to avoid warnings */
|
93
|
+
#endif
|
94
|
+
|
95
|
+
#define U64x(hi, lo) (((uint64_t)0x##hi << 32) + (uint64_t)0x##lo)
|
96
|
+
#define i32ptr(p) ((int32_t)(intptr_t)(void *)(p))
|
97
|
+
#define u32ptr(p) ((uint32_t)(intptr_t)(void *)(p))
|
98
|
+
|
99
|
+
#define checki8(x) ((x) == (int32_t)(int8_t)(x))
|
100
|
+
#define checku8(x) ((x) == (int32_t)(uint8_t)(x))
|
101
|
+
#define checki16(x) ((x) == (int32_t)(int16_t)(x))
|
102
|
+
#define checku16(x) ((x) == (int32_t)(uint16_t)(x))
|
103
|
+
#define checki32(x) ((x) == (int32_t)(x))
|
104
|
+
#define checku32(x) ((x) == (uint32_t)(x))
|
105
|
+
#define checkptr32(x) ((uintptr_t)(x) == (uint32_t)(uintptr_t)(x))
|
106
|
+
#define checkptr47(x) (((uint64_t)(x) >> 47) == 0)
|
107
|
+
#if LJ_GC64
|
108
|
+
#define checkptrGC(x) (checkptr47((x)))
|
109
|
+
#elif LJ_64
|
110
|
+
#define checkptrGC(x) (checkptr32((x)))
|
111
|
+
#else
|
112
|
+
#define checkptrGC(x) 1
|
113
|
+
#endif
|
114
|
+
|
115
|
+
/* Every half-decent C compiler transforms this into a rotate instruction. */
|
116
|
+
#define lj_rol(x, n) (((x)<<(n)) | ((x)>>(-(int)(n)&(8*sizeof(x)-1))))
|
117
|
+
#define lj_ror(x, n) (((x)<<(-(int)(n)&(8*sizeof(x)-1))) | ((x)>>(n)))
|
118
|
+
|
119
|
+
/* A really naive Bloom filter. But sufficient for our needs. */
|
120
|
+
typedef uintptr_t BloomFilter;
|
121
|
+
#define BLOOM_MASK (8*sizeof(BloomFilter) - 1)
|
122
|
+
#define bloombit(x) ((uintptr_t)1 << ((x) & BLOOM_MASK))
|
123
|
+
#define bloomset(b, x) ((b) |= bloombit((x)))
|
124
|
+
#define bloomtest(b, x) ((b) & bloombit((x)))
|
125
|
+
|
126
|
+
#if defined(__GNUC__) || defined(__psp2__)
|
127
|
+
|
128
|
+
#define LJ_NORET __attribute__((noreturn))
|
129
|
+
#define LJ_ALIGN(n) __attribute__((aligned(n)))
|
130
|
+
#define LJ_INLINE inline
|
131
|
+
#define LJ_AINLINE inline __attribute__((always_inline))
|
132
|
+
#define LJ_NOINLINE __attribute__((noinline))
|
133
|
+
|
134
|
+
#if defined(__ELF__) || defined(__MACH__) || defined(__psp2__)
|
135
|
+
#if !((defined(__sun__) && defined(__svr4__)) || defined(__CELLOS_LV2__))
|
136
|
+
#define LJ_NOAPI extern __attribute__((visibility("hidden")))
|
137
|
+
#endif
|
138
|
+
#endif
|
139
|
+
|
140
|
+
/* Note: it's only beneficial to use fastcall on x86 and then only for up to
|
141
|
+
** two non-FP args. The amalgamated compile covers all LJ_FUNC cases. Only
|
142
|
+
** indirect calls and related tail-called C functions are marked as fastcall.
|
143
|
+
*/
|
144
|
+
#if defined(__i386__)
|
145
|
+
#define LJ_FASTCALL __attribute__((fastcall))
|
146
|
+
#endif
|
147
|
+
|
148
|
+
#define LJ_LIKELY(x) __builtin_expect(!!(x), 1)
|
149
|
+
#define LJ_UNLIKELY(x) __builtin_expect(!!(x), 0)
|
150
|
+
|
151
|
+
#define lj_ffs(x) ((uint32_t)__builtin_ctz(x))
|
152
|
+
/* Don't ask ... */
|
153
|
+
#if defined(__INTEL_COMPILER) && (defined(__i386__) || defined(__x86_64__))
|
154
|
+
static LJ_AINLINE uint32_t lj_fls(uint32_t x)
|
155
|
+
{
|
156
|
+
uint32_t r; __asm__("bsrl %1, %0" : "=r" (r) : "rm" (x) : "cc"); return r;
|
157
|
+
}
|
158
|
+
#else
|
159
|
+
#define lj_fls(x) ((uint32_t)(__builtin_clz(x)^31))
|
160
|
+
#endif
|
161
|
+
|
162
|
+
#if defined(__arm__)
|
163
|
+
static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
|
164
|
+
{
|
165
|
+
#if defined(__psp2__)
|
166
|
+
return __builtin_rev(x);
|
167
|
+
#else
|
168
|
+
uint32_t r;
|
169
|
+
#if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\
|
170
|
+
__ARM_ARCH_6ZK__ || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__
|
171
|
+
__asm__("rev %0, %1" : "=r" (r) : "r" (x));
|
172
|
+
return r;
|
173
|
+
#else
|
174
|
+
#ifdef __thumb__
|
175
|
+
r = x ^ lj_ror(x, 16);
|
176
|
+
#else
|
177
|
+
__asm__("eor %0, %1, %1, ror #16" : "=r" (r) : "r" (x));
|
178
|
+
#endif
|
179
|
+
return ((r & 0xff00ffffu) >> 8) ^ lj_ror(x, 8);
|
180
|
+
#endif
|
181
|
+
#endif
|
182
|
+
}
|
183
|
+
|
184
|
+
static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
|
185
|
+
{
|
186
|
+
return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32));
|
187
|
+
}
|
188
|
+
#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
|
189
|
+
static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
|
190
|
+
{
|
191
|
+
return (uint32_t)__builtin_bswap32((int32_t)x);
|
192
|
+
}
|
193
|
+
|
194
|
+
static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
|
195
|
+
{
|
196
|
+
return (uint64_t)__builtin_bswap64((int64_t)x);
|
197
|
+
}
|
198
|
+
#elif defined(__i386__) || defined(__x86_64__)
|
199
|
+
static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
|
200
|
+
{
|
201
|
+
uint32_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;
|
202
|
+
}
|
203
|
+
|
204
|
+
#if defined(__i386__)
|
205
|
+
static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
|
206
|
+
{
|
207
|
+
return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32));
|
208
|
+
}
|
209
|
+
#else
|
210
|
+
static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
|
211
|
+
{
|
212
|
+
uint64_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;
|
213
|
+
}
|
214
|
+
#endif
|
215
|
+
#else
|
216
|
+
static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
|
217
|
+
{
|
218
|
+
return (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24);
|
219
|
+
}
|
220
|
+
|
221
|
+
static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
|
222
|
+
{
|
223
|
+
return (uint64_t)lj_bswap((uint32_t)(x >> 32)) |
|
224
|
+
((uint64_t)lj_bswap((uint32_t)x) << 32);
|
225
|
+
}
|
226
|
+
#endif
|
227
|
+
|
228
|
+
typedef union __attribute__((packed)) Unaligned16 {
|
229
|
+
uint16_t u;
|
230
|
+
uint8_t b[2];
|
231
|
+
} Unaligned16;
|
232
|
+
|
233
|
+
typedef union __attribute__((packed)) Unaligned32 {
|
234
|
+
uint32_t u;
|
235
|
+
uint8_t b[4];
|
236
|
+
} Unaligned32;
|
237
|
+
|
238
|
+
/* Unaligned load of uint16_t. */
|
239
|
+
static LJ_AINLINE uint16_t lj_getu16(const void *p)
|
240
|
+
{
|
241
|
+
return ((const Unaligned16 *)p)->u;
|
242
|
+
}
|
243
|
+
|
244
|
+
/* Unaligned load of uint32_t. */
|
245
|
+
static LJ_AINLINE uint32_t lj_getu32(const void *p)
|
246
|
+
{
|
247
|
+
return ((const Unaligned32 *)p)->u;
|
248
|
+
}
|
249
|
+
|
250
|
+
#elif defined(_MSC_VER)
|
251
|
+
|
252
|
+
#define LJ_NORET __declspec(noreturn)
|
253
|
+
#define LJ_ALIGN(n) __declspec(align(n))
|
254
|
+
#define LJ_INLINE __inline
|
255
|
+
#define LJ_AINLINE __forceinline
|
256
|
+
#define LJ_NOINLINE __declspec(noinline)
|
257
|
+
#if defined(_M_IX86)
|
258
|
+
#define LJ_FASTCALL __fastcall
|
259
|
+
#endif
|
260
|
+
|
261
|
+
#ifdef _M_PPC
|
262
|
+
unsigned int _CountLeadingZeros(long);
|
263
|
+
#pragma intrinsic(_CountLeadingZeros)
|
264
|
+
static LJ_AINLINE uint32_t lj_fls(uint32_t x)
|
265
|
+
{
|
266
|
+
return _CountLeadingZeros(x) ^ 31;
|
267
|
+
}
|
268
|
+
#else
|
269
|
+
unsigned char _BitScanForward(uint32_t *, unsigned long);
|
270
|
+
unsigned char _BitScanReverse(uint32_t *, unsigned long);
|
271
|
+
#pragma intrinsic(_BitScanForward)
|
272
|
+
#pragma intrinsic(_BitScanReverse)
|
273
|
+
|
274
|
+
static LJ_AINLINE uint32_t lj_ffs(uint32_t x)
|
275
|
+
{
|
276
|
+
uint32_t r; _BitScanForward(&r, x); return r;
|
277
|
+
}
|
278
|
+
|
279
|
+
static LJ_AINLINE uint32_t lj_fls(uint32_t x)
|
280
|
+
{
|
281
|
+
uint32_t r; _BitScanReverse(&r, x); return r;
|
282
|
+
}
|
283
|
+
#endif
|
284
|
+
|
285
|
+
unsigned long _byteswap_ulong(unsigned long);
|
286
|
+
uint64_t _byteswap_uint64(uint64_t);
|
287
|
+
#define lj_bswap(x) (_byteswap_ulong((x)))
|
288
|
+
#define lj_bswap64(x) (_byteswap_uint64((x)))
|
289
|
+
|
290
|
+
#if defined(_M_PPC) && defined(LUAJIT_NO_UNALIGNED)
|
291
|
+
/*
|
292
|
+
** Replacement for unaligned loads on Xbox 360. Disabled by default since it's
|
293
|
+
** usually more costly than the occasional stall when crossing a cache-line.
|
294
|
+
*/
|
295
|
+
static LJ_AINLINE uint16_t lj_getu16(const void *v)
|
296
|
+
{
|
297
|
+
const uint8_t *p = (const uint8_t *)v;
|
298
|
+
return (uint16_t)((p[0]<<8) | p[1]);
|
299
|
+
}
|
300
|
+
static LJ_AINLINE uint32_t lj_getu32(const void *v)
|
301
|
+
{
|
302
|
+
const uint8_t *p = (const uint8_t *)v;
|
303
|
+
return (uint32_t)((p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]);
|
304
|
+
}
|
305
|
+
#else
|
306
|
+
/* Unaligned loads are generally ok on x86/x64. */
|
307
|
+
#define lj_getu16(p) (*(uint16_t *)(p))
|
308
|
+
#define lj_getu32(p) (*(uint32_t *)(p))
|
309
|
+
#endif
|
310
|
+
|
311
|
+
#else
|
312
|
+
#error "missing defines for your compiler"
|
313
|
+
#endif
|
314
|
+
|
315
|
+
/* Optional defines. */
|
316
|
+
#ifndef LJ_FASTCALL
|
317
|
+
#define LJ_FASTCALL
|
318
|
+
#endif
|
319
|
+
#ifndef LJ_NORET
|
320
|
+
#define LJ_NORET
|
321
|
+
#endif
|
322
|
+
#ifndef LJ_NOAPI
|
323
|
+
#define LJ_NOAPI extern
|
324
|
+
#endif
|
325
|
+
#ifndef LJ_LIKELY
|
326
|
+
#define LJ_LIKELY(x) (x)
|
327
|
+
#define LJ_UNLIKELY(x) (x)
|
328
|
+
#endif
|
329
|
+
|
330
|
+
/* Attributes for internal functions. */
|
331
|
+
#define LJ_DATA LJ_NOAPI
|
332
|
+
#define LJ_DATADEF
|
333
|
+
#define LJ_ASMF LJ_NOAPI
|
334
|
+
#define LJ_FUNCA LJ_NOAPI
|
335
|
+
#if defined(ljamalg_c)
|
336
|
+
#define LJ_FUNC static
|
337
|
+
#else
|
338
|
+
#define LJ_FUNC LJ_NOAPI
|
339
|
+
#endif
|
340
|
+
#define LJ_FUNC_NORET LJ_FUNC LJ_NORET
|
341
|
+
#define LJ_FUNCA_NORET LJ_FUNCA LJ_NORET
|
342
|
+
#define LJ_ASMF_NORET LJ_ASMF LJ_NORET
|
343
|
+
|
344
|
+
/* Runtime assertions. */
|
345
|
+
#ifdef lua_assert
|
346
|
+
#define check_exp(c, e) (lua_assert(c), (e))
|
347
|
+
#define api_check(l, e) lua_assert(e)
|
348
|
+
#else
|
349
|
+
#define lua_assert(c) ((void)0)
|
350
|
+
#define check_exp(c, e) (e)
|
351
|
+
#define api_check luai_apicheck
|
352
|
+
#endif
|
353
|
+
|
354
|
+
/* Static assertions. */
|
355
|
+
#define LJ_ASSERT_NAME2(name, line) name ## line
|
356
|
+
#define LJ_ASSERT_NAME(line) LJ_ASSERT_NAME2(lj_assert_, line)
|
357
|
+
#ifdef __COUNTER__
|
358
|
+
#define LJ_STATIC_ASSERT(cond) \
|
359
|
+
extern void LJ_ASSERT_NAME(__COUNTER__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])
|
360
|
+
#else
|
361
|
+
#define LJ_STATIC_ASSERT(cond) \
|
362
|
+
extern void LJ_ASSERT_NAME(__LINE__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])
|
363
|
+
#endif
|
364
|
+
|
365
|
+
#endif
|
@@ -0,0 +1,557 @@
|
|
1
|
+
/*
|
2
|
+
** Instruction dispatch handling.
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
4
|
+
*/
|
5
|
+
|
6
|
+
#define lj_dispatch_c
|
7
|
+
#define LUA_CORE
|
8
|
+
|
9
|
+
#include "lj_obj.h"
|
10
|
+
#include "lj_err.h"
|
11
|
+
#include "lj_buf.h"
|
12
|
+
#include "lj_func.h"
|
13
|
+
#include "lj_str.h"
|
14
|
+
#include "lj_tab.h"
|
15
|
+
#include "lj_meta.h"
|
16
|
+
#include "lj_debug.h"
|
17
|
+
#include "lj_state.h"
|
18
|
+
#include "lj_frame.h"
|
19
|
+
#include "lj_bc.h"
|
20
|
+
#include "lj_ff.h"
|
21
|
+
#include "lj_strfmt.h"
|
22
|
+
#if LJ_HASJIT
|
23
|
+
#include "lj_jit.h"
|
24
|
+
#endif
|
25
|
+
#if LJ_HASFFI
|
26
|
+
#include "lj_ccallback.h"
|
27
|
+
#endif
|
28
|
+
#include "lj_trace.h"
|
29
|
+
#include "lj_dispatch.h"
|
30
|
+
#if LJ_HASPROFILE
|
31
|
+
#include "lj_profile.h"
|
32
|
+
#endif
|
33
|
+
#include "lj_vm.h"
|
34
|
+
#include "luajit.h"
|
35
|
+
|
36
|
+
/* Bump GG_NUM_ASMFF in lj_dispatch.h as needed. Ugly. */
|
37
|
+
LJ_STATIC_ASSERT(GG_NUM_ASMFF == FF_NUM_ASMFUNC);
|
38
|
+
|
39
|
+
/* -- Dispatch table management ------------------------------------------- */
|
40
|
+
|
41
|
+
#if LJ_TARGET_MIPS
|
42
|
+
#include <math.h>
|
43
|
+
LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L,
|
44
|
+
lua_State *co);
|
45
|
+
#if !LJ_HASJIT
|
46
|
+
#define lj_dispatch_stitch lj_dispatch_ins
|
47
|
+
#endif
|
48
|
+
#if !LJ_HASPROFILE
|
49
|
+
#define lj_dispatch_profile lj_dispatch_ins
|
50
|
+
#endif
|
51
|
+
|
52
|
+
#define GOTFUNC(name) (ASMFunction)name,
|
53
|
+
static const ASMFunction dispatch_got[] = {
|
54
|
+
GOTDEF(GOTFUNC)
|
55
|
+
};
|
56
|
+
#undef GOTFUNC
|
57
|
+
#endif
|
58
|
+
|
59
|
+
/* Initialize instruction dispatch table and hot counters. */
|
60
|
+
void lj_dispatch_init(GG_State *GG)
|
61
|
+
{
|
62
|
+
uint32_t i;
|
63
|
+
ASMFunction *disp = GG->dispatch;
|
64
|
+
for (i = 0; i < GG_LEN_SDISP; i++)
|
65
|
+
disp[GG_LEN_DDISP+i] = disp[i] = makeasmfunc(lj_bc_ofs[i]);
|
66
|
+
for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)
|
67
|
+
disp[i] = makeasmfunc(lj_bc_ofs[i]);
|
68
|
+
/* The JIT engine is off by default. luaopen_jit() turns it on. */
|
69
|
+
disp[BC_FORL] = disp[BC_IFORL];
|
70
|
+
disp[BC_ITERL] = disp[BC_IITERL];
|
71
|
+
disp[BC_LOOP] = disp[BC_ILOOP];
|
72
|
+
disp[BC_FUNCF] = disp[BC_IFUNCF];
|
73
|
+
disp[BC_FUNCV] = disp[BC_IFUNCV];
|
74
|
+
GG->g.bc_cfunc_ext = GG->g.bc_cfunc_int = BCINS_AD(BC_FUNCC, LUA_MINSTACK, 0);
|
75
|
+
for (i = 0; i < GG_NUM_ASMFF; i++)
|
76
|
+
GG->bcff[i] = BCINS_AD(BC__MAX+i, 0, 0);
|
77
|
+
#if LJ_TARGET_MIPS
|
78
|
+
memcpy(GG->got, dispatch_got, LJ_GOT__MAX*4);
|
79
|
+
#endif
|
80
|
+
}
|
81
|
+
|
82
|
+
#if LJ_HASJIT
|
83
|
+
/* Initialize hotcount table. */
|
84
|
+
void lj_dispatch_init_hotcount(global_State *g)
|
85
|
+
{
|
86
|
+
int32_t hotloop = G2J(g)->param[JIT_P_hotloop];
|
87
|
+
HotCount start = (HotCount)(hotloop*HOTCOUNT_LOOP - 1);
|
88
|
+
HotCount *hotcount = G2GG(g)->hotcount;
|
89
|
+
uint32_t i;
|
90
|
+
for (i = 0; i < HOTCOUNT_SIZE; i++)
|
91
|
+
hotcount[i] = start;
|
92
|
+
}
|
93
|
+
#endif
|
94
|
+
|
95
|
+
/* Internal dispatch mode bits. */
|
96
|
+
#define DISPMODE_CALL 0x01 /* Override call dispatch. */
|
97
|
+
#define DISPMODE_RET 0x02 /* Override return dispatch. */
|
98
|
+
#define DISPMODE_INS 0x04 /* Override instruction dispatch. */
|
99
|
+
#define DISPMODE_JIT 0x10 /* JIT compiler on. */
|
100
|
+
#define DISPMODE_REC 0x20 /* Recording active. */
|
101
|
+
#define DISPMODE_PROF 0x40 /* Profiling active. */
|
102
|
+
|
103
|
+
/* Update dispatch table depending on various flags. */
|
104
|
+
void lj_dispatch_update(global_State *g)
|
105
|
+
{
|
106
|
+
uint8_t oldmode = g->dispatchmode;
|
107
|
+
uint8_t mode = 0;
|
108
|
+
#if LJ_HASJIT
|
109
|
+
mode |= (G2J(g)->flags & JIT_F_ON) ? DISPMODE_JIT : 0;
|
110
|
+
mode |= G2J(g)->state != LJ_TRACE_IDLE ?
|
111
|
+
(DISPMODE_REC|DISPMODE_INS|DISPMODE_CALL) : 0;
|
112
|
+
#endif
|
113
|
+
#if LJ_HASPROFILE
|
114
|
+
mode |= (g->hookmask & HOOK_PROFILE) ? (DISPMODE_PROF|DISPMODE_INS) : 0;
|
115
|
+
#endif
|
116
|
+
mode |= (g->hookmask & (LUA_MASKLINE|LUA_MASKCOUNT)) ? DISPMODE_INS : 0;
|
117
|
+
mode |= (g->hookmask & LUA_MASKCALL) ? DISPMODE_CALL : 0;
|
118
|
+
mode |= (g->hookmask & LUA_MASKRET) ? DISPMODE_RET : 0;
|
119
|
+
if (oldmode != mode) { /* Mode changed? */
|
120
|
+
ASMFunction *disp = G2GG(g)->dispatch;
|
121
|
+
ASMFunction f_forl, f_iterl, f_loop, f_funcf, f_funcv;
|
122
|
+
g->dispatchmode = mode;
|
123
|
+
|
124
|
+
/* Hotcount if JIT is on, but not while recording. */
|
125
|
+
if ((mode & (DISPMODE_JIT|DISPMODE_REC)) == DISPMODE_JIT) {
|
126
|
+
f_forl = makeasmfunc(lj_bc_ofs[BC_FORL]);
|
127
|
+
f_iterl = makeasmfunc(lj_bc_ofs[BC_ITERL]);
|
128
|
+
f_loop = makeasmfunc(lj_bc_ofs[BC_LOOP]);
|
129
|
+
f_funcf = makeasmfunc(lj_bc_ofs[BC_FUNCF]);
|
130
|
+
f_funcv = makeasmfunc(lj_bc_ofs[BC_FUNCV]);
|
131
|
+
} else { /* Otherwise use the non-hotcounting instructions. */
|
132
|
+
f_forl = disp[GG_LEN_DDISP+BC_IFORL];
|
133
|
+
f_iterl = disp[GG_LEN_DDISP+BC_IITERL];
|
134
|
+
f_loop = disp[GG_LEN_DDISP+BC_ILOOP];
|
135
|
+
f_funcf = makeasmfunc(lj_bc_ofs[BC_IFUNCF]);
|
136
|
+
f_funcv = makeasmfunc(lj_bc_ofs[BC_IFUNCV]);
|
137
|
+
}
|
138
|
+
/* Init static counting instruction dispatch first (may be copied below). */
|
139
|
+
disp[GG_LEN_DDISP+BC_FORL] = f_forl;
|
140
|
+
disp[GG_LEN_DDISP+BC_ITERL] = f_iterl;
|
141
|
+
disp[GG_LEN_DDISP+BC_LOOP] = f_loop;
|
142
|
+
|
143
|
+
/* Set dynamic instruction dispatch. */
|
144
|
+
if ((oldmode ^ mode) & (DISPMODE_PROF|DISPMODE_REC|DISPMODE_INS)) {
|
145
|
+
/* Need to update the whole table. */
|
146
|
+
if (!(mode & DISPMODE_INS)) { /* No ins dispatch? */
|
147
|
+
/* Copy static dispatch table to dynamic dispatch table. */
|
148
|
+
memcpy(&disp[0], &disp[GG_LEN_DDISP], GG_LEN_SDISP*sizeof(ASMFunction));
|
149
|
+
/* Overwrite with dynamic return dispatch. */
|
150
|
+
if ((mode & DISPMODE_RET)) {
|
151
|
+
disp[BC_RETM] = lj_vm_rethook;
|
152
|
+
disp[BC_RET] = lj_vm_rethook;
|
153
|
+
disp[BC_RET0] = lj_vm_rethook;
|
154
|
+
disp[BC_RET1] = lj_vm_rethook;
|
155
|
+
}
|
156
|
+
} else {
|
157
|
+
/* The recording dispatch also checks for hooks. */
|
158
|
+
ASMFunction f = (mode & DISPMODE_PROF) ? lj_vm_profhook :
|
159
|
+
(mode & DISPMODE_REC) ? lj_vm_record : lj_vm_inshook;
|
160
|
+
uint32_t i;
|
161
|
+
for (i = 0; i < GG_LEN_SDISP; i++)
|
162
|
+
disp[i] = f;
|
163
|
+
}
|
164
|
+
} else if (!(mode & DISPMODE_INS)) {
|
165
|
+
/* Otherwise set dynamic counting ins. */
|
166
|
+
disp[BC_FORL] = f_forl;
|
167
|
+
disp[BC_ITERL] = f_iterl;
|
168
|
+
disp[BC_LOOP] = f_loop;
|
169
|
+
/* Set dynamic return dispatch. */
|
170
|
+
if ((mode & DISPMODE_RET)) {
|
171
|
+
disp[BC_RETM] = lj_vm_rethook;
|
172
|
+
disp[BC_RET] = lj_vm_rethook;
|
173
|
+
disp[BC_RET0] = lj_vm_rethook;
|
174
|
+
disp[BC_RET1] = lj_vm_rethook;
|
175
|
+
} else {
|
176
|
+
disp[BC_RETM] = disp[GG_LEN_DDISP+BC_RETM];
|
177
|
+
disp[BC_RET] = disp[GG_LEN_DDISP+BC_RET];
|
178
|
+
disp[BC_RET0] = disp[GG_LEN_DDISP+BC_RET0];
|
179
|
+
disp[BC_RET1] = disp[GG_LEN_DDISP+BC_RET1];
|
180
|
+
}
|
181
|
+
}
|
182
|
+
|
183
|
+
/* Set dynamic call dispatch. */
|
184
|
+
if ((oldmode ^ mode) & DISPMODE_CALL) { /* Update the whole table? */
|
185
|
+
uint32_t i;
|
186
|
+
if ((mode & DISPMODE_CALL) == 0) { /* No call hooks? */
|
187
|
+
for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)
|
188
|
+
disp[i] = makeasmfunc(lj_bc_ofs[i]);
|
189
|
+
} else {
|
190
|
+
for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)
|
191
|
+
disp[i] = lj_vm_callhook;
|
192
|
+
}
|
193
|
+
}
|
194
|
+
if (!(mode & DISPMODE_CALL)) { /* Overwrite dynamic counting ins. */
|
195
|
+
disp[BC_FUNCF] = f_funcf;
|
196
|
+
disp[BC_FUNCV] = f_funcv;
|
197
|
+
}
|
198
|
+
|
199
|
+
#if LJ_HASJIT
|
200
|
+
/* Reset hotcounts for JIT off to on transition. */
|
201
|
+
if ((mode & DISPMODE_JIT) && !(oldmode & DISPMODE_JIT))
|
202
|
+
lj_dispatch_init_hotcount(g);
|
203
|
+
#endif
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
/* -- JIT mode setting ---------------------------------------------------- */
|
208
|
+
|
209
|
+
#if LJ_HASJIT
|
210
|
+
/* Set JIT mode for a single prototype. */
|
211
|
+
static void setptmode(global_State *g, GCproto *pt, int mode)
|
212
|
+
{
|
213
|
+
if ((mode & LUAJIT_MODE_ON)) { /* (Re-)enable JIT compilation. */
|
214
|
+
pt->flags &= ~PROTO_NOJIT;
|
215
|
+
lj_trace_reenableproto(pt); /* Unpatch all ILOOP etc. bytecodes. */
|
216
|
+
} else { /* Flush and/or disable JIT compilation. */
|
217
|
+
if (!(mode & LUAJIT_MODE_FLUSH))
|
218
|
+
pt->flags |= PROTO_NOJIT;
|
219
|
+
lj_trace_flushproto(g, pt); /* Flush all traces of prototype. */
|
220
|
+
}
|
221
|
+
}
|
222
|
+
|
223
|
+
/* Recursively set the JIT mode for all children of a prototype. */
|
224
|
+
static void setptmode_all(global_State *g, GCproto *pt, int mode)
|
225
|
+
{
|
226
|
+
ptrdiff_t i;
|
227
|
+
if (!(pt->flags & PROTO_CHILD)) return;
|
228
|
+
for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) {
|
229
|
+
GCobj *o = proto_kgc(pt, i);
|
230
|
+
if (o->gch.gct == ~LJ_TPROTO) {
|
231
|
+
setptmode(g, gco2pt(o), mode);
|
232
|
+
setptmode_all(g, gco2pt(o), mode);
|
233
|
+
}
|
234
|
+
}
|
235
|
+
}
|
236
|
+
#endif
|
237
|
+
|
238
|
+
/* Public API function: control the JIT engine. */
|
239
|
+
int luaJIT_setmode(lua_State *L, int idx, int mode)
|
240
|
+
{
|
241
|
+
global_State *g = G(L);
|
242
|
+
int mm = mode & LUAJIT_MODE_MASK;
|
243
|
+
lj_trace_abort(g); /* Abort recording on any state change. */
|
244
|
+
/* Avoid pulling the rug from under our own feet. */
|
245
|
+
if ((g->hookmask & HOOK_GC))
|
246
|
+
lj_err_caller(L, LJ_ERR_NOGCMM);
|
247
|
+
switch (mm) {
|
248
|
+
#if LJ_HASJIT
|
249
|
+
case LUAJIT_MODE_ENGINE:
|
250
|
+
if ((mode & LUAJIT_MODE_FLUSH)) {
|
251
|
+
lj_trace_flushall(L);
|
252
|
+
} else {
|
253
|
+
if (!(mode & LUAJIT_MODE_ON))
|
254
|
+
G2J(g)->flags &= ~(uint32_t)JIT_F_ON;
|
255
|
+
#if LJ_TARGET_X86ORX64
|
256
|
+
else if ((G2J(g)->flags & JIT_F_SSE2))
|
257
|
+
G2J(g)->flags |= (uint32_t)JIT_F_ON;
|
258
|
+
else
|
259
|
+
return 0; /* Don't turn on JIT compiler without SSE2 support. */
|
260
|
+
#else
|
261
|
+
else
|
262
|
+
G2J(g)->flags |= (uint32_t)JIT_F_ON;
|
263
|
+
#endif
|
264
|
+
lj_dispatch_update(g);
|
265
|
+
}
|
266
|
+
break;
|
267
|
+
case LUAJIT_MODE_FUNC:
|
268
|
+
case LUAJIT_MODE_ALLFUNC:
|
269
|
+
case LUAJIT_MODE_ALLSUBFUNC: {
|
270
|
+
cTValue *tv = idx == 0 ? frame_prev(L->base-1) :
|
271
|
+
idx > 0 ? L->base + (idx-1) : L->top + idx;
|
272
|
+
GCproto *pt;
|
273
|
+
if ((idx == 0 || tvisfunc(tv)) && isluafunc(&gcval(tv)->fn))
|
274
|
+
pt = funcproto(&gcval(tv)->fn); /* Cannot use funcV() for frame slot. */
|
275
|
+
else if (tvisproto(tv))
|
276
|
+
pt = protoV(tv);
|
277
|
+
else
|
278
|
+
return 0; /* Failed. */
|
279
|
+
if (mm != LUAJIT_MODE_ALLSUBFUNC)
|
280
|
+
setptmode(g, pt, mode);
|
281
|
+
if (mm != LUAJIT_MODE_FUNC)
|
282
|
+
setptmode_all(g, pt, mode);
|
283
|
+
break;
|
284
|
+
}
|
285
|
+
case LUAJIT_MODE_TRACE:
|
286
|
+
if (!(mode & LUAJIT_MODE_FLUSH))
|
287
|
+
return 0; /* Failed. */
|
288
|
+
lj_trace_flush(G2J(g), idx);
|
289
|
+
break;
|
290
|
+
#else
|
291
|
+
case LUAJIT_MODE_ENGINE:
|
292
|
+
case LUAJIT_MODE_FUNC:
|
293
|
+
case LUAJIT_MODE_ALLFUNC:
|
294
|
+
case LUAJIT_MODE_ALLSUBFUNC:
|
295
|
+
UNUSED(idx);
|
296
|
+
if ((mode & LUAJIT_MODE_ON))
|
297
|
+
return 0; /* Failed. */
|
298
|
+
break;
|
299
|
+
#endif
|
300
|
+
case LUAJIT_MODE_WRAPCFUNC:
|
301
|
+
if ((mode & LUAJIT_MODE_ON)) {
|
302
|
+
if (idx != 0) {
|
303
|
+
cTValue *tv = idx > 0 ? L->base + (idx-1) : L->top + idx;
|
304
|
+
if (tvislightud(tv))
|
305
|
+
g->wrapf = (lua_CFunction)lightudV(tv);
|
306
|
+
else
|
307
|
+
return 0; /* Failed. */
|
308
|
+
} else {
|
309
|
+
return 0; /* Failed. */
|
310
|
+
}
|
311
|
+
g->bc_cfunc_ext = BCINS_AD(BC_FUNCCW, 0, 0);
|
312
|
+
} else {
|
313
|
+
g->bc_cfunc_ext = BCINS_AD(BC_FUNCC, 0, 0);
|
314
|
+
}
|
315
|
+
break;
|
316
|
+
default:
|
317
|
+
return 0; /* Failed. */
|
318
|
+
}
|
319
|
+
return 1; /* OK. */
|
320
|
+
}
|
321
|
+
|
322
|
+
/* Enforce (dynamic) linker error for version mismatches. See luajit.c. */
|
323
|
+
LUA_API void LUAJIT_VERSION_SYM(void)
|
324
|
+
{
|
325
|
+
}
|
326
|
+
|
327
|
+
/* -- Hooks --------------------------------------------------------------- */
|
328
|
+
|
329
|
+
/* This function can be called asynchronously (e.g. during a signal). */
|
330
|
+
LUA_API int lua_sethook(lua_State *L, lua_Hook func, int mask, int count)
|
331
|
+
{
|
332
|
+
global_State *g = G(L);
|
333
|
+
mask &= HOOK_EVENTMASK;
|
334
|
+
if (func == NULL || mask == 0) { mask = 0; func = NULL; } /* Consistency. */
|
335
|
+
g->hookf = func;
|
336
|
+
g->hookcount = g->hookcstart = (int32_t)count;
|
337
|
+
g->hookmask = (uint8_t)((g->hookmask & ~HOOK_EVENTMASK) | mask);
|
338
|
+
lj_trace_abort(g); /* Abort recording on any hook change. */
|
339
|
+
lj_dispatch_update(g);
|
340
|
+
return 1;
|
341
|
+
}
|
342
|
+
|
343
|
+
LUA_API lua_Hook lua_gethook(lua_State *L)
|
344
|
+
{
|
345
|
+
return G(L)->hookf;
|
346
|
+
}
|
347
|
+
|
348
|
+
LUA_API int lua_gethookmask(lua_State *L)
|
349
|
+
{
|
350
|
+
return G(L)->hookmask & HOOK_EVENTMASK;
|
351
|
+
}
|
352
|
+
|
353
|
+
LUA_API int lua_gethookcount(lua_State *L)
|
354
|
+
{
|
355
|
+
return (int)G(L)->hookcstart;
|
356
|
+
}
|
357
|
+
|
358
|
+
/* Call a hook. */
|
359
|
+
static void callhook(lua_State *L, int event, BCLine line)
|
360
|
+
{
|
361
|
+
global_State *g = G(L);
|
362
|
+
lua_Hook hookf = g->hookf;
|
363
|
+
if (hookf && !hook_active(g)) {
|
364
|
+
lua_Debug ar;
|
365
|
+
lj_trace_abort(g); /* Abort recording on any hook call. */
|
366
|
+
ar.event = event;
|
367
|
+
ar.currentline = line;
|
368
|
+
/* Top frame, nextframe = NULL. */
|
369
|
+
ar.i_ci = (int)((L->base-1) - tvref(L->stack));
|
370
|
+
lj_state_checkstack(L, 1+LUA_MINSTACK);
|
371
|
+
#if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF
|
372
|
+
lj_profile_hook_enter(g);
|
373
|
+
#else
|
374
|
+
hook_enter(g);
|
375
|
+
#endif
|
376
|
+
hookf(L, &ar);
|
377
|
+
lua_assert(hook_active(g));
|
378
|
+
setgcref(g->cur_L, obj2gco(L));
|
379
|
+
#if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF
|
380
|
+
lj_profile_hook_leave(g);
|
381
|
+
#else
|
382
|
+
hook_leave(g);
|
383
|
+
#endif
|
384
|
+
}
|
385
|
+
}
|
386
|
+
|
387
|
+
/* -- Dispatch callbacks -------------------------------------------------- */
|
388
|
+
|
389
|
+
/* Calculate number of used stack slots in the current frame. */
|
390
|
+
static BCReg cur_topslot(GCproto *pt, const BCIns *pc, uint32_t nres)
|
391
|
+
{
|
392
|
+
BCIns ins = pc[-1];
|
393
|
+
if (bc_op(ins) == BC_UCLO)
|
394
|
+
ins = pc[bc_j(ins)];
|
395
|
+
switch (bc_op(ins)) {
|
396
|
+
case BC_CALLM: case BC_CALLMT: return bc_a(ins) + bc_c(ins) + nres-1+1+LJ_FR2;
|
397
|
+
case BC_RETM: return bc_a(ins) + bc_d(ins) + nres-1;
|
398
|
+
case BC_TSETM: return bc_a(ins) + nres-1;
|
399
|
+
default: return pt->framesize;
|
400
|
+
}
|
401
|
+
}
|
402
|
+
|
403
|
+
/* Instruction dispatch. Used by instr/line/return hooks or when recording. */
|
404
|
+
void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc)
|
405
|
+
{
|
406
|
+
ERRNO_SAVE
|
407
|
+
GCfunc *fn = curr_func(L);
|
408
|
+
GCproto *pt = funcproto(fn);
|
409
|
+
void *cf = cframe_raw(L->cframe);
|
410
|
+
const BCIns *oldpc = cframe_pc(cf);
|
411
|
+
global_State *g = G(L);
|
412
|
+
BCReg slots;
|
413
|
+
setcframe_pc(cf, pc);
|
414
|
+
slots = cur_topslot(pt, pc, cframe_multres_n(cf));
|
415
|
+
L->top = L->base + slots; /* Fix top. */
|
416
|
+
#if LJ_HASJIT
|
417
|
+
{
|
418
|
+
jit_State *J = G2J(g);
|
419
|
+
if (J->state != LJ_TRACE_IDLE) {
|
420
|
+
#ifdef LUA_USE_ASSERT
|
421
|
+
ptrdiff_t delta = L->top - L->base;
|
422
|
+
#endif
|
423
|
+
J->L = L;
|
424
|
+
lj_trace_ins(J, pc-1); /* The interpreter bytecode PC is offset by 1. */
|
425
|
+
lua_assert(L->top - L->base == delta);
|
426
|
+
}
|
427
|
+
}
|
428
|
+
#endif
|
429
|
+
if ((g->hookmask & LUA_MASKCOUNT) && g->hookcount == 0) {
|
430
|
+
g->hookcount = g->hookcstart;
|
431
|
+
callhook(L, LUA_HOOKCOUNT, -1);
|
432
|
+
L->top = L->base + slots; /* Fix top again. */
|
433
|
+
}
|
434
|
+
if ((g->hookmask & LUA_MASKLINE)) {
|
435
|
+
BCPos npc = proto_bcpos(pt, pc) - 1;
|
436
|
+
BCPos opc = proto_bcpos(pt, oldpc) - 1;
|
437
|
+
BCLine line = lj_debug_line(pt, npc);
|
438
|
+
if (pc <= oldpc || opc >= pt->sizebc || line != lj_debug_line(pt, opc)) {
|
439
|
+
callhook(L, LUA_HOOKLINE, line);
|
440
|
+
L->top = L->base + slots; /* Fix top again. */
|
441
|
+
}
|
442
|
+
}
|
443
|
+
if ((g->hookmask & LUA_MASKRET) && bc_isret(bc_op(pc[-1])))
|
444
|
+
callhook(L, LUA_HOOKRET, -1);
|
445
|
+
ERRNO_RESTORE
|
446
|
+
}
|
447
|
+
|
448
|
+
/* Initialize call. Ensure stack space and return # of missing parameters. */
|
449
|
+
static int call_init(lua_State *L, GCfunc *fn)
|
450
|
+
{
|
451
|
+
if (isluafunc(fn)) {
|
452
|
+
GCproto *pt = funcproto(fn);
|
453
|
+
int numparams = pt->numparams;
|
454
|
+
int gotparams = (int)(L->top - L->base);
|
455
|
+
int need = pt->framesize;
|
456
|
+
if ((pt->flags & PROTO_VARARG)) need += 1+gotparams;
|
457
|
+
lj_state_checkstack(L, (MSize)need);
|
458
|
+
numparams -= gotparams;
|
459
|
+
return numparams >= 0 ? numparams : 0;
|
460
|
+
} else {
|
461
|
+
lj_state_checkstack(L, LUA_MINSTACK);
|
462
|
+
return 0;
|
463
|
+
}
|
464
|
+
}
|
465
|
+
|
466
|
+
/* Call dispatch. Used by call hooks, hot calls or when recording. */
|
467
|
+
ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns *pc)
|
468
|
+
{
|
469
|
+
ERRNO_SAVE
|
470
|
+
GCfunc *fn = curr_func(L);
|
471
|
+
BCOp op;
|
472
|
+
global_State *g = G(L);
|
473
|
+
#if LJ_HASJIT
|
474
|
+
jit_State *J = G2J(g);
|
475
|
+
#endif
|
476
|
+
int missing = call_init(L, fn);
|
477
|
+
#if LJ_HASJIT
|
478
|
+
J->L = L;
|
479
|
+
if ((uintptr_t)pc & 1) { /* Marker for hot call. */
|
480
|
+
#ifdef LUA_USE_ASSERT
|
481
|
+
ptrdiff_t delta = L->top - L->base;
|
482
|
+
#endif
|
483
|
+
pc = (const BCIns *)((uintptr_t)pc & ~(uintptr_t)1);
|
484
|
+
lj_trace_hot(J, pc);
|
485
|
+
lua_assert(L->top - L->base == delta);
|
486
|
+
goto out;
|
487
|
+
} else if (J->state != LJ_TRACE_IDLE &&
|
488
|
+
!(g->hookmask & (HOOK_GC|HOOK_VMEVENT))) {
|
489
|
+
#ifdef LUA_USE_ASSERT
|
490
|
+
ptrdiff_t delta = L->top - L->base;
|
491
|
+
#endif
|
492
|
+
/* Record the FUNC* bytecodes, too. */
|
493
|
+
lj_trace_ins(J, pc-1); /* The interpreter bytecode PC is offset by 1. */
|
494
|
+
lua_assert(L->top - L->base == delta);
|
495
|
+
}
|
496
|
+
#endif
|
497
|
+
if ((g->hookmask & LUA_MASKCALL)) {
|
498
|
+
int i;
|
499
|
+
for (i = 0; i < missing; i++) /* Add missing parameters. */
|
500
|
+
setnilV(L->top++);
|
501
|
+
callhook(L, LUA_HOOKCALL, -1);
|
502
|
+
/* Preserve modifications of missing parameters by lua_setlocal(). */
|
503
|
+
while (missing-- > 0 && tvisnil(L->top - 1))
|
504
|
+
L->top--;
|
505
|
+
}
|
506
|
+
#if LJ_HASJIT
|
507
|
+
out:
|
508
|
+
#endif
|
509
|
+
op = bc_op(pc[-1]); /* Get FUNC* op. */
|
510
|
+
#if LJ_HASJIT
|
511
|
+
/* Use the non-hotcounting variants if JIT is off or while recording. */
|
512
|
+
if ((!(J->flags & JIT_F_ON) || J->state != LJ_TRACE_IDLE) &&
|
513
|
+
(op == BC_FUNCF || op == BC_FUNCV))
|
514
|
+
op = (BCOp)((int)op+(int)BC_IFUNCF-(int)BC_FUNCF);
|
515
|
+
#endif
|
516
|
+
ERRNO_RESTORE
|
517
|
+
return makeasmfunc(lj_bc_ofs[op]); /* Return static dispatch target. */
|
518
|
+
}
|
519
|
+
|
520
|
+
#if LJ_HASJIT
|
521
|
+
/* Stitch a new trace. */
|
522
|
+
void LJ_FASTCALL lj_dispatch_stitch(jit_State *J, const BCIns *pc)
|
523
|
+
{
|
524
|
+
ERRNO_SAVE
|
525
|
+
lua_State *L = J->L;
|
526
|
+
void *cf = cframe_raw(L->cframe);
|
527
|
+
const BCIns *oldpc = cframe_pc(cf);
|
528
|
+
setcframe_pc(cf, pc);
|
529
|
+
/* Before dispatch, have to bias PC by 1. */
|
530
|
+
L->top = L->base + cur_topslot(curr_proto(L), pc+1, cframe_multres_n(cf));
|
531
|
+
lj_trace_stitch(J, pc-1); /* Point to the CALL instruction. */
|
532
|
+
setcframe_pc(cf, oldpc);
|
533
|
+
ERRNO_RESTORE
|
534
|
+
}
|
535
|
+
#endif
|
536
|
+
|
537
|
+
#if LJ_HASPROFILE
|
538
|
+
/* Profile dispatch. */
|
539
|
+
void LJ_FASTCALL lj_dispatch_profile(lua_State *L, const BCIns *pc)
|
540
|
+
{
|
541
|
+
ERRNO_SAVE
|
542
|
+
GCfunc *fn = curr_func(L);
|
543
|
+
GCproto *pt = funcproto(fn);
|
544
|
+
void *cf = cframe_raw(L->cframe);
|
545
|
+
const BCIns *oldpc = cframe_pc(cf);
|
546
|
+
global_State *g;
|
547
|
+
setcframe_pc(cf, pc);
|
548
|
+
L->top = L->base + cur_topslot(pt, pc, cframe_multres_n(cf));
|
549
|
+
lj_profile_interpreter(L);
|
550
|
+
setcframe_pc(cf, oldpc);
|
551
|
+
g = G(L);
|
552
|
+
setgcref(g->cur_L, obj2gco(L));
|
553
|
+
setvmstate(g, INTERP);
|
554
|
+
ERRNO_RESTORE
|
555
|
+
}
|
556
|
+
#endif
|
557
|
+
|