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,178 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** FFI C call handling.
|
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#ifndef _LJ_CCALL_H
|
|
7
|
+
#define _LJ_CCALL_H
|
|
8
|
+
|
|
9
|
+
#include "lj_obj.h"
|
|
10
|
+
#include "lj_ctype.h"
|
|
11
|
+
|
|
12
|
+
#if LJ_HASFFI
|
|
13
|
+
|
|
14
|
+
/* -- C calling conventions ----------------------------------------------- */
|
|
15
|
+
|
|
16
|
+
#if LJ_TARGET_X86ORX64
|
|
17
|
+
|
|
18
|
+
#if LJ_TARGET_X86
|
|
19
|
+
#define CCALL_NARG_GPR 2 /* For fastcall arguments. */
|
|
20
|
+
#define CCALL_NARG_FPR 0
|
|
21
|
+
#define CCALL_NRET_GPR 2
|
|
22
|
+
#define CCALL_NRET_FPR 1 /* For FP results on x87 stack. */
|
|
23
|
+
#define CCALL_ALIGN_STACKARG 0 /* Don't align argument on stack. */
|
|
24
|
+
#elif LJ_ABI_WIN
|
|
25
|
+
#define CCALL_NARG_GPR 4
|
|
26
|
+
#define CCALL_NARG_FPR 4
|
|
27
|
+
#define CCALL_NRET_GPR 1
|
|
28
|
+
#define CCALL_NRET_FPR 1
|
|
29
|
+
#define CCALL_SPS_EXTRA 4
|
|
30
|
+
#else
|
|
31
|
+
#define CCALL_NARG_GPR 6
|
|
32
|
+
#define CCALL_NARG_FPR 8
|
|
33
|
+
#define CCALL_NRET_GPR 2
|
|
34
|
+
#define CCALL_NRET_FPR 2
|
|
35
|
+
#define CCALL_VECTOR_REG 1 /* Pass vectors in registers. */
|
|
36
|
+
#endif
|
|
37
|
+
|
|
38
|
+
#define CCALL_SPS_FREE 1
|
|
39
|
+
#define CCALL_ALIGN_CALLSTATE 16
|
|
40
|
+
|
|
41
|
+
typedef LJ_ALIGN(16) union FPRArg {
|
|
42
|
+
double d[2];
|
|
43
|
+
float f[4];
|
|
44
|
+
uint8_t b[16];
|
|
45
|
+
uint16_t s[8];
|
|
46
|
+
int i[4];
|
|
47
|
+
int64_t l[2];
|
|
48
|
+
} FPRArg;
|
|
49
|
+
|
|
50
|
+
typedef intptr_t GPRArg;
|
|
51
|
+
|
|
52
|
+
#elif LJ_TARGET_ARM
|
|
53
|
+
|
|
54
|
+
#define CCALL_NARG_GPR 4
|
|
55
|
+
#define CCALL_NRET_GPR 2 /* For softfp double. */
|
|
56
|
+
#if LJ_ABI_SOFTFP
|
|
57
|
+
#define CCALL_NARG_FPR 0
|
|
58
|
+
#define CCALL_NRET_FPR 0
|
|
59
|
+
#else
|
|
60
|
+
#define CCALL_NARG_FPR 8
|
|
61
|
+
#define CCALL_NRET_FPR 4
|
|
62
|
+
#endif
|
|
63
|
+
#define CCALL_SPS_FREE 0
|
|
64
|
+
|
|
65
|
+
typedef intptr_t GPRArg;
|
|
66
|
+
typedef union FPRArg {
|
|
67
|
+
double d;
|
|
68
|
+
float f[2];
|
|
69
|
+
} FPRArg;
|
|
70
|
+
|
|
71
|
+
#elif LJ_TARGET_ARM64
|
|
72
|
+
|
|
73
|
+
#define CCALL_NARG_GPR 8
|
|
74
|
+
#define CCALL_NRET_GPR 2
|
|
75
|
+
#define CCALL_NARG_FPR 8
|
|
76
|
+
#define CCALL_NRET_FPR 4
|
|
77
|
+
#define CCALL_SPS_FREE 0
|
|
78
|
+
|
|
79
|
+
typedef intptr_t GPRArg;
|
|
80
|
+
typedef union FPRArg {
|
|
81
|
+
double d;
|
|
82
|
+
float f;
|
|
83
|
+
uint32_t u32;
|
|
84
|
+
} FPRArg;
|
|
85
|
+
|
|
86
|
+
#elif LJ_TARGET_PPC
|
|
87
|
+
|
|
88
|
+
#define CCALL_NARG_GPR 8
|
|
89
|
+
#define CCALL_NARG_FPR 8
|
|
90
|
+
#define CCALL_NRET_GPR 4 /* For complex double. */
|
|
91
|
+
#define CCALL_NRET_FPR 1
|
|
92
|
+
#define CCALL_SPS_EXTRA 4
|
|
93
|
+
#define CCALL_SPS_FREE 0
|
|
94
|
+
|
|
95
|
+
typedef intptr_t GPRArg;
|
|
96
|
+
typedef double FPRArg;
|
|
97
|
+
|
|
98
|
+
#elif LJ_TARGET_MIPS
|
|
99
|
+
|
|
100
|
+
#define CCALL_NARG_GPR 4
|
|
101
|
+
#define CCALL_NARG_FPR 2
|
|
102
|
+
#define CCALL_NRET_GPR 2
|
|
103
|
+
#define CCALL_NRET_FPR 2
|
|
104
|
+
#define CCALL_SPS_EXTRA 7
|
|
105
|
+
#define CCALL_SPS_FREE 1
|
|
106
|
+
|
|
107
|
+
typedef intptr_t GPRArg;
|
|
108
|
+
typedef union FPRArg {
|
|
109
|
+
double d;
|
|
110
|
+
struct { LJ_ENDIAN_LOHI(float f; , float g;) };
|
|
111
|
+
} FPRArg;
|
|
112
|
+
|
|
113
|
+
#else
|
|
114
|
+
#error "Missing calling convention definitions for this architecture"
|
|
115
|
+
#endif
|
|
116
|
+
|
|
117
|
+
#ifndef CCALL_SPS_EXTRA
|
|
118
|
+
#define CCALL_SPS_EXTRA 0
|
|
119
|
+
#endif
|
|
120
|
+
#ifndef CCALL_VECTOR_REG
|
|
121
|
+
#define CCALL_VECTOR_REG 0
|
|
122
|
+
#endif
|
|
123
|
+
#ifndef CCALL_ALIGN_STACKARG
|
|
124
|
+
#define CCALL_ALIGN_STACKARG 1
|
|
125
|
+
#endif
|
|
126
|
+
#ifndef CCALL_ALIGN_CALLSTATE
|
|
127
|
+
#define CCALL_ALIGN_CALLSTATE 8
|
|
128
|
+
#endif
|
|
129
|
+
|
|
130
|
+
#define CCALL_NUM_GPR \
|
|
131
|
+
(CCALL_NARG_GPR > CCALL_NRET_GPR ? CCALL_NARG_GPR : CCALL_NRET_GPR)
|
|
132
|
+
#define CCALL_NUM_FPR \
|
|
133
|
+
(CCALL_NARG_FPR > CCALL_NRET_FPR ? CCALL_NARG_FPR : CCALL_NRET_FPR)
|
|
134
|
+
|
|
135
|
+
/* Check against constants in lj_ctype.h. */
|
|
136
|
+
LJ_STATIC_ASSERT(CCALL_NUM_GPR <= CCALL_MAX_GPR);
|
|
137
|
+
LJ_STATIC_ASSERT(CCALL_NUM_FPR <= CCALL_MAX_FPR);
|
|
138
|
+
|
|
139
|
+
#define CCALL_MAXSTACK 32
|
|
140
|
+
|
|
141
|
+
/* -- C call state -------------------------------------------------------- */
|
|
142
|
+
|
|
143
|
+
typedef LJ_ALIGN(CCALL_ALIGN_CALLSTATE) struct CCallState {
|
|
144
|
+
void (*func)(void); /* Pointer to called function. */
|
|
145
|
+
uint32_t spadj; /* Stack pointer adjustment. */
|
|
146
|
+
uint8_t nsp; /* Number of stack slots. */
|
|
147
|
+
uint8_t retref; /* Return value by reference. */
|
|
148
|
+
#if LJ_TARGET_X64
|
|
149
|
+
uint8_t ngpr; /* Number of arguments in GPRs. */
|
|
150
|
+
uint8_t nfpr; /* Number of arguments in FPRs. */
|
|
151
|
+
#elif LJ_TARGET_X86
|
|
152
|
+
uint8_t resx87; /* Result on x87 stack: 1:float, 2:double. */
|
|
153
|
+
#elif LJ_TARGET_ARM64
|
|
154
|
+
void *retp; /* Aggregate return pointer in x8. */
|
|
155
|
+
#elif LJ_TARGET_PPC
|
|
156
|
+
uint8_t nfpr; /* Number of arguments in FPRs. */
|
|
157
|
+
#endif
|
|
158
|
+
#if LJ_32
|
|
159
|
+
int32_t align1;
|
|
160
|
+
#endif
|
|
161
|
+
#if CCALL_NUM_FPR
|
|
162
|
+
FPRArg fpr[CCALL_NUM_FPR]; /* Arguments/results in FPRs. */
|
|
163
|
+
#endif
|
|
164
|
+
GPRArg gpr[CCALL_NUM_GPR]; /* Arguments/results in GPRs. */
|
|
165
|
+
GPRArg stack[CCALL_MAXSTACK]; /* Stack slots. */
|
|
166
|
+
} CCallState;
|
|
167
|
+
|
|
168
|
+
/* -- C call handling ----------------------------------------------------- */
|
|
169
|
+
|
|
170
|
+
/* Really belongs to lj_vm.h. */
|
|
171
|
+
LJ_ASMF void LJ_FASTCALL lj_vm_ffi_call(CCallState *cc);
|
|
172
|
+
|
|
173
|
+
LJ_FUNC CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o);
|
|
174
|
+
LJ_FUNC int lj_ccall_func(lua_State *L, GCcdata *cd);
|
|
175
|
+
|
|
176
|
+
#endif
|
|
177
|
+
|
|
178
|
+
#endif
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,712 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** FFI C callback handling.
|
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include "lj_obj.h"
|
|
7
|
+
|
|
8
|
+
#if LJ_HASFFI
|
|
9
|
+
|
|
10
|
+
#include "lj_gc.h"
|
|
11
|
+
#include "lj_err.h"
|
|
12
|
+
#include "lj_tab.h"
|
|
13
|
+
#include "lj_state.h"
|
|
14
|
+
#include "lj_frame.h"
|
|
15
|
+
#include "lj_ctype.h"
|
|
16
|
+
#include "lj_cconv.h"
|
|
17
|
+
#include "lj_ccall.h"
|
|
18
|
+
#include "lj_ccallback.h"
|
|
19
|
+
#include "lj_target.h"
|
|
20
|
+
#include "lj_mcode.h"
|
|
21
|
+
#include "lj_trace.h"
|
|
22
|
+
#include "lj_vm.h"
|
|
23
|
+
|
|
24
|
+
/* -- Target-specific handling of callback slots -------------------------- */
|
|
25
|
+
|
|
26
|
+
#define CALLBACK_MCODE_SIZE (LJ_PAGESIZE * LJ_NUM_CBPAGE)
|
|
27
|
+
|
|
28
|
+
#if LJ_OS_NOJIT
|
|
29
|
+
|
|
30
|
+
/* Callbacks disabled. */
|
|
31
|
+
#define CALLBACK_SLOT2OFS(slot) (0*(slot))
|
|
32
|
+
#define CALLBACK_OFS2SLOT(ofs) (0*(ofs))
|
|
33
|
+
#define CALLBACK_MAX_SLOT 0
|
|
34
|
+
|
|
35
|
+
#elif LJ_TARGET_X86ORX64
|
|
36
|
+
|
|
37
|
+
#define CALLBACK_MCODE_HEAD (LJ_64 ? 8 : 0)
|
|
38
|
+
#define CALLBACK_MCODE_GROUP (-2+1+2+(LJ_GC64 ? 10 : 5)+(LJ_64 ? 6 : 5))
|
|
39
|
+
|
|
40
|
+
#define CALLBACK_SLOT2OFS(slot) \
|
|
41
|
+
(CALLBACK_MCODE_HEAD + CALLBACK_MCODE_GROUP*((slot)/32) + 4*(slot))
|
|
42
|
+
|
|
43
|
+
static MSize CALLBACK_OFS2SLOT(MSize ofs)
|
|
44
|
+
{
|
|
45
|
+
MSize group;
|
|
46
|
+
ofs -= CALLBACK_MCODE_HEAD;
|
|
47
|
+
group = ofs / (32*4 + CALLBACK_MCODE_GROUP);
|
|
48
|
+
return (ofs % (32*4 + CALLBACK_MCODE_GROUP))/4 + group*32;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
#define CALLBACK_MAX_SLOT \
|
|
52
|
+
(((CALLBACK_MCODE_SIZE-CALLBACK_MCODE_HEAD)/(CALLBACK_MCODE_GROUP+4*32))*32)
|
|
53
|
+
|
|
54
|
+
#elif LJ_TARGET_ARM
|
|
55
|
+
|
|
56
|
+
#define CALLBACK_MCODE_HEAD 32
|
|
57
|
+
|
|
58
|
+
#elif LJ_TARGET_ARM64
|
|
59
|
+
|
|
60
|
+
#define CALLBACK_MCODE_HEAD 32
|
|
61
|
+
|
|
62
|
+
#elif LJ_TARGET_PPC
|
|
63
|
+
|
|
64
|
+
#define CALLBACK_MCODE_HEAD 24
|
|
65
|
+
|
|
66
|
+
#elif LJ_TARGET_MIPS
|
|
67
|
+
|
|
68
|
+
#define CALLBACK_MCODE_HEAD 24
|
|
69
|
+
|
|
70
|
+
#else
|
|
71
|
+
|
|
72
|
+
/* Missing support for this architecture. */
|
|
73
|
+
#define CALLBACK_SLOT2OFS(slot) (0*(slot))
|
|
74
|
+
#define CALLBACK_OFS2SLOT(ofs) (0*(ofs))
|
|
75
|
+
#define CALLBACK_MAX_SLOT 0
|
|
76
|
+
|
|
77
|
+
#endif
|
|
78
|
+
|
|
79
|
+
#ifndef CALLBACK_SLOT2OFS
|
|
80
|
+
#define CALLBACK_SLOT2OFS(slot) (CALLBACK_MCODE_HEAD + 8*(slot))
|
|
81
|
+
#define CALLBACK_OFS2SLOT(ofs) (((ofs)-CALLBACK_MCODE_HEAD)/8)
|
|
82
|
+
#define CALLBACK_MAX_SLOT (CALLBACK_OFS2SLOT(CALLBACK_MCODE_SIZE))
|
|
83
|
+
#endif
|
|
84
|
+
|
|
85
|
+
/* Convert callback slot number to callback function pointer. */
|
|
86
|
+
static void *callback_slot2ptr(CTState *cts, MSize slot)
|
|
87
|
+
{
|
|
88
|
+
return (uint8_t *)cts->cb.mcode + CALLBACK_SLOT2OFS(slot);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Convert callback function pointer to slot number. */
|
|
92
|
+
MSize lj_ccallback_ptr2slot(CTState *cts, void *p)
|
|
93
|
+
{
|
|
94
|
+
uintptr_t ofs = (uintptr_t)((uint8_t *)p -(uint8_t *)cts->cb.mcode);
|
|
95
|
+
if (ofs < CALLBACK_MCODE_SIZE) {
|
|
96
|
+
MSize slot = CALLBACK_OFS2SLOT((MSize)ofs);
|
|
97
|
+
if (CALLBACK_SLOT2OFS(slot) == (MSize)ofs)
|
|
98
|
+
return slot;
|
|
99
|
+
}
|
|
100
|
+
return ~0u; /* Not a known callback function pointer. */
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Initialize machine code for callback function pointers. */
|
|
104
|
+
#if LJ_OS_NOJIT
|
|
105
|
+
/* Disabled callback support. */
|
|
106
|
+
#define callback_mcode_init(g, p) UNUSED(p)
|
|
107
|
+
#elif LJ_TARGET_X86ORX64
|
|
108
|
+
static void callback_mcode_init(global_State *g, uint8_t *page)
|
|
109
|
+
{
|
|
110
|
+
uint8_t *p = page;
|
|
111
|
+
uint8_t *target = (uint8_t *)(void *)lj_vm_ffi_callback;
|
|
112
|
+
MSize slot;
|
|
113
|
+
#if LJ_64
|
|
114
|
+
*(void **)p = target; p += 8;
|
|
115
|
+
#endif
|
|
116
|
+
for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
|
|
117
|
+
/* mov al, slot; jmp group */
|
|
118
|
+
*p++ = XI_MOVrib | RID_EAX; *p++ = (uint8_t)slot;
|
|
119
|
+
if ((slot & 31) == 31 || slot == CALLBACK_MAX_SLOT-1) {
|
|
120
|
+
/* push ebp/rbp; mov ah, slot>>8; mov ebp, &g. */
|
|
121
|
+
*p++ = XI_PUSH + RID_EBP;
|
|
122
|
+
*p++ = XI_MOVrib | (RID_EAX+4); *p++ = (uint8_t)(slot >> 8);
|
|
123
|
+
#if LJ_GC64
|
|
124
|
+
*p++ = 0x48; *p++ = XI_MOVri | RID_EBP;
|
|
125
|
+
*(uint64_t *)p = (uint64_t)(g); p += 8;
|
|
126
|
+
#else
|
|
127
|
+
*p++ = XI_MOVri | RID_EBP;
|
|
128
|
+
*(int32_t *)p = i32ptr(g); p += 4;
|
|
129
|
+
#endif
|
|
130
|
+
#if LJ_64
|
|
131
|
+
/* jmp [rip-pageofs] where lj_vm_ffi_callback is stored. */
|
|
132
|
+
*p++ = XI_GROUP5; *p++ = XM_OFS0 + (XOg_JMP<<3) + RID_EBP;
|
|
133
|
+
*(int32_t *)p = (int32_t)(page-(p+4)); p += 4;
|
|
134
|
+
#else
|
|
135
|
+
/* jmp lj_vm_ffi_callback. */
|
|
136
|
+
*p++ = XI_JMP; *(int32_t *)p = target-(p+4); p += 4;
|
|
137
|
+
#endif
|
|
138
|
+
} else {
|
|
139
|
+
*p++ = XI_JMPs; *p++ = (uint8_t)((2+2)*(31-(slot&31)) - 2);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
lua_assert(p - page <= CALLBACK_MCODE_SIZE);
|
|
143
|
+
}
|
|
144
|
+
#elif LJ_TARGET_ARM
|
|
145
|
+
static void callback_mcode_init(global_State *g, uint32_t *page)
|
|
146
|
+
{
|
|
147
|
+
uint32_t *p = page;
|
|
148
|
+
void *target = (void *)lj_vm_ffi_callback;
|
|
149
|
+
MSize slot;
|
|
150
|
+
/* This must match with the saveregs macro in buildvm_arm.dasc. */
|
|
151
|
+
*p++ = ARMI_SUB|ARMF_D(RID_R12)|ARMF_N(RID_R12)|ARMF_M(RID_PC);
|
|
152
|
+
*p++ = ARMI_PUSH|ARMF_N(RID_SP)|RSET_RANGE(RID_R4,RID_R11+1)|RID2RSET(RID_LR);
|
|
153
|
+
*p++ = ARMI_SUB|ARMI_K12|ARMF_D(RID_R12)|ARMF_N(RID_R12)|CALLBACK_MCODE_HEAD;
|
|
154
|
+
*p++ = ARMI_STR|ARMI_LS_P|ARMI_LS_W|ARMF_D(RID_R12)|ARMF_N(RID_SP)|(CFRAME_SIZE-4*9);
|
|
155
|
+
*p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_R12)|ARMF_N(RID_PC);
|
|
156
|
+
*p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_PC)|ARMF_N(RID_PC);
|
|
157
|
+
*p++ = u32ptr(g);
|
|
158
|
+
*p++ = u32ptr(target);
|
|
159
|
+
for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
|
|
160
|
+
*p++ = ARMI_MOV|ARMF_D(RID_R12)|ARMF_M(RID_PC);
|
|
161
|
+
*p = ARMI_B | ((page-p-2) & 0x00ffffffu);
|
|
162
|
+
p++;
|
|
163
|
+
}
|
|
164
|
+
lua_assert(p - page <= CALLBACK_MCODE_SIZE);
|
|
165
|
+
}
|
|
166
|
+
#elif LJ_TARGET_ARM64
|
|
167
|
+
static void callback_mcode_init(global_State *g, uint32_t *page)
|
|
168
|
+
{
|
|
169
|
+
uint32_t *p = page;
|
|
170
|
+
void *target = (void *)lj_vm_ffi_callback;
|
|
171
|
+
MSize slot;
|
|
172
|
+
*p++ = A64I_LDRLx | A64F_D(RID_X11) | A64F_S19(4);
|
|
173
|
+
*p++ = A64I_LDRLx | A64F_D(RID_X10) | A64F_S19(5);
|
|
174
|
+
*p++ = A64I_BR | A64F_N(RID_X11);
|
|
175
|
+
*p++ = A64I_NOP;
|
|
176
|
+
((void **)p)[0] = target;
|
|
177
|
+
((void **)p)[1] = g;
|
|
178
|
+
p += 4;
|
|
179
|
+
for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
|
|
180
|
+
*p++ = A64I_MOVZw | A64F_D(RID_X9) | A64F_U16(slot);
|
|
181
|
+
*p = A64I_B | A64F_S26((page-p) & 0x03ffffffu);
|
|
182
|
+
p++;
|
|
183
|
+
}
|
|
184
|
+
lua_assert(p - page <= CALLBACK_MCODE_SIZE);
|
|
185
|
+
}
|
|
186
|
+
#elif LJ_TARGET_PPC
|
|
187
|
+
static void callback_mcode_init(global_State *g, uint32_t *page)
|
|
188
|
+
{
|
|
189
|
+
uint32_t *p = page;
|
|
190
|
+
void *target = (void *)lj_vm_ffi_callback;
|
|
191
|
+
MSize slot;
|
|
192
|
+
*p++ = PPCI_LIS | PPCF_T(RID_TMP) | (u32ptr(target) >> 16);
|
|
193
|
+
*p++ = PPCI_LIS | PPCF_T(RID_R12) | (u32ptr(g) >> 16);
|
|
194
|
+
*p++ = PPCI_ORI | PPCF_A(RID_TMP)|PPCF_T(RID_TMP) | (u32ptr(target) & 0xffff);
|
|
195
|
+
*p++ = PPCI_ORI | PPCF_A(RID_R12)|PPCF_T(RID_R12) | (u32ptr(g) & 0xffff);
|
|
196
|
+
*p++ = PPCI_MTCTR | PPCF_T(RID_TMP);
|
|
197
|
+
*p++ = PPCI_BCTR;
|
|
198
|
+
for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
|
|
199
|
+
*p++ = PPCI_LI | PPCF_T(RID_R11) | slot;
|
|
200
|
+
*p = PPCI_B | (((page-p) & 0x00ffffffu) << 2);
|
|
201
|
+
p++;
|
|
202
|
+
}
|
|
203
|
+
lua_assert(p - page <= CALLBACK_MCODE_SIZE);
|
|
204
|
+
}
|
|
205
|
+
#elif LJ_TARGET_MIPS
|
|
206
|
+
static void callback_mcode_init(global_State *g, uint32_t *page)
|
|
207
|
+
{
|
|
208
|
+
uint32_t *p = page;
|
|
209
|
+
void *target = (void *)lj_vm_ffi_callback;
|
|
210
|
+
MSize slot;
|
|
211
|
+
*p++ = MIPSI_SW | MIPSF_T(RID_R1)|MIPSF_S(RID_SP) | 0;
|
|
212
|
+
*p++ = MIPSI_LUI | MIPSF_T(RID_R3) | (u32ptr(target) >> 16);
|
|
213
|
+
*p++ = MIPSI_LUI | MIPSF_T(RID_R2) | (u32ptr(g) >> 16);
|
|
214
|
+
*p++ = MIPSI_ORI | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) |(u32ptr(target)&0xffff);
|
|
215
|
+
*p++ = MIPSI_JR | MIPSF_S(RID_R3);
|
|
216
|
+
*p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | (u32ptr(g)&0xffff);
|
|
217
|
+
for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
|
|
218
|
+
*p = MIPSI_B | ((page-p-1) & 0x0000ffffu);
|
|
219
|
+
p++;
|
|
220
|
+
*p++ = MIPSI_LI | MIPSF_T(RID_R1) | slot;
|
|
221
|
+
}
|
|
222
|
+
lua_assert(p - page <= CALLBACK_MCODE_SIZE);
|
|
223
|
+
}
|
|
224
|
+
#else
|
|
225
|
+
/* Missing support for this architecture. */
|
|
226
|
+
#define callback_mcode_init(g, p) UNUSED(p)
|
|
227
|
+
#endif
|
|
228
|
+
|
|
229
|
+
/* -- Machine code management --------------------------------------------- */
|
|
230
|
+
|
|
231
|
+
#if LJ_TARGET_WINDOWS
|
|
232
|
+
|
|
233
|
+
#define WIN32_LEAN_AND_MEAN
|
|
234
|
+
#include <windows.h>
|
|
235
|
+
|
|
236
|
+
#elif LJ_TARGET_POSIX
|
|
237
|
+
|
|
238
|
+
#include <sys/mman.h>
|
|
239
|
+
#ifndef MAP_ANONYMOUS
|
|
240
|
+
#define MAP_ANONYMOUS MAP_ANON
|
|
241
|
+
#endif
|
|
242
|
+
|
|
243
|
+
#endif
|
|
244
|
+
|
|
245
|
+
/* Allocate and initialize area for callback function pointers. */
|
|
246
|
+
static void callback_mcode_new(CTState *cts)
|
|
247
|
+
{
|
|
248
|
+
size_t sz = (size_t)CALLBACK_MCODE_SIZE;
|
|
249
|
+
void *p;
|
|
250
|
+
if (CALLBACK_MAX_SLOT == 0)
|
|
251
|
+
lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
|
|
252
|
+
#if LJ_TARGET_WINDOWS
|
|
253
|
+
p = VirtualAlloc(NULL, sz, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
|
|
254
|
+
if (!p)
|
|
255
|
+
lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
|
|
256
|
+
#elif LJ_TARGET_POSIX
|
|
257
|
+
p = mmap(NULL, sz, (PROT_READ|PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS,
|
|
258
|
+
-1, 0);
|
|
259
|
+
if (p == MAP_FAILED)
|
|
260
|
+
lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
|
|
261
|
+
#else
|
|
262
|
+
/* Fallback allocator. Fails if memory is not executable by default. */
|
|
263
|
+
p = lj_mem_new(cts->L, sz);
|
|
264
|
+
#endif
|
|
265
|
+
cts->cb.mcode = p;
|
|
266
|
+
callback_mcode_init(cts->g, p);
|
|
267
|
+
lj_mcode_sync(p, (char *)p + sz);
|
|
268
|
+
#if LJ_TARGET_WINDOWS
|
|
269
|
+
{
|
|
270
|
+
DWORD oprot;
|
|
271
|
+
VirtualProtect(p, sz, PAGE_EXECUTE_READ, &oprot);
|
|
272
|
+
}
|
|
273
|
+
#elif LJ_TARGET_POSIX
|
|
274
|
+
mprotect(p, sz, (PROT_READ|PROT_EXEC));
|
|
275
|
+
#endif
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/* Free area for callback function pointers. */
|
|
279
|
+
void lj_ccallback_mcode_free(CTState *cts)
|
|
280
|
+
{
|
|
281
|
+
size_t sz = (size_t)CALLBACK_MCODE_SIZE;
|
|
282
|
+
void *p = cts->cb.mcode;
|
|
283
|
+
if (p == NULL) return;
|
|
284
|
+
#if LJ_TARGET_WINDOWS
|
|
285
|
+
VirtualFree(p, 0, MEM_RELEASE);
|
|
286
|
+
UNUSED(sz);
|
|
287
|
+
#elif LJ_TARGET_POSIX
|
|
288
|
+
munmap(p, sz);
|
|
289
|
+
#else
|
|
290
|
+
lj_mem_free(cts->g, p, sz);
|
|
291
|
+
#endif
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* -- C callback entry ---------------------------------------------------- */
|
|
295
|
+
|
|
296
|
+
/* Target-specific handling of register arguments. Similar to lj_ccall.c. */
|
|
297
|
+
#if LJ_TARGET_X86
|
|
298
|
+
|
|
299
|
+
#define CALLBACK_HANDLE_REGARG \
|
|
300
|
+
if (!isfp) { /* Only non-FP values may be passed in registers. */ \
|
|
301
|
+
if (n > 1) { /* Anything > 32 bit is passed on the stack. */ \
|
|
302
|
+
if (!LJ_ABI_WIN) ngpr = maxgpr; /* Prevent reordering. */ \
|
|
303
|
+
} else if (ngpr + 1 <= maxgpr) { \
|
|
304
|
+
sp = &cts->cb.gpr[ngpr]; \
|
|
305
|
+
ngpr += n; \
|
|
306
|
+
goto done; \
|
|
307
|
+
} \
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
#elif LJ_TARGET_X64 && LJ_ABI_WIN
|
|
311
|
+
|
|
312
|
+
/* Windows/x64 argument registers are strictly positional (use ngpr). */
|
|
313
|
+
#define CALLBACK_HANDLE_REGARG \
|
|
314
|
+
if (isfp) { \
|
|
315
|
+
if (ngpr < maxgpr) { sp = &cts->cb.fpr[ngpr++]; UNUSED(nfpr); goto done; } \
|
|
316
|
+
} else { \
|
|
317
|
+
if (ngpr < maxgpr) { sp = &cts->cb.gpr[ngpr++]; goto done; } \
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
#elif LJ_TARGET_X64
|
|
321
|
+
|
|
322
|
+
#define CALLBACK_HANDLE_REGARG \
|
|
323
|
+
if (isfp) { \
|
|
324
|
+
if (nfpr + n <= CCALL_NARG_FPR) { \
|
|
325
|
+
sp = &cts->cb.fpr[nfpr]; \
|
|
326
|
+
nfpr += n; \
|
|
327
|
+
goto done; \
|
|
328
|
+
} \
|
|
329
|
+
} else { \
|
|
330
|
+
if (ngpr + n <= maxgpr) { \
|
|
331
|
+
sp = &cts->cb.gpr[ngpr]; \
|
|
332
|
+
ngpr += n; \
|
|
333
|
+
goto done; \
|
|
334
|
+
} \
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
#elif LJ_TARGET_ARM
|
|
338
|
+
|
|
339
|
+
#if LJ_ABI_SOFTFP
|
|
340
|
+
|
|
341
|
+
#define CALLBACK_HANDLE_REGARG_FP1 UNUSED(isfp);
|
|
342
|
+
#define CALLBACK_HANDLE_REGARG_FP2
|
|
343
|
+
|
|
344
|
+
#else
|
|
345
|
+
|
|
346
|
+
#define CALLBACK_HANDLE_REGARG_FP1 \
|
|
347
|
+
if (isfp) { \
|
|
348
|
+
if (n == 1) { \
|
|
349
|
+
if (fprodd) { \
|
|
350
|
+
sp = &cts->cb.fpr[fprodd-1]; \
|
|
351
|
+
fprodd = 0; \
|
|
352
|
+
goto done; \
|
|
353
|
+
} else if (nfpr + 1 <= CCALL_NARG_FPR) { \
|
|
354
|
+
sp = &cts->cb.fpr[nfpr++]; \
|
|
355
|
+
fprodd = nfpr; \
|
|
356
|
+
goto done; \
|
|
357
|
+
} \
|
|
358
|
+
} else { \
|
|
359
|
+
if (nfpr + 1 <= CCALL_NARG_FPR) { \
|
|
360
|
+
sp = &cts->cb.fpr[nfpr++]; \
|
|
361
|
+
goto done; \
|
|
362
|
+
} \
|
|
363
|
+
} \
|
|
364
|
+
fprodd = 0; /* No reordering after the first FP value is on stack. */ \
|
|
365
|
+
} else {
|
|
366
|
+
|
|
367
|
+
#define CALLBACK_HANDLE_REGARG_FP2 }
|
|
368
|
+
|
|
369
|
+
#endif
|
|
370
|
+
|
|
371
|
+
#define CALLBACK_HANDLE_REGARG \
|
|
372
|
+
CALLBACK_HANDLE_REGARG_FP1 \
|
|
373
|
+
if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \
|
|
374
|
+
if (ngpr + n <= maxgpr) { \
|
|
375
|
+
sp = &cts->cb.gpr[ngpr]; \
|
|
376
|
+
ngpr += n; \
|
|
377
|
+
goto done; \
|
|
378
|
+
} CALLBACK_HANDLE_REGARG_FP2
|
|
379
|
+
|
|
380
|
+
#elif LJ_TARGET_ARM64
|
|
381
|
+
|
|
382
|
+
#define CALLBACK_HANDLE_REGARG \
|
|
383
|
+
if (isfp) { \
|
|
384
|
+
if (nfpr + n <= CCALL_NARG_FPR) { \
|
|
385
|
+
sp = &cts->cb.fpr[nfpr]; \
|
|
386
|
+
nfpr += n; \
|
|
387
|
+
goto done; \
|
|
388
|
+
} else { \
|
|
389
|
+
nfpr = CCALL_NARG_FPR; /* Prevent reordering. */ \
|
|
390
|
+
} \
|
|
391
|
+
} else { \
|
|
392
|
+
if (!LJ_TARGET_IOS && n > 1) \
|
|
393
|
+
ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \
|
|
394
|
+
if (ngpr + n <= maxgpr) { \
|
|
395
|
+
sp = &cts->cb.gpr[ngpr]; \
|
|
396
|
+
ngpr += n; \
|
|
397
|
+
goto done; \
|
|
398
|
+
} else { \
|
|
399
|
+
ngpr = CCALL_NARG_GPR; /* Prevent reordering. */ \
|
|
400
|
+
} \
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
#elif LJ_TARGET_PPC
|
|
404
|
+
|
|
405
|
+
#define CALLBACK_HANDLE_REGARG \
|
|
406
|
+
if (isfp) { \
|
|
407
|
+
if (nfpr + 1 <= CCALL_NARG_FPR) { \
|
|
408
|
+
sp = &cts->cb.fpr[nfpr++]; \
|
|
409
|
+
cta = ctype_get(cts, CTID_DOUBLE); /* FPRs always hold doubles. */ \
|
|
410
|
+
goto done; \
|
|
411
|
+
} \
|
|
412
|
+
} else { /* Try to pass argument in GPRs. */ \
|
|
413
|
+
if (n > 1) { \
|
|
414
|
+
lua_assert(ctype_isinteger(cta->info) && n == 2); /* int64_t. */ \
|
|
415
|
+
ngpr = (ngpr + 1u) & ~1u; /* Align int64_t to regpair. */ \
|
|
416
|
+
} \
|
|
417
|
+
if (ngpr + n <= maxgpr) { \
|
|
418
|
+
sp = &cts->cb.gpr[ngpr]; \
|
|
419
|
+
ngpr += n; \
|
|
420
|
+
goto done; \
|
|
421
|
+
} \
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
#define CALLBACK_HANDLE_RET \
|
|
425
|
+
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
|
|
426
|
+
*(double *)dp = *(float *)dp; /* FPRs always hold doubles. */
|
|
427
|
+
|
|
428
|
+
#elif LJ_TARGET_MIPS
|
|
429
|
+
|
|
430
|
+
#define CALLBACK_HANDLE_REGARG \
|
|
431
|
+
if (isfp && nfpr < CCALL_NARG_FPR) { /* Try to pass argument in FPRs. */ \
|
|
432
|
+
sp = (void *)((uint8_t *)&cts->cb.fpr[nfpr] + ((LJ_BE && n==1) ? 4 : 0)); \
|
|
433
|
+
nfpr++; ngpr += n; \
|
|
434
|
+
goto done; \
|
|
435
|
+
} else { /* Try to pass argument in GPRs. */ \
|
|
436
|
+
nfpr = CCALL_NARG_FPR; \
|
|
437
|
+
if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \
|
|
438
|
+
if (ngpr + n <= maxgpr) { \
|
|
439
|
+
sp = &cts->cb.gpr[ngpr]; \
|
|
440
|
+
ngpr += n; \
|
|
441
|
+
goto done; \
|
|
442
|
+
} \
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
#define CALLBACK_HANDLE_RET \
|
|
446
|
+
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
|
|
447
|
+
((float *)dp)[1] = *(float *)dp;
|
|
448
|
+
|
|
449
|
+
#else
|
|
450
|
+
#error "Missing calling convention definitions for this architecture"
|
|
451
|
+
#endif
|
|
452
|
+
|
|
453
|
+
/* Convert and push callback arguments to Lua stack. */
|
|
454
|
+
static void callback_conv_args(CTState *cts, lua_State *L)
|
|
455
|
+
{
|
|
456
|
+
TValue *o = L->top;
|
|
457
|
+
intptr_t *stack = cts->cb.stack;
|
|
458
|
+
MSize slot = cts->cb.slot;
|
|
459
|
+
CTypeID id = 0, rid, fid;
|
|
460
|
+
int gcsteps = 0;
|
|
461
|
+
CType *ct;
|
|
462
|
+
GCfunc *fn;
|
|
463
|
+
int fntp;
|
|
464
|
+
MSize ngpr = 0, nsp = 0, maxgpr = CCALL_NARG_GPR;
|
|
465
|
+
#if CCALL_NARG_FPR
|
|
466
|
+
MSize nfpr = 0;
|
|
467
|
+
#if LJ_TARGET_ARM
|
|
468
|
+
MSize fprodd = 0;
|
|
469
|
+
#endif
|
|
470
|
+
#endif
|
|
471
|
+
|
|
472
|
+
if (slot < cts->cb.sizeid && (id = cts->cb.cbid[slot]) != 0) {
|
|
473
|
+
ct = ctype_get(cts, id);
|
|
474
|
+
rid = ctype_cid(ct->info); /* Return type. x86: +(spadj<<16). */
|
|
475
|
+
fn = funcV(lj_tab_getint(cts->miscmap, (int32_t)slot));
|
|
476
|
+
fntp = LJ_TFUNC;
|
|
477
|
+
} else { /* Must set up frame first, before throwing the error. */
|
|
478
|
+
ct = NULL;
|
|
479
|
+
rid = 0;
|
|
480
|
+
fn = (GCfunc *)L;
|
|
481
|
+
fntp = LJ_TTHREAD;
|
|
482
|
+
}
|
|
483
|
+
/* Continuation returns from callback. */
|
|
484
|
+
if (LJ_FR2) {
|
|
485
|
+
(o++)->u64 = LJ_CONT_FFI_CALLBACK;
|
|
486
|
+
(o++)->u64 = rid;
|
|
487
|
+
o++;
|
|
488
|
+
} else {
|
|
489
|
+
o->u32.lo = LJ_CONT_FFI_CALLBACK;
|
|
490
|
+
o->u32.hi = rid;
|
|
491
|
+
o++;
|
|
492
|
+
}
|
|
493
|
+
setframe_gc(o, obj2gco(fn), fntp);
|
|
494
|
+
setframe_ftsz(o, ((char *)(o+1) - (char *)L->base) + FRAME_CONT);
|
|
495
|
+
L->top = L->base = ++o;
|
|
496
|
+
if (!ct)
|
|
497
|
+
lj_err_caller(cts->L, LJ_ERR_FFI_BADCBACK);
|
|
498
|
+
if (isluafunc(fn))
|
|
499
|
+
setcframe_pc(L->cframe, proto_bc(funcproto(fn))+1);
|
|
500
|
+
lj_state_checkstack(L, LUA_MINSTACK); /* May throw. */
|
|
501
|
+
o = L->base; /* Might have been reallocated. */
|
|
502
|
+
|
|
503
|
+
#if LJ_TARGET_X86
|
|
504
|
+
/* x86 has several different calling conventions. */
|
|
505
|
+
switch (ctype_cconv(ct->info)) {
|
|
506
|
+
case CTCC_FASTCALL: maxgpr = 2; break;
|
|
507
|
+
case CTCC_THISCALL: maxgpr = 1; break;
|
|
508
|
+
default: maxgpr = 0; break;
|
|
509
|
+
}
|
|
510
|
+
#endif
|
|
511
|
+
|
|
512
|
+
fid = ct->sib;
|
|
513
|
+
while (fid) {
|
|
514
|
+
CType *ctf = ctype_get(cts, fid);
|
|
515
|
+
if (!ctype_isattrib(ctf->info)) {
|
|
516
|
+
CType *cta;
|
|
517
|
+
void *sp;
|
|
518
|
+
CTSize sz;
|
|
519
|
+
int isfp;
|
|
520
|
+
MSize n;
|
|
521
|
+
lua_assert(ctype_isfield(ctf->info));
|
|
522
|
+
cta = ctype_rawchild(cts, ctf);
|
|
523
|
+
isfp = ctype_isfp(cta->info);
|
|
524
|
+
sz = (cta->size + CTSIZE_PTR-1) & ~(CTSIZE_PTR-1);
|
|
525
|
+
n = sz / CTSIZE_PTR; /* Number of GPRs or stack slots needed. */
|
|
526
|
+
|
|
527
|
+
CALLBACK_HANDLE_REGARG /* Handle register arguments. */
|
|
528
|
+
|
|
529
|
+
/* Otherwise pass argument on stack. */
|
|
530
|
+
if (CCALL_ALIGN_STACKARG && LJ_32 && sz == 8)
|
|
531
|
+
nsp = (nsp + 1) & ~1u; /* Align 64 bit argument on stack. */
|
|
532
|
+
sp = &stack[nsp];
|
|
533
|
+
nsp += n;
|
|
534
|
+
|
|
535
|
+
done:
|
|
536
|
+
if (LJ_BE && cta->size < CTSIZE_PTR)
|
|
537
|
+
sp = (void *)((uint8_t *)sp + CTSIZE_PTR-cta->size);
|
|
538
|
+
gcsteps += lj_cconv_tv_ct(cts, cta, 0, o++, sp);
|
|
539
|
+
}
|
|
540
|
+
fid = ctf->sib;
|
|
541
|
+
}
|
|
542
|
+
L->top = o;
|
|
543
|
+
#if LJ_TARGET_X86
|
|
544
|
+
/* Store stack adjustment for returns from non-cdecl callbacks. */
|
|
545
|
+
if (ctype_cconv(ct->info) != CTCC_CDECL) {
|
|
546
|
+
#if LJ_FR2
|
|
547
|
+
(L->base-3)->u64 |= (nsp << (16+2));
|
|
548
|
+
#else
|
|
549
|
+
(L->base-2)->u32.hi |= (nsp << (16+2));
|
|
550
|
+
#endif
|
|
551
|
+
}
|
|
552
|
+
#endif
|
|
553
|
+
while (gcsteps-- > 0)
|
|
554
|
+
lj_gc_check(L);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/* Convert Lua object to callback result. */
|
|
558
|
+
static void callback_conv_result(CTState *cts, lua_State *L, TValue *o)
|
|
559
|
+
{
|
|
560
|
+
#if LJ_FR2
|
|
561
|
+
CType *ctr = ctype_raw(cts, (uint16_t)(L->base-3)->u64);
|
|
562
|
+
#else
|
|
563
|
+
CType *ctr = ctype_raw(cts, (uint16_t)(L->base-2)->u32.hi);
|
|
564
|
+
#endif
|
|
565
|
+
#if LJ_TARGET_X86
|
|
566
|
+
cts->cb.gpr[2] = 0;
|
|
567
|
+
#endif
|
|
568
|
+
if (!ctype_isvoid(ctr->info)) {
|
|
569
|
+
uint8_t *dp = (uint8_t *)&cts->cb.gpr[0];
|
|
570
|
+
#if CCALL_NUM_FPR
|
|
571
|
+
if (ctype_isfp(ctr->info))
|
|
572
|
+
dp = (uint8_t *)&cts->cb.fpr[0];
|
|
573
|
+
#endif
|
|
574
|
+
lj_cconv_ct_tv(cts, ctr, dp, o, 0);
|
|
575
|
+
#ifdef CALLBACK_HANDLE_RET
|
|
576
|
+
CALLBACK_HANDLE_RET
|
|
577
|
+
#endif
|
|
578
|
+
/* Extend returned integers to (at least) 32 bits. */
|
|
579
|
+
if (ctype_isinteger_or_bool(ctr->info) && ctr->size < 4) {
|
|
580
|
+
if (ctr->info & CTF_UNSIGNED)
|
|
581
|
+
*(uint32_t *)dp = ctr->size == 1 ? (uint32_t)*(uint8_t *)dp :
|
|
582
|
+
(uint32_t)*(uint16_t *)dp;
|
|
583
|
+
else
|
|
584
|
+
*(int32_t *)dp = ctr->size == 1 ? (int32_t)*(int8_t *)dp :
|
|
585
|
+
(int32_t)*(int16_t *)dp;
|
|
586
|
+
}
|
|
587
|
+
#if LJ_TARGET_X86
|
|
588
|
+
if (ctype_isfp(ctr->info))
|
|
589
|
+
cts->cb.gpr[2] = ctr->size == sizeof(float) ? 1 : 2;
|
|
590
|
+
#endif
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/* Enter callback. */
|
|
595
|
+
lua_State * LJ_FASTCALL lj_ccallback_enter(CTState *cts, void *cf)
|
|
596
|
+
{
|
|
597
|
+
lua_State *L = cts->L;
|
|
598
|
+
global_State *g = cts->g;
|
|
599
|
+
lua_assert(L != NULL);
|
|
600
|
+
if (tvref(g->jit_base)) {
|
|
601
|
+
setstrV(L, L->top++, lj_err_str(L, LJ_ERR_FFI_BADCBACK));
|
|
602
|
+
if (g->panic) g->panic(L);
|
|
603
|
+
exit(EXIT_FAILURE);
|
|
604
|
+
}
|
|
605
|
+
lj_trace_abort(g); /* Never record across callback. */
|
|
606
|
+
/* Setup C frame. */
|
|
607
|
+
cframe_prev(cf) = L->cframe;
|
|
608
|
+
setcframe_L(cf, L);
|
|
609
|
+
cframe_errfunc(cf) = -1;
|
|
610
|
+
cframe_nres(cf) = 0;
|
|
611
|
+
L->cframe = cf;
|
|
612
|
+
callback_conv_args(cts, L);
|
|
613
|
+
return L; /* Now call the function on this stack. */
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/* Leave callback. */
|
|
617
|
+
void LJ_FASTCALL lj_ccallback_leave(CTState *cts, TValue *o)
|
|
618
|
+
{
|
|
619
|
+
lua_State *L = cts->L;
|
|
620
|
+
GCfunc *fn;
|
|
621
|
+
TValue *obase = L->base;
|
|
622
|
+
L->base = L->top; /* Keep continuation frame for throwing errors. */
|
|
623
|
+
if (o >= L->base) {
|
|
624
|
+
/* PC of RET* is lost. Point to last line for result conv. errors. */
|
|
625
|
+
fn = curr_func(L);
|
|
626
|
+
if (isluafunc(fn)) {
|
|
627
|
+
GCproto *pt = funcproto(fn);
|
|
628
|
+
setcframe_pc(L->cframe, proto_bc(pt)+pt->sizebc+1);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
callback_conv_result(cts, L, o);
|
|
632
|
+
/* Finally drop C frame and continuation frame. */
|
|
633
|
+
L->top -= 2+2*LJ_FR2;
|
|
634
|
+
L->base = obase;
|
|
635
|
+
L->cframe = cframe_prev(L->cframe);
|
|
636
|
+
cts->cb.slot = 0; /* Blacklist C function that called the callback. */
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
/* -- C callback management ----------------------------------------------- */
|
|
640
|
+
|
|
641
|
+
/* Get an unused slot in the callback slot table. */
|
|
642
|
+
static MSize callback_slot_new(CTState *cts, CType *ct)
|
|
643
|
+
{
|
|
644
|
+
CTypeID id = ctype_typeid(cts, ct);
|
|
645
|
+
CTypeID1 *cbid = cts->cb.cbid;
|
|
646
|
+
MSize top;
|
|
647
|
+
for (top = cts->cb.topid; top < cts->cb.sizeid; top++)
|
|
648
|
+
if (LJ_LIKELY(cbid[top] == 0))
|
|
649
|
+
goto found;
|
|
650
|
+
#if CALLBACK_MAX_SLOT
|
|
651
|
+
if (top >= CALLBACK_MAX_SLOT)
|
|
652
|
+
#endif
|
|
653
|
+
lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
|
|
654
|
+
if (!cts->cb.mcode)
|
|
655
|
+
callback_mcode_new(cts);
|
|
656
|
+
lj_mem_growvec(cts->L, cbid, cts->cb.sizeid, CALLBACK_MAX_SLOT, CTypeID1);
|
|
657
|
+
cts->cb.cbid = cbid;
|
|
658
|
+
memset(cbid+top, 0, (cts->cb.sizeid-top)*sizeof(CTypeID1));
|
|
659
|
+
found:
|
|
660
|
+
cbid[top] = id;
|
|
661
|
+
cts->cb.topid = top+1;
|
|
662
|
+
return top;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/* Check for function pointer and supported argument/result types. */
|
|
666
|
+
static CType *callback_checkfunc(CTState *cts, CType *ct)
|
|
667
|
+
{
|
|
668
|
+
int narg = 0;
|
|
669
|
+
if (!ctype_isptr(ct->info) || (LJ_64 && ct->size != CTSIZE_PTR))
|
|
670
|
+
return NULL;
|
|
671
|
+
ct = ctype_rawchild(cts, ct);
|
|
672
|
+
if (ctype_isfunc(ct->info)) {
|
|
673
|
+
CType *ctr = ctype_rawchild(cts, ct);
|
|
674
|
+
CTypeID fid = ct->sib;
|
|
675
|
+
if (!(ctype_isvoid(ctr->info) || ctype_isenum(ctr->info) ||
|
|
676
|
+
ctype_isptr(ctr->info) || (ctype_isnum(ctr->info) && ctr->size <= 8)))
|
|
677
|
+
return NULL;
|
|
678
|
+
if ((ct->info & CTF_VARARG))
|
|
679
|
+
return NULL;
|
|
680
|
+
while (fid) {
|
|
681
|
+
CType *ctf = ctype_get(cts, fid);
|
|
682
|
+
if (!ctype_isattrib(ctf->info)) {
|
|
683
|
+
CType *cta;
|
|
684
|
+
lua_assert(ctype_isfield(ctf->info));
|
|
685
|
+
cta = ctype_rawchild(cts, ctf);
|
|
686
|
+
if (!(ctype_isenum(cta->info) || ctype_isptr(cta->info) ||
|
|
687
|
+
(ctype_isnum(cta->info) && cta->size <= 8)) ||
|
|
688
|
+
++narg >= LUA_MINSTACK-3)
|
|
689
|
+
return NULL;
|
|
690
|
+
}
|
|
691
|
+
fid = ctf->sib;
|
|
692
|
+
}
|
|
693
|
+
return ct;
|
|
694
|
+
}
|
|
695
|
+
return NULL;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/* Create a new callback and return the callback function pointer. */
|
|
699
|
+
void *lj_ccallback_new(CTState *cts, CType *ct, GCfunc *fn)
|
|
700
|
+
{
|
|
701
|
+
ct = callback_checkfunc(cts, ct);
|
|
702
|
+
if (ct) {
|
|
703
|
+
MSize slot = callback_slot_new(cts, ct);
|
|
704
|
+
GCtab *t = cts->miscmap;
|
|
705
|
+
setfuncV(cts->L, lj_tab_setint(cts->L, t, (int32_t)slot), fn);
|
|
706
|
+
lj_gc_anybarriert(cts->L, t);
|
|
707
|
+
return callback_slot2ptr(cts, slot);
|
|
708
|
+
}
|
|
709
|
+
return NULL; /* Bad conversion. */
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
#endif
|