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
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** Machine code management.
|
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#define lj_mcode_c
|
|
7
|
+
#define LUA_CORE
|
|
8
|
+
|
|
9
|
+
#include "lj_obj.h"
|
|
10
|
+
#if LJ_HASJIT
|
|
11
|
+
#include "lj_gc.h"
|
|
12
|
+
#include "lj_err.h"
|
|
13
|
+
#include "lj_jit.h"
|
|
14
|
+
#include "lj_mcode.h"
|
|
15
|
+
#include "lj_trace.h"
|
|
16
|
+
#include "lj_dispatch.h"
|
|
17
|
+
#endif
|
|
18
|
+
#if LJ_HASJIT || LJ_HASFFI
|
|
19
|
+
#include "lj_vm.h"
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
/* -- OS-specific functions ----------------------------------------------- */
|
|
23
|
+
|
|
24
|
+
#if LJ_HASJIT || LJ_HASFFI
|
|
25
|
+
|
|
26
|
+
/* Define this if you want to run LuaJIT with Valgrind. */
|
|
27
|
+
#ifdef LUAJIT_USE_VALGRIND
|
|
28
|
+
#include <valgrind/valgrind.h>
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
#if LJ_TARGET_IOS
|
|
32
|
+
void sys_icache_invalidate(void *start, size_t len);
|
|
33
|
+
#endif
|
|
34
|
+
|
|
35
|
+
/* Synchronize data/instruction cache. */
|
|
36
|
+
void lj_mcode_sync(void *start, void *end)
|
|
37
|
+
{
|
|
38
|
+
#ifdef LUAJIT_USE_VALGRIND
|
|
39
|
+
VALGRIND_DISCARD_TRANSLATIONS(start, (char *)end-(char *)start);
|
|
40
|
+
#endif
|
|
41
|
+
#if LJ_TARGET_X86ORX64
|
|
42
|
+
UNUSED(start); UNUSED(end);
|
|
43
|
+
#elif LJ_TARGET_IOS
|
|
44
|
+
sys_icache_invalidate(start, (char *)end-(char *)start);
|
|
45
|
+
#elif LJ_TARGET_PPC
|
|
46
|
+
lj_vm_cachesync(start, end);
|
|
47
|
+
#elif defined(__GNUC__)
|
|
48
|
+
__clear_cache(start, end);
|
|
49
|
+
#else
|
|
50
|
+
#error "Missing builtin to flush instruction cache"
|
|
51
|
+
#endif
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#endif
|
|
55
|
+
|
|
56
|
+
#if LJ_HASJIT
|
|
57
|
+
|
|
58
|
+
#if LJ_TARGET_WINDOWS
|
|
59
|
+
|
|
60
|
+
#define WIN32_LEAN_AND_MEAN
|
|
61
|
+
#include <windows.h>
|
|
62
|
+
|
|
63
|
+
#define MCPROT_RW PAGE_READWRITE
|
|
64
|
+
#define MCPROT_RX PAGE_EXECUTE_READ
|
|
65
|
+
#define MCPROT_RWX PAGE_EXECUTE_READWRITE
|
|
66
|
+
|
|
67
|
+
static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, DWORD prot)
|
|
68
|
+
{
|
|
69
|
+
void *p = VirtualAlloc((void *)hint, sz,
|
|
70
|
+
MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, prot);
|
|
71
|
+
if (!p && !hint)
|
|
72
|
+
lj_trace_err(J, LJ_TRERR_MCODEAL);
|
|
73
|
+
return p;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static void mcode_free(jit_State *J, void *p, size_t sz)
|
|
77
|
+
{
|
|
78
|
+
UNUSED(J); UNUSED(sz);
|
|
79
|
+
VirtualFree(p, 0, MEM_RELEASE);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static int mcode_setprot(void *p, size_t sz, DWORD prot)
|
|
83
|
+
{
|
|
84
|
+
DWORD oprot;
|
|
85
|
+
return !VirtualProtect(p, sz, prot, &oprot);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
#elif LJ_TARGET_POSIX
|
|
89
|
+
|
|
90
|
+
#include <sys/mman.h>
|
|
91
|
+
|
|
92
|
+
#ifndef MAP_ANONYMOUS
|
|
93
|
+
#define MAP_ANONYMOUS MAP_ANON
|
|
94
|
+
#endif
|
|
95
|
+
|
|
96
|
+
#define MCPROT_RW (PROT_READ|PROT_WRITE)
|
|
97
|
+
#define MCPROT_RX (PROT_READ|PROT_EXEC)
|
|
98
|
+
#define MCPROT_RWX (PROT_READ|PROT_WRITE|PROT_EXEC)
|
|
99
|
+
|
|
100
|
+
static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)
|
|
101
|
+
{
|
|
102
|
+
void *p = mmap((void *)hint, sz, prot, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
|
103
|
+
if (p == MAP_FAILED) {
|
|
104
|
+
if (!hint) lj_trace_err(J, LJ_TRERR_MCODEAL);
|
|
105
|
+
p = NULL;
|
|
106
|
+
}
|
|
107
|
+
return p;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
static void mcode_free(jit_State *J, void *p, size_t sz)
|
|
111
|
+
{
|
|
112
|
+
UNUSED(J);
|
|
113
|
+
munmap(p, sz);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static int mcode_setprot(void *p, size_t sz, int prot)
|
|
117
|
+
{
|
|
118
|
+
return mprotect(p, sz, prot);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
#elif LJ_64
|
|
122
|
+
|
|
123
|
+
#error "Missing OS support for explicit placement of executable memory"
|
|
124
|
+
|
|
125
|
+
#else
|
|
126
|
+
|
|
127
|
+
/* Fallback allocator. This will fail if memory is not executable by default. */
|
|
128
|
+
#define LUAJIT_UNPROTECT_MCODE
|
|
129
|
+
#define MCPROT_RW 0
|
|
130
|
+
#define MCPROT_RX 0
|
|
131
|
+
#define MCPROT_RWX 0
|
|
132
|
+
|
|
133
|
+
static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)
|
|
134
|
+
{
|
|
135
|
+
UNUSED(hint); UNUSED(prot);
|
|
136
|
+
return lj_mem_new(J->L, sz);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static void mcode_free(jit_State *J, void *p, size_t sz)
|
|
140
|
+
{
|
|
141
|
+
lj_mem_free(J2G(J), p, sz);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
#endif
|
|
145
|
+
|
|
146
|
+
/* -- MCode area protection ----------------------------------------------- */
|
|
147
|
+
|
|
148
|
+
/* Define this ONLY if page protection twiddling becomes a bottleneck. */
|
|
149
|
+
#ifdef LUAJIT_UNPROTECT_MCODE
|
|
150
|
+
|
|
151
|
+
/* It's generally considered to be a potential security risk to have
|
|
152
|
+
** pages with simultaneous write *and* execute access in a process.
|
|
153
|
+
**
|
|
154
|
+
** Do not even think about using this mode for server processes or
|
|
155
|
+
** apps handling untrusted external data (such as a browser).
|
|
156
|
+
**
|
|
157
|
+
** The security risk is not in LuaJIT itself -- but if an adversary finds
|
|
158
|
+
** any *other* flaw in your C application logic, then any RWX memory page
|
|
159
|
+
** simplifies writing an exploit considerably.
|
|
160
|
+
*/
|
|
161
|
+
#define MCPROT_GEN MCPROT_RWX
|
|
162
|
+
#define MCPROT_RUN MCPROT_RWX
|
|
163
|
+
|
|
164
|
+
static void mcode_protect(jit_State *J, int prot)
|
|
165
|
+
{
|
|
166
|
+
UNUSED(J); UNUSED(prot);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
#else
|
|
170
|
+
|
|
171
|
+
/* This is the default behaviour and much safer:
|
|
172
|
+
**
|
|
173
|
+
** Most of the time the memory pages holding machine code are executable,
|
|
174
|
+
** but NONE of them is writable.
|
|
175
|
+
**
|
|
176
|
+
** The current memory area is marked read-write (but NOT executable) only
|
|
177
|
+
** during the short time window while the assembler generates machine code.
|
|
178
|
+
*/
|
|
179
|
+
#define MCPROT_GEN MCPROT_RW
|
|
180
|
+
#define MCPROT_RUN MCPROT_RX
|
|
181
|
+
|
|
182
|
+
/* Protection twiddling failed. Probably due to kernel security. */
|
|
183
|
+
static LJ_NOINLINE void mcode_protfail(jit_State *J)
|
|
184
|
+
{
|
|
185
|
+
lua_CFunction panic = J2G(J)->panic;
|
|
186
|
+
if (panic) {
|
|
187
|
+
lua_State *L = J->L;
|
|
188
|
+
setstrV(L, L->top++, lj_err_str(L, LJ_ERR_JITPROT));
|
|
189
|
+
panic(L);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* Change protection of MCode area. */
|
|
194
|
+
static void mcode_protect(jit_State *J, int prot)
|
|
195
|
+
{
|
|
196
|
+
if (J->mcprot != prot) {
|
|
197
|
+
if (LJ_UNLIKELY(mcode_setprot(J->mcarea, J->szmcarea, prot)))
|
|
198
|
+
mcode_protfail(J);
|
|
199
|
+
J->mcprot = prot;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
#endif
|
|
204
|
+
|
|
205
|
+
/* -- MCode area allocation ----------------------------------------------- */
|
|
206
|
+
|
|
207
|
+
#if LJ_TARGET_X64
|
|
208
|
+
#define mcode_validptr(p) ((p) && (uintptr_t)(p) < (uintptr_t)1<<47)
|
|
209
|
+
#else
|
|
210
|
+
#define mcode_validptr(p) ((p) && (uintptr_t)(p) < 0xffff0000)
|
|
211
|
+
#endif
|
|
212
|
+
|
|
213
|
+
#ifdef LJ_TARGET_JUMPRANGE
|
|
214
|
+
|
|
215
|
+
/* Get memory within relative jump distance of our code in 64 bit mode. */
|
|
216
|
+
static void *mcode_alloc(jit_State *J, size_t sz)
|
|
217
|
+
{
|
|
218
|
+
/* Target an address in the static assembler code (64K aligned).
|
|
219
|
+
** Try addresses within a distance of target-range/2+1MB..target+range/2-1MB.
|
|
220
|
+
** Use half the jump range so every address in the range can reach any other.
|
|
221
|
+
*/
|
|
222
|
+
#if LJ_TARGET_MIPS
|
|
223
|
+
/* Use the middle of the 256MB-aligned region. */
|
|
224
|
+
uintptr_t target = ((uintptr_t)(void *)lj_vm_exit_handler & 0xf0000000u) +
|
|
225
|
+
0x08000000u;
|
|
226
|
+
#else
|
|
227
|
+
uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff;
|
|
228
|
+
#endif
|
|
229
|
+
const uintptr_t range = (1u << (LJ_TARGET_JUMPRANGE-1)) - (1u << 21);
|
|
230
|
+
/* First try a contiguous area below the last one. */
|
|
231
|
+
uintptr_t hint = J->mcarea ? (uintptr_t)J->mcarea - sz : 0;
|
|
232
|
+
int i;
|
|
233
|
+
for (i = 0; i < 32; i++) { /* 32 attempts ought to be enough ... */
|
|
234
|
+
if (mcode_validptr(hint)) {
|
|
235
|
+
void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN);
|
|
236
|
+
|
|
237
|
+
if (mcode_validptr(p) &&
|
|
238
|
+
((uintptr_t)p + sz - target < range || target - (uintptr_t)p < range))
|
|
239
|
+
return p;
|
|
240
|
+
if (p) mcode_free(J, p, sz); /* Free badly placed area. */
|
|
241
|
+
}
|
|
242
|
+
/* Next try probing pseudo-random addresses. */
|
|
243
|
+
do {
|
|
244
|
+
hint = (0x78fb ^ LJ_PRNG_BITS(J, 15)) << 16; /* 64K aligned. */
|
|
245
|
+
} while (!(hint + sz < range));
|
|
246
|
+
hint = target + hint - (range>>1);
|
|
247
|
+
}
|
|
248
|
+
lj_trace_err(J, LJ_TRERR_MCODEAL); /* Give up. OS probably ignores hints? */
|
|
249
|
+
return NULL;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
#else
|
|
253
|
+
|
|
254
|
+
/* All memory addresses are reachable by relative jumps. */
|
|
255
|
+
static void *mcode_alloc(jit_State *J, size_t sz)
|
|
256
|
+
{
|
|
257
|
+
#ifdef __OpenBSD__
|
|
258
|
+
/* Allow better executable memory allocation for OpenBSD W^X mode. */
|
|
259
|
+
void *p = mcode_alloc_at(J, 0, sz, MCPROT_RUN);
|
|
260
|
+
if (p && mcode_setprot(p, sz, MCPROT_GEN)) {
|
|
261
|
+
mcode_free(J, p, sz);
|
|
262
|
+
return NULL;
|
|
263
|
+
}
|
|
264
|
+
return p;
|
|
265
|
+
#else
|
|
266
|
+
return mcode_alloc_at(J, 0, sz, MCPROT_GEN);
|
|
267
|
+
#endif
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
#endif
|
|
271
|
+
|
|
272
|
+
/* -- MCode area management ----------------------------------------------- */
|
|
273
|
+
|
|
274
|
+
/* Linked list of MCode areas. */
|
|
275
|
+
typedef struct MCLink {
|
|
276
|
+
MCode *next; /* Next area. */
|
|
277
|
+
size_t size; /* Size of current area. */
|
|
278
|
+
} MCLink;
|
|
279
|
+
|
|
280
|
+
/* Allocate a new MCode area. */
|
|
281
|
+
static void mcode_allocarea(jit_State *J)
|
|
282
|
+
{
|
|
283
|
+
MCode *oldarea = J->mcarea;
|
|
284
|
+
size_t sz = (size_t)J->param[JIT_P_sizemcode] << 10;
|
|
285
|
+
sz = (sz + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);
|
|
286
|
+
J->mcarea = (MCode *)mcode_alloc(J, sz);
|
|
287
|
+
J->szmcarea = sz;
|
|
288
|
+
J->mcprot = MCPROT_GEN;
|
|
289
|
+
J->mctop = (MCode *)((char *)J->mcarea + J->szmcarea);
|
|
290
|
+
J->mcbot = (MCode *)((char *)J->mcarea + sizeof(MCLink));
|
|
291
|
+
((MCLink *)J->mcarea)->next = oldarea;
|
|
292
|
+
((MCLink *)J->mcarea)->size = sz;
|
|
293
|
+
J->szallmcarea += sz;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* Free all MCode areas. */
|
|
297
|
+
void lj_mcode_free(jit_State *J)
|
|
298
|
+
{
|
|
299
|
+
MCode *mc = J->mcarea;
|
|
300
|
+
J->mcarea = NULL;
|
|
301
|
+
J->szallmcarea = 0;
|
|
302
|
+
while (mc) {
|
|
303
|
+
MCode *next = ((MCLink *)mc)->next;
|
|
304
|
+
mcode_free(J, mc, ((MCLink *)mc)->size);
|
|
305
|
+
mc = next;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/* -- MCode transactions -------------------------------------------------- */
|
|
310
|
+
|
|
311
|
+
/* Reserve the remainder of the current MCode area. */
|
|
312
|
+
MCode *lj_mcode_reserve(jit_State *J, MCode **lim)
|
|
313
|
+
{
|
|
314
|
+
if (!J->mcarea)
|
|
315
|
+
mcode_allocarea(J);
|
|
316
|
+
else
|
|
317
|
+
mcode_protect(J, MCPROT_GEN);
|
|
318
|
+
*lim = J->mcbot;
|
|
319
|
+
return J->mctop;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/* Commit the top part of the current MCode area. */
|
|
323
|
+
void lj_mcode_commit(jit_State *J, MCode *top)
|
|
324
|
+
{
|
|
325
|
+
J->mctop = top;
|
|
326
|
+
mcode_protect(J, MCPROT_RUN);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/* Abort the reservation. */
|
|
330
|
+
void lj_mcode_abort(jit_State *J)
|
|
331
|
+
{
|
|
332
|
+
if (J->mcarea)
|
|
333
|
+
mcode_protect(J, MCPROT_RUN);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* Set/reset protection to allow patching of MCode areas. */
|
|
337
|
+
MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish)
|
|
338
|
+
{
|
|
339
|
+
#ifdef LUAJIT_UNPROTECT_MCODE
|
|
340
|
+
UNUSED(J); UNUSED(ptr); UNUSED(finish);
|
|
341
|
+
return NULL;
|
|
342
|
+
#else
|
|
343
|
+
if (finish) {
|
|
344
|
+
if (J->mcarea == ptr)
|
|
345
|
+
mcode_protect(J, MCPROT_RUN);
|
|
346
|
+
else if (LJ_UNLIKELY(mcode_setprot(ptr, ((MCLink *)ptr)->size, MCPROT_RUN)))
|
|
347
|
+
mcode_protfail(J);
|
|
348
|
+
return NULL;
|
|
349
|
+
} else {
|
|
350
|
+
MCode *mc = J->mcarea;
|
|
351
|
+
/* Try current area first to use the protection cache. */
|
|
352
|
+
if (ptr >= mc && ptr < (MCode *)((char *)mc + J->szmcarea)) {
|
|
353
|
+
mcode_protect(J, MCPROT_GEN);
|
|
354
|
+
return mc;
|
|
355
|
+
}
|
|
356
|
+
/* Otherwise search through the list of MCode areas. */
|
|
357
|
+
for (;;) {
|
|
358
|
+
mc = ((MCLink *)mc)->next;
|
|
359
|
+
lua_assert(mc != NULL);
|
|
360
|
+
if (ptr >= mc && ptr < (MCode *)((char *)mc + ((MCLink *)mc)->size)) {
|
|
361
|
+
if (LJ_UNLIKELY(mcode_setprot(mc, ((MCLink *)mc)->size, MCPROT_GEN)))
|
|
362
|
+
mcode_protfail(J);
|
|
363
|
+
return mc;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
#endif
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/* Limit of MCode reservation reached. */
|
|
371
|
+
void lj_mcode_limiterr(jit_State *J, size_t need)
|
|
372
|
+
{
|
|
373
|
+
size_t sizemcode, maxmcode;
|
|
374
|
+
lj_mcode_abort(J);
|
|
375
|
+
sizemcode = (size_t)J->param[JIT_P_sizemcode] << 10;
|
|
376
|
+
sizemcode = (sizemcode + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);
|
|
377
|
+
maxmcode = (size_t)J->param[JIT_P_maxmcode] << 10;
|
|
378
|
+
if ((size_t)need > sizemcode)
|
|
379
|
+
lj_trace_err(J, LJ_TRERR_MCODEOV); /* Too long for any area. */
|
|
380
|
+
if (J->szallmcarea + sizemcode > maxmcode)
|
|
381
|
+
lj_trace_err(J, LJ_TRERR_MCODEAL);
|
|
382
|
+
mcode_allocarea(J);
|
|
383
|
+
lj_trace_err(J, LJ_TRERR_MCODELM); /* Retry with new area. */
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
#endif
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** Machine code management.
|
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#ifndef _LJ_MCODE_H
|
|
7
|
+
#define _LJ_MCODE_H
|
|
8
|
+
|
|
9
|
+
#include "lj_obj.h"
|
|
10
|
+
|
|
11
|
+
#if LJ_HASJIT || LJ_HASFFI
|
|
12
|
+
LJ_FUNC void lj_mcode_sync(void *start, void *end);
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
#if LJ_HASJIT
|
|
16
|
+
|
|
17
|
+
#include "lj_jit.h"
|
|
18
|
+
|
|
19
|
+
LJ_FUNC void lj_mcode_free(jit_State *J);
|
|
20
|
+
LJ_FUNC MCode *lj_mcode_reserve(jit_State *J, MCode **lim);
|
|
21
|
+
LJ_FUNC void lj_mcode_commit(jit_State *J, MCode *m);
|
|
22
|
+
LJ_FUNC void lj_mcode_abort(jit_State *J);
|
|
23
|
+
LJ_FUNC MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish);
|
|
24
|
+
LJ_FUNC_NORET void lj_mcode_limiterr(jit_State *J, size_t need);
|
|
25
|
+
|
|
26
|
+
#define lj_mcode_commitbot(J, m) (J->mcbot = (m))
|
|
27
|
+
|
|
28
|
+
#endif
|
|
29
|
+
|
|
30
|
+
#endif
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** Metamethod handling.
|
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
|
4
|
+
**
|
|
5
|
+
** Portions taken verbatim or adapted from the Lua interpreter.
|
|
6
|
+
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#define lj_meta_c
|
|
10
|
+
#define LUA_CORE
|
|
11
|
+
|
|
12
|
+
#include "lj_obj.h"
|
|
13
|
+
#include "lj_gc.h"
|
|
14
|
+
#include "lj_err.h"
|
|
15
|
+
#include "lj_buf.h"
|
|
16
|
+
#include "lj_str.h"
|
|
17
|
+
#include "lj_tab.h"
|
|
18
|
+
#include "lj_meta.h"
|
|
19
|
+
#include "lj_frame.h"
|
|
20
|
+
#include "lj_bc.h"
|
|
21
|
+
#include "lj_vm.h"
|
|
22
|
+
#include "lj_strscan.h"
|
|
23
|
+
#include "lj_strfmt.h"
|
|
24
|
+
#include "lj_lib.h"
|
|
25
|
+
|
|
26
|
+
/* -- Metamethod handling ------------------------------------------------- */
|
|
27
|
+
|
|
28
|
+
/* String interning of metamethod names for fast indexing. */
|
|
29
|
+
void lj_meta_init(lua_State *L)
|
|
30
|
+
{
|
|
31
|
+
#define MMNAME(name) "__" #name
|
|
32
|
+
const char *metanames = MMDEF(MMNAME);
|
|
33
|
+
#undef MMNAME
|
|
34
|
+
global_State *g = G(L);
|
|
35
|
+
const char *p, *q;
|
|
36
|
+
uint32_t mm;
|
|
37
|
+
for (mm = 0, p = metanames; *p; mm++, p = q) {
|
|
38
|
+
GCstr *s;
|
|
39
|
+
for (q = p+2; *q && *q != '_'; q++) ;
|
|
40
|
+
s = lj_str_new(L, p, (size_t)(q-p));
|
|
41
|
+
/* NOBARRIER: g->gcroot[] is a GC root. */
|
|
42
|
+
setgcref(g->gcroot[GCROOT_MMNAME+mm], obj2gco(s));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* Negative caching of a few fast metamethods. See the lj_meta_fast() macro. */
|
|
47
|
+
cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name)
|
|
48
|
+
{
|
|
49
|
+
cTValue *mo = lj_tab_getstr(mt, name);
|
|
50
|
+
lua_assert(mm <= MM_FAST);
|
|
51
|
+
if (!mo || tvisnil(mo)) { /* No metamethod? */
|
|
52
|
+
mt->nomm |= (uint8_t)(1u<<mm); /* Set negative cache flag. */
|
|
53
|
+
return NULL;
|
|
54
|
+
}
|
|
55
|
+
return mo;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* Lookup metamethod for object. */
|
|
59
|
+
cTValue *lj_meta_lookup(lua_State *L, cTValue *o, MMS mm)
|
|
60
|
+
{
|
|
61
|
+
GCtab *mt;
|
|
62
|
+
if (tvistab(o))
|
|
63
|
+
mt = tabref(tabV(o)->metatable);
|
|
64
|
+
else if (tvisudata(o))
|
|
65
|
+
mt = tabref(udataV(o)->metatable);
|
|
66
|
+
else
|
|
67
|
+
mt = tabref(basemt_obj(G(L), o));
|
|
68
|
+
if (mt) {
|
|
69
|
+
cTValue *mo = lj_tab_getstr(mt, mmname_str(G(L), mm));
|
|
70
|
+
if (mo)
|
|
71
|
+
return mo;
|
|
72
|
+
}
|
|
73
|
+
return niltv(L);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#if LJ_HASFFI
|
|
77
|
+
/* Tailcall from C function. */
|
|
78
|
+
int lj_meta_tailcall(lua_State *L, cTValue *tv)
|
|
79
|
+
{
|
|
80
|
+
TValue *base = L->base;
|
|
81
|
+
TValue *top = L->top;
|
|
82
|
+
const BCIns *pc = frame_pc(base-1); /* Preserve old PC from frame. */
|
|
83
|
+
copyTV(L, base-1-LJ_FR2, tv); /* Replace frame with new object. */
|
|
84
|
+
if (LJ_FR2)
|
|
85
|
+
(top++)->u64 = LJ_CONT_TAILCALL;
|
|
86
|
+
else
|
|
87
|
+
top->u32.lo = LJ_CONT_TAILCALL;
|
|
88
|
+
setframe_pc(top++, pc);
|
|
89
|
+
if (LJ_FR2) top++;
|
|
90
|
+
setframe_gc(top, obj2gco(L), LJ_TTHREAD); /* Dummy frame object. */
|
|
91
|
+
setframe_ftsz(top, ((char *)(top+1) - (char *)base) + FRAME_CONT);
|
|
92
|
+
L->base = L->top = top+1;
|
|
93
|
+
/*
|
|
94
|
+
** before: [old_mo|PC] [... ...]
|
|
95
|
+
** ^base ^top
|
|
96
|
+
** after: [new_mo|itype] [... ...] [NULL|PC] [dummy|delta]
|
|
97
|
+
** ^base/top
|
|
98
|
+
** tailcall: [new_mo|PC] [... ...]
|
|
99
|
+
** ^base ^top
|
|
100
|
+
*/
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
#endif
|
|
104
|
+
|
|
105
|
+
/* Setup call to metamethod to be run by Assembler VM. */
|
|
106
|
+
static TValue *mmcall(lua_State *L, ASMFunction cont, cTValue *mo,
|
|
107
|
+
cTValue *a, cTValue *b)
|
|
108
|
+
{
|
|
109
|
+
/*
|
|
110
|
+
** |-- framesize -> top top+1 top+2 top+3
|
|
111
|
+
** before: [func slots ...]
|
|
112
|
+
** mm setup: [func slots ...] [cont|?] [mo|tmtype] [a] [b]
|
|
113
|
+
** in asm: [func slots ...] [cont|PC] [mo|delta] [a] [b]
|
|
114
|
+
** ^-- func base ^-- mm base
|
|
115
|
+
** after mm: [func slots ...] [result]
|
|
116
|
+
** ^-- copy to base[PC_RA] --/ for lj_cont_ra
|
|
117
|
+
** istruecond + branch for lj_cont_cond*
|
|
118
|
+
** ignore for lj_cont_nop
|
|
119
|
+
** next PC: [func slots ...]
|
|
120
|
+
*/
|
|
121
|
+
TValue *top = L->top;
|
|
122
|
+
if (curr_funcisL(L)) top = curr_topL(L);
|
|
123
|
+
setcont(top++, cont); /* Assembler VM stores PC in upper word or FR2. */
|
|
124
|
+
if (LJ_FR2) setnilV(top++);
|
|
125
|
+
copyTV(L, top++, mo); /* Store metamethod and two arguments. */
|
|
126
|
+
if (LJ_FR2) setnilV(top++);
|
|
127
|
+
copyTV(L, top, a);
|
|
128
|
+
copyTV(L, top+1, b);
|
|
129
|
+
return top; /* Return new base. */
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* -- C helpers for some instructions, called from assembler VM ----------- */
|
|
133
|
+
|
|
134
|
+
/* Helper for TGET*. __index chain and metamethod. */
|
|
135
|
+
cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k)
|
|
136
|
+
{
|
|
137
|
+
int loop;
|
|
138
|
+
for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
|
|
139
|
+
cTValue *mo;
|
|
140
|
+
if (LJ_LIKELY(tvistab(o))) {
|
|
141
|
+
GCtab *t = tabV(o);
|
|
142
|
+
cTValue *tv = lj_tab_get(L, t, k);
|
|
143
|
+
if (!tvisnil(tv) ||
|
|
144
|
+
!(mo = lj_meta_fast(L, tabref(t->metatable), MM_index)))
|
|
145
|
+
return tv;
|
|
146
|
+
} else if (tvisnil(mo = lj_meta_lookup(L, o, MM_index))) {
|
|
147
|
+
lj_err_optype(L, o, LJ_ERR_OPINDEX);
|
|
148
|
+
return NULL; /* unreachable */
|
|
149
|
+
}
|
|
150
|
+
if (tvisfunc(mo)) {
|
|
151
|
+
L->top = mmcall(L, lj_cont_ra, mo, o, k);
|
|
152
|
+
return NULL; /* Trigger metamethod call. */
|
|
153
|
+
}
|
|
154
|
+
o = mo;
|
|
155
|
+
}
|
|
156
|
+
lj_err_msg(L, LJ_ERR_GETLOOP);
|
|
157
|
+
return NULL; /* unreachable */
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Helper for TSET*. __newindex chain and metamethod. */
|
|
161
|
+
TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k)
|
|
162
|
+
{
|
|
163
|
+
TValue tmp;
|
|
164
|
+
int loop;
|
|
165
|
+
for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
|
|
166
|
+
cTValue *mo;
|
|
167
|
+
if (LJ_LIKELY(tvistab(o))) {
|
|
168
|
+
GCtab *t = tabV(o);
|
|
169
|
+
cTValue *tv = lj_tab_get(L, t, k);
|
|
170
|
+
if (LJ_LIKELY(!tvisnil(tv))) {
|
|
171
|
+
t->nomm = 0; /* Invalidate negative metamethod cache. */
|
|
172
|
+
lj_gc_anybarriert(L, t);
|
|
173
|
+
return (TValue *)tv;
|
|
174
|
+
} else if (!(mo = lj_meta_fast(L, tabref(t->metatable), MM_newindex))) {
|
|
175
|
+
t->nomm = 0; /* Invalidate negative metamethod cache. */
|
|
176
|
+
lj_gc_anybarriert(L, t);
|
|
177
|
+
if (tv != niltv(L))
|
|
178
|
+
return (TValue *)tv;
|
|
179
|
+
if (tvisnil(k)) lj_err_msg(L, LJ_ERR_NILIDX);
|
|
180
|
+
else if (tvisint(k)) { setnumV(&tmp, (lua_Number)intV(k)); k = &tmp; }
|
|
181
|
+
else if (tvisnum(k) && tvisnan(k)) lj_err_msg(L, LJ_ERR_NANIDX);
|
|
182
|
+
return lj_tab_newkey(L, t, k);
|
|
183
|
+
}
|
|
184
|
+
} else if (tvisnil(mo = lj_meta_lookup(L, o, MM_newindex))) {
|
|
185
|
+
lj_err_optype(L, o, LJ_ERR_OPINDEX);
|
|
186
|
+
return NULL; /* unreachable */
|
|
187
|
+
}
|
|
188
|
+
if (tvisfunc(mo)) {
|
|
189
|
+
L->top = mmcall(L, lj_cont_nop, mo, o, k);
|
|
190
|
+
/* L->top+2 = v filled in by caller. */
|
|
191
|
+
return NULL; /* Trigger metamethod call. */
|
|
192
|
+
}
|
|
193
|
+
copyTV(L, &tmp, mo);
|
|
194
|
+
o = &tmp;
|
|
195
|
+
}
|
|
196
|
+
lj_err_msg(L, LJ_ERR_SETLOOP);
|
|
197
|
+
return NULL; /* unreachable */
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
static cTValue *str2num(cTValue *o, TValue *n)
|
|
201
|
+
{
|
|
202
|
+
if (tvisnum(o))
|
|
203
|
+
return o;
|
|
204
|
+
else if (tvisint(o))
|
|
205
|
+
return (setnumV(n, (lua_Number)intV(o)), n);
|
|
206
|
+
else if (tvisstr(o) && lj_strscan_num(strV(o), n))
|
|
207
|
+
return n;
|
|
208
|
+
else
|
|
209
|
+
return NULL;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* Helper for arithmetic instructions. Coercion, metamethod. */
|
|
213
|
+
TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb, cTValue *rc,
|
|
214
|
+
BCReg op)
|
|
215
|
+
{
|
|
216
|
+
MMS mm = bcmode_mm(op);
|
|
217
|
+
TValue tempb, tempc;
|
|
218
|
+
cTValue *b, *c;
|
|
219
|
+
if ((b = str2num(rb, &tempb)) != NULL &&
|
|
220
|
+
(c = str2num(rc, &tempc)) != NULL) { /* Try coercion first. */
|
|
221
|
+
setnumV(ra, lj_vm_foldarith(numV(b), numV(c), (int)mm-MM_add));
|
|
222
|
+
return NULL;
|
|
223
|
+
} else {
|
|
224
|
+
cTValue *mo = lj_meta_lookup(L, rb, mm);
|
|
225
|
+
if (tvisnil(mo)) {
|
|
226
|
+
mo = lj_meta_lookup(L, rc, mm);
|
|
227
|
+
if (tvisnil(mo)) {
|
|
228
|
+
if (str2num(rb, &tempb) == NULL) rc = rb;
|
|
229
|
+
lj_err_optype(L, rc, LJ_ERR_OPARITH);
|
|
230
|
+
return NULL; /* unreachable */
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return mmcall(L, lj_cont_ra, mo, rb, rc);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* Helper for CAT. Coercion, iterative concat, __concat metamethod. */
|
|
238
|
+
TValue *lj_meta_cat(lua_State *L, TValue *top, int left)
|
|
239
|
+
{
|
|
240
|
+
int fromc = 0;
|
|
241
|
+
if (left < 0) { left = -left; fromc = 1; }
|
|
242
|
+
do {
|
|
243
|
+
if (!(tvisstr(top) || tvisnumber(top)) ||
|
|
244
|
+
!(tvisstr(top-1) || tvisnumber(top-1))) {
|
|
245
|
+
cTValue *mo = lj_meta_lookup(L, top-1, MM_concat);
|
|
246
|
+
if (tvisnil(mo)) {
|
|
247
|
+
mo = lj_meta_lookup(L, top, MM_concat);
|
|
248
|
+
if (tvisnil(mo)) {
|
|
249
|
+
if (tvisstr(top-1) || tvisnumber(top-1)) top++;
|
|
250
|
+
lj_err_optype(L, top-1, LJ_ERR_OPCAT);
|
|
251
|
+
return NULL; /* unreachable */
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/* One of the top two elements is not a string, call __cat metamethod:
|
|
255
|
+
**
|
|
256
|
+
** before: [...][CAT stack .........................]
|
|
257
|
+
** top-1 top top+1 top+2
|
|
258
|
+
** pick two: [...][CAT stack ...] [o1] [o2]
|
|
259
|
+
** setup mm: [...][CAT stack ...] [cont|?] [mo|tmtype] [o1] [o2]
|
|
260
|
+
** in asm: [...][CAT stack ...] [cont|PC] [mo|delta] [o1] [o2]
|
|
261
|
+
** ^-- func base ^-- mm base
|
|
262
|
+
** after mm: [...][CAT stack ...] <--push-- [result]
|
|
263
|
+
** next step: [...][CAT stack .............]
|
|
264
|
+
*/
|
|
265
|
+
copyTV(L, top+2*LJ_FR2+2, top); /* Carefully ordered stack copies! */
|
|
266
|
+
copyTV(L, top+2*LJ_FR2+1, top-1);
|
|
267
|
+
copyTV(L, top+LJ_FR2, mo);
|
|
268
|
+
setcont(top-1, lj_cont_cat);
|
|
269
|
+
if (LJ_FR2) { setnilV(top); setnilV(top+2); top += 2; }
|
|
270
|
+
return top+1; /* Trigger metamethod call. */
|
|
271
|
+
} else {
|
|
272
|
+
/* Pick as many strings as possible from the top and concatenate them:
|
|
273
|
+
**
|
|
274
|
+
** before: [...][CAT stack ...........................]
|
|
275
|
+
** pick str: [...][CAT stack ...] [...... strings ......]
|
|
276
|
+
** concat: [...][CAT stack ...] [result]
|
|
277
|
+
** next step: [...][CAT stack ............]
|
|
278
|
+
*/
|
|
279
|
+
TValue *e, *o = top;
|
|
280
|
+
uint64_t tlen = tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
|
|
281
|
+
char *p, *buf;
|
|
282
|
+
do {
|
|
283
|
+
o--; tlen += tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
|
|
284
|
+
} while (--left > 0 && (tvisstr(o-1) || tvisnumber(o-1)));
|
|
285
|
+
if (tlen >= LJ_MAX_STR) lj_err_msg(L, LJ_ERR_STROV);
|
|
286
|
+
p = buf = lj_buf_tmp(L, (MSize)tlen);
|
|
287
|
+
for (e = top, top = o; o <= e; o++) {
|
|
288
|
+
if (tvisstr(o)) {
|
|
289
|
+
GCstr *s = strV(o);
|
|
290
|
+
MSize len = s->len;
|
|
291
|
+
p = lj_buf_wmem(p, strdata(s), len);
|
|
292
|
+
} else if (tvisint(o)) {
|
|
293
|
+
p = lj_strfmt_wint(p, intV(o));
|
|
294
|
+
} else {
|
|
295
|
+
lua_assert(tvisnum(o));
|
|
296
|
+
p = lj_strfmt_wnum(p, o);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
setstrV(L, top, lj_str_new(L, buf, (size_t)(p-buf)));
|
|
300
|
+
}
|
|
301
|
+
} while (left >= 1);
|
|
302
|
+
if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) {
|
|
303
|
+
if (!fromc) L->top = curr_topL(L);
|
|
304
|
+
lj_gc_step(L);
|
|
305
|
+
}
|
|
306
|
+
return NULL;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/* Helper for LEN. __len metamethod. */
|
|
310
|
+
TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o)
|
|
311
|
+
{
|
|
312
|
+
cTValue *mo = lj_meta_lookup(L, o, MM_len);
|
|
313
|
+
if (tvisnil(mo)) {
|
|
314
|
+
if (LJ_52 && tvistab(o))
|
|
315
|
+
tabref(tabV(o)->metatable)->nomm |= (uint8_t)(1u<<MM_len);
|
|
316
|
+
else
|
|
317
|
+
lj_err_optype(L, o, LJ_ERR_OPLEN);
|
|
318
|
+
return NULL;
|
|
319
|
+
}
|
|
320
|
+
return mmcall(L, lj_cont_ra, mo, o, LJ_52 ? o : niltv(L));
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/* Helper for equality comparisons. __eq metamethod. */
|
|
324
|
+
TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne)
|
|
325
|
+
{
|
|
326
|
+
/* Field metatable must be at same offset for GCtab and GCudata! */
|
|
327
|
+
cTValue *mo = lj_meta_fast(L, tabref(o1->gch.metatable), MM_eq);
|
|
328
|
+
if (mo) {
|
|
329
|
+
TValue *top;
|
|
330
|
+
uint32_t it;
|
|
331
|
+
if (tabref(o1->gch.metatable) != tabref(o2->gch.metatable)) {
|
|
332
|
+
cTValue *mo2 = lj_meta_fast(L, tabref(o2->gch.metatable), MM_eq);
|
|
333
|
+
if (mo2 == NULL || !lj_obj_equal(mo, mo2))
|
|
334
|
+
return (TValue *)(intptr_t)ne;
|
|
335
|
+
}
|
|
336
|
+
top = curr_top(L);
|
|
337
|
+
setcont(top++, ne ? lj_cont_condf : lj_cont_condt);
|
|
338
|
+
if (LJ_FR2) setnilV(top++);
|
|
339
|
+
copyTV(L, top++, mo);
|
|
340
|
+
if (LJ_FR2) setnilV(top++);
|
|
341
|
+
it = ~(uint32_t)o1->gch.gct;
|
|
342
|
+
setgcV(L, top, o1, it);
|
|
343
|
+
setgcV(L, top+1, o2, it);
|
|
344
|
+
return top; /* Trigger metamethod call. */
|
|
345
|
+
}
|
|
346
|
+
return (TValue *)(intptr_t)ne;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
#if LJ_HASFFI
|
|
350
|
+
TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins)
|
|
351
|
+
{
|
|
352
|
+
ASMFunction cont = (bc_op(ins) & 1) ? lj_cont_condf : lj_cont_condt;
|
|
353
|
+
int op = (int)bc_op(ins) & ~1;
|
|
354
|
+
TValue tv;
|
|
355
|
+
cTValue *mo, *o2, *o1 = &L->base[bc_a(ins)];
|
|
356
|
+
cTValue *o1mm = o1;
|
|
357
|
+
if (op == BC_ISEQV) {
|
|
358
|
+
o2 = &L->base[bc_d(ins)];
|
|
359
|
+
if (!tviscdata(o1mm)) o1mm = o2;
|
|
360
|
+
} else if (op == BC_ISEQS) {
|
|
361
|
+
setstrV(L, &tv, gco2str(proto_kgc(curr_proto(L), ~(ptrdiff_t)bc_d(ins))));
|
|
362
|
+
o2 = &tv;
|
|
363
|
+
} else if (op == BC_ISEQN) {
|
|
364
|
+
o2 = &mref(curr_proto(L)->k, cTValue)[bc_d(ins)];
|
|
365
|
+
} else {
|
|
366
|
+
lua_assert(op == BC_ISEQP);
|
|
367
|
+
setpriV(&tv, ~bc_d(ins));
|
|
368
|
+
o2 = &tv;
|
|
369
|
+
}
|
|
370
|
+
mo = lj_meta_lookup(L, o1mm, MM_eq);
|
|
371
|
+
if (LJ_LIKELY(!tvisnil(mo)))
|
|
372
|
+
return mmcall(L, cont, mo, o1, o2);
|
|
373
|
+
else
|
|
374
|
+
return (TValue *)(intptr_t)(bc_op(ins) & 1);
|
|
375
|
+
}
|
|
376
|
+
#endif
|
|
377
|
+
|
|
378
|
+
/* Helper for ordered comparisons. String compare, __lt/__le metamethods. */
|
|
379
|
+
TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op)
|
|
380
|
+
{
|
|
381
|
+
if (LJ_HASFFI && (tviscdata(o1) || tviscdata(o2))) {
|
|
382
|
+
ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;
|
|
383
|
+
MMS mm = (op & 2) ? MM_le : MM_lt;
|
|
384
|
+
cTValue *mo = lj_meta_lookup(L, tviscdata(o1) ? o1 : o2, mm);
|
|
385
|
+
if (LJ_UNLIKELY(tvisnil(mo))) goto err;
|
|
386
|
+
return mmcall(L, cont, mo, o1, o2);
|
|
387
|
+
} else if (LJ_52 || itype(o1) == itype(o2)) {
|
|
388
|
+
/* Never called with two numbers. */
|
|
389
|
+
if (tvisstr(o1) && tvisstr(o2)) {
|
|
390
|
+
int32_t res = lj_str_cmp(strV(o1), strV(o2));
|
|
391
|
+
return (TValue *)(intptr_t)(((op&2) ? res <= 0 : res < 0) ^ (op&1));
|
|
392
|
+
} else {
|
|
393
|
+
trymt:
|
|
394
|
+
while (1) {
|
|
395
|
+
ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;
|
|
396
|
+
MMS mm = (op & 2) ? MM_le : MM_lt;
|
|
397
|
+
cTValue *mo = lj_meta_lookup(L, o1, mm);
|
|
398
|
+
#if LJ_52
|
|
399
|
+
if (tvisnil(mo) && tvisnil((mo = lj_meta_lookup(L, o2, mm))))
|
|
400
|
+
#else
|
|
401
|
+
cTValue *mo2 = lj_meta_lookup(L, o2, mm);
|
|
402
|
+
if (tvisnil(mo) || !lj_obj_equal(mo, mo2))
|
|
403
|
+
#endif
|
|
404
|
+
{
|
|
405
|
+
if (op & 2) { /* MM_le not found: retry with MM_lt. */
|
|
406
|
+
cTValue *ot = o1; o1 = o2; o2 = ot; /* Swap operands. */
|
|
407
|
+
op ^= 3; /* Use LT and flip condition. */
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
goto err;
|
|
411
|
+
}
|
|
412
|
+
return mmcall(L, cont, mo, o1, o2);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
} else if (tvisbool(o1) && tvisbool(o2)) {
|
|
416
|
+
goto trymt;
|
|
417
|
+
} else {
|
|
418
|
+
err:
|
|
419
|
+
lj_err_comp(L, o1, o2);
|
|
420
|
+
return NULL;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/* Helper for ISTYPE and ISNUM. Implicit coercion or error. */
|
|
425
|
+
void lj_meta_istype(lua_State *L, BCReg ra, BCReg tp)
|
|
426
|
+
{
|
|
427
|
+
L->top = curr_topL(L);
|
|
428
|
+
ra++; tp--;
|
|
429
|
+
lua_assert(LJ_DUALNUM || tp != ~LJ_TNUMX); /* ISTYPE -> ISNUM broken. */
|
|
430
|
+
if (LJ_DUALNUM && tp == ~LJ_TNUMX) lj_lib_checkint(L, ra);
|
|
431
|
+
else if (tp == ~LJ_TNUMX+1) lj_lib_checknum(L, ra);
|
|
432
|
+
else if (tp == ~LJ_TSTR) lj_lib_checkstr(L, ra);
|
|
433
|
+
else lj_err_argtype(L, ra, lj_obj_itypename[tp]);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/* Helper for calls. __call metamethod. */
|
|
437
|
+
void lj_meta_call(lua_State *L, TValue *func, TValue *top)
|
|
438
|
+
{
|
|
439
|
+
cTValue *mo = lj_meta_lookup(L, func, MM_call);
|
|
440
|
+
TValue *p;
|
|
441
|
+
if (!tvisfunc(mo))
|
|
442
|
+
lj_err_optype_call(L, func);
|
|
443
|
+
for (p = top; p > func+2*LJ_FR2; p--) copyTV(L, p, p-1);
|
|
444
|
+
if (LJ_FR2) copyTV(L, func+2, func);
|
|
445
|
+
copyTV(L, func, mo);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/* Helper for FORI. Coercion. */
|
|
449
|
+
void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o)
|
|
450
|
+
{
|
|
451
|
+
if (!lj_strscan_numberobj(o)) lj_err_msg(L, LJ_ERR_FORINIT);
|
|
452
|
+
if (!lj_strscan_numberobj(o+1)) lj_err_msg(L, LJ_ERR_FORLIM);
|
|
453
|
+
if (!lj_strscan_numberobj(o+2)) lj_err_msg(L, LJ_ERR_FORSTEP);
|
|
454
|
+
if (LJ_DUALNUM) {
|
|
455
|
+
/* Ensure all slots are integers or all slots are numbers. */
|
|
456
|
+
int32_t k[3];
|
|
457
|
+
int nint = 0;
|
|
458
|
+
ptrdiff_t i;
|
|
459
|
+
for (i = 0; i <= 2; i++) {
|
|
460
|
+
if (tvisint(o+i)) {
|
|
461
|
+
k[i] = intV(o+i); nint++;
|
|
462
|
+
} else {
|
|
463
|
+
k[i] = lj_num2int(numV(o+i)); nint += ((lua_Number)k[i] == numV(o+i));
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (nint == 3) { /* Narrow to integers. */
|
|
467
|
+
setintV(o, k[0]);
|
|
468
|
+
setintV(o+1, k[1]);
|
|
469
|
+
setintV(o+2, k[2]);
|
|
470
|
+
} else if (nint != 0) { /* Widen to numbers. */
|
|
471
|
+
if (tvisint(o)) setnumV(o, (lua_Number)intV(o));
|
|
472
|
+
if (tvisint(o+1)) setnumV(o+1, (lua_Number)intV(o+1));
|
|
473
|
+
if (tvisint(o+2)) setnumV(o+2, (lua_Number)intV(o+2));
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|