immunio 0.15.4 → 0.16.0
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.
- 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
|
+
|