immunio 0.15.4 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +0 -27
- data/ext/immunio/Rakefile +9 -0
- data/lib/immunio/plugins/active_record.rb +1 -1
- data/lib/immunio/plugins/active_record_relation.rb +1 -1
- data/lib/immunio/plugins/environment_reporter.rb +20 -0
- data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
- data/lib/immunio/version.rb +1 -1
- data/lib/immunio/vm.rb +1 -2
- data/lua-hooks/Makefile +97 -0
- data/lua-hooks/ext/all.c +41 -52
- data/lua-hooks/ext/all.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
- data/lua-hooks/ext/libinjection/lualib.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.o +0 -0
- data/lua-hooks/ext/lpeg/lpcode.c +2 -2
- data/lua-hooks/ext/lpeg/lpcode.h +1 -1
- data/lua-hooks/ext/lpeg/lpcode.o +0 -0
- data/lua-hooks/ext/lpeg/lpprint.o +0 -0
- data/lua-hooks/ext/lpeg/lptree.c +2 -2
- data/lua-hooks/ext/lpeg/lptypes.h +1 -1
- data/lua-hooks/ext/lpeg/lpvm.c +2 -2
- data/lua-hooks/ext/lpeg/lpvm.o +0 -0
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
- data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
- data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
- data/lua-hooks/ext/luajit/Makefile +159 -0
- data/lua-hooks/ext/luajit/README +16 -0
- data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
- data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
- data/lua-hooks/ext/luajit/doc/changes.html +804 -0
- data/lua-hooks/ext/luajit/doc/contact.html +104 -0
- data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
- data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
- data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
- data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
- data/lua-hooks/ext/luajit/doc/faq.html +186 -0
- data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
- data/lua-hooks/ext/luajit/doc/install.html +659 -0
- data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
- data/lua-hooks/ext/luajit/doc/running.html +309 -0
- data/lua-hooks/ext/luajit/doc/status.html +118 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
- data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
- data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
- data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
- data/lua-hooks/ext/luajit/src/Makefile +697 -0
- data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
- data/lua-hooks/ext/luajit/src/host/README +4 -0
- data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
- data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
- data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
- data/lua-hooks/ext/luajit/src/host/minilua +0 -0
- data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
- data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
- data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
- data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
- data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
- data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
- data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
- data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
- data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
- data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
- data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
- data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
- data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
- data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
- data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
- data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
- data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
- data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
- data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
- data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
- data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
- data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
- data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
- data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
- data/lua-hooks/ext/luajit/src/lj.supp +26 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
- data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
- data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
- data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
- data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
- data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
- data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
- data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
- data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
- data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
- data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
- data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
- data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
- data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
- data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
- data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
- data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
- data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
- data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
- data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
- data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
- data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
- data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
- data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
- data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
- data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
- data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
- data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
- data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
- data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
- data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
- data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
- data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
- data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
- data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
- data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
- data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
- data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
- data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
- data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
- data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
- data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
- data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
- data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
- data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
- data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
- data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
- data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
- data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
- data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
- data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
- data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
- data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
- data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
- data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
- data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
- data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
- data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
- data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
- data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
- data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
- data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
- data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
- data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
- data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
- data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
- data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
- data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
- data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
- data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
- data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
- data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
- data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
- data/lua-hooks/ext/luajit/src/luajit +0 -0
- data/lua-hooks/ext/luajit/src/luajit.c +570 -0
- data/lua-hooks/ext/luajit/src/luajit.h +79 -0
- data/lua-hooks/ext/luajit/src/luajit.o +0 -0
- data/lua-hooks/ext/luajit/src/lualib.h +43 -0
- data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
- data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
- data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
- data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
- data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
- data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
- data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
- data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
- data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
- data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
- data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
- data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
- data/lua-hooks/lib/boot.lua +37 -2
- metadata +372 -69
- data/lua-hooks/ext/bitop/README +0 -22
- data/lua-hooks/ext/bitop/bit.c +0 -189
- data/lua-hooks/ext/extconf.rb +0 -38
- data/lua-hooks/ext/lua/COPYRIGHT +0 -34
- data/lua-hooks/ext/lua/lapi.c +0 -1087
- data/lua-hooks/ext/lua/lapi.h +0 -16
- data/lua-hooks/ext/lua/lauxlib.c +0 -652
- data/lua-hooks/ext/lua/lbaselib.c +0 -659
- data/lua-hooks/ext/lua/lcode.c +0 -831
- data/lua-hooks/ext/lua/lcode.h +0 -76
- data/lua-hooks/ext/lua/ldblib.c +0 -398
- data/lua-hooks/ext/lua/ldebug.c +0 -638
- data/lua-hooks/ext/lua/ldebug.h +0 -33
- data/lua-hooks/ext/lua/ldo.c +0 -519
- data/lua-hooks/ext/lua/ldo.h +0 -57
- data/lua-hooks/ext/lua/ldump.c +0 -164
- data/lua-hooks/ext/lua/lfunc.c +0 -174
- data/lua-hooks/ext/lua/lfunc.h +0 -34
- data/lua-hooks/ext/lua/lgc.c +0 -710
- data/lua-hooks/ext/lua/lgc.h +0 -110
- data/lua-hooks/ext/lua/linit.c +0 -38
- data/lua-hooks/ext/lua/liolib.c +0 -556
- data/lua-hooks/ext/lua/llex.c +0 -463
- data/lua-hooks/ext/lua/llex.h +0 -81
- data/lua-hooks/ext/lua/llimits.h +0 -128
- data/lua-hooks/ext/lua/lmathlib.c +0 -263
- data/lua-hooks/ext/lua/lmem.c +0 -86
- data/lua-hooks/ext/lua/lmem.h +0 -49
- data/lua-hooks/ext/lua/loadlib.c +0 -705
- data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
- data/lua-hooks/ext/lua/lobject.c +0 -214
- data/lua-hooks/ext/lua/lobject.h +0 -381
- data/lua-hooks/ext/lua/lopcodes.c +0 -102
- data/lua-hooks/ext/lua/lopcodes.h +0 -268
- data/lua-hooks/ext/lua/loslib.c +0 -243
- data/lua-hooks/ext/lua/lparser.c +0 -1339
- data/lua-hooks/ext/lua/lparser.h +0 -82
- data/lua-hooks/ext/lua/lstate.c +0 -214
- data/lua-hooks/ext/lua/lstate.h +0 -169
- data/lua-hooks/ext/lua/lstring.c +0 -111
- data/lua-hooks/ext/lua/lstring.h +0 -31
- data/lua-hooks/ext/lua/lstrlib.c +0 -871
- data/lua-hooks/ext/lua/ltable.c +0 -588
- data/lua-hooks/ext/lua/ltable.h +0 -40
- data/lua-hooks/ext/lua/ltablib.c +0 -287
- data/lua-hooks/ext/lua/ltm.c +0 -75
- data/lua-hooks/ext/lua/ltm.h +0 -54
- data/lua-hooks/ext/lua/lua.c +0 -392
- data/lua-hooks/ext/lua/lua.def +0 -131
- data/lua-hooks/ext/lua/lua.rc +0 -28
- data/lua-hooks/ext/lua/lua_dll.rc +0 -26
- data/lua-hooks/ext/lua/luac.c +0 -200
- data/lua-hooks/ext/lua/luac.rc +0 -1
- data/lua-hooks/ext/lua/luaconf.h +0 -763
- data/lua-hooks/ext/lua/luaconf.h.in +0 -724
- data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
- data/lua-hooks/ext/lua/lualib.h +0 -53
- data/lua-hooks/ext/lua/lundump.c +0 -227
- data/lua-hooks/ext/lua/lundump.h +0 -36
- data/lua-hooks/ext/lua/lvm.c +0 -767
- data/lua-hooks/ext/lua/lvm.h +0 -36
- data/lua-hooks/ext/lua/lzio.c +0 -82
- data/lua-hooks/ext/lua/lzio.h +0 -67
- data/lua-hooks/ext/lua/print.c +0 -227
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
|
+
|