immunio 0.15.4 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +0 -27
- data/ext/immunio/Rakefile +9 -0
- data/lib/immunio/plugins/active_record.rb +1 -1
- data/lib/immunio/plugins/active_record_relation.rb +1 -1
- data/lib/immunio/plugins/environment_reporter.rb +20 -0
- data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
- data/lib/immunio/version.rb +1 -1
- data/lib/immunio/vm.rb +1 -2
- data/lua-hooks/Makefile +97 -0
- data/lua-hooks/ext/all.c +41 -52
- data/lua-hooks/ext/all.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
- data/lua-hooks/ext/libinjection/lualib.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.o +0 -0
- data/lua-hooks/ext/lpeg/lpcode.c +2 -2
- data/lua-hooks/ext/lpeg/lpcode.h +1 -1
- data/lua-hooks/ext/lpeg/lpcode.o +0 -0
- data/lua-hooks/ext/lpeg/lpprint.o +0 -0
- data/lua-hooks/ext/lpeg/lptree.c +2 -2
- data/lua-hooks/ext/lpeg/lptypes.h +1 -1
- data/lua-hooks/ext/lpeg/lpvm.c +2 -2
- data/lua-hooks/ext/lpeg/lpvm.o +0 -0
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
- data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
- data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
- data/lua-hooks/ext/luajit/Makefile +159 -0
- data/lua-hooks/ext/luajit/README +16 -0
- data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
- data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
- data/lua-hooks/ext/luajit/doc/changes.html +804 -0
- data/lua-hooks/ext/luajit/doc/contact.html +104 -0
- data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
- data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
- data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
- data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
- data/lua-hooks/ext/luajit/doc/faq.html +186 -0
- data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
- data/lua-hooks/ext/luajit/doc/install.html +659 -0
- data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
- data/lua-hooks/ext/luajit/doc/running.html +309 -0
- data/lua-hooks/ext/luajit/doc/status.html +118 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
- data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
- data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
- data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
- data/lua-hooks/ext/luajit/src/Makefile +697 -0
- data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
- data/lua-hooks/ext/luajit/src/host/README +4 -0
- data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
- data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
- data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
- data/lua-hooks/ext/luajit/src/host/minilua +0 -0
- data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
- data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
- data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
- data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
- data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
- data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
- data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
- data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
- data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
- data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
- data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
- data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
- data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
- data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
- data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
- data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
- data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
- data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
- data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
- data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
- data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
- data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
- data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
- data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
- data/lua-hooks/ext/luajit/src/lj.supp +26 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
- data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
- data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
- data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
- data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
- data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
- data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
- data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
- data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
- data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
- data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
- data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
- data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
- data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
- data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
- data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
- data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
- data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
- data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
- data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
- data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
- data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
- data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
- data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
- data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
- data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
- data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
- data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
- data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
- data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
- data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
- data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
- data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
- data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
- data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
- data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
- data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
- data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
- data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
- data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
- data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
- data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
- data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
- data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
- data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
- data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
- data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
- data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
- data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
- data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
- data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
- data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
- data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
- data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
- data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
- data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
- data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
- data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
- data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
- data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
- data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
- data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
- data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
- data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
- data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
- data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
- data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
- data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
- data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
- data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
- data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
- data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
- data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
- data/lua-hooks/ext/luajit/src/luajit +0 -0
- data/lua-hooks/ext/luajit/src/luajit.c +570 -0
- data/lua-hooks/ext/luajit/src/luajit.h +79 -0
- data/lua-hooks/ext/luajit/src/luajit.o +0 -0
- data/lua-hooks/ext/luajit/src/lualib.h +43 -0
- data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
- data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
- data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
- data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
- data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
- data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
- data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
- data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
- data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
- data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
- data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
- data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
- data/lua-hooks/lib/boot.lua +37 -2
- metadata +372 -69
- data/lua-hooks/ext/bitop/README +0 -22
- data/lua-hooks/ext/bitop/bit.c +0 -189
- data/lua-hooks/ext/extconf.rb +0 -38
- data/lua-hooks/ext/lua/COPYRIGHT +0 -34
- data/lua-hooks/ext/lua/lapi.c +0 -1087
- data/lua-hooks/ext/lua/lapi.h +0 -16
- data/lua-hooks/ext/lua/lauxlib.c +0 -652
- data/lua-hooks/ext/lua/lbaselib.c +0 -659
- data/lua-hooks/ext/lua/lcode.c +0 -831
- data/lua-hooks/ext/lua/lcode.h +0 -76
- data/lua-hooks/ext/lua/ldblib.c +0 -398
- data/lua-hooks/ext/lua/ldebug.c +0 -638
- data/lua-hooks/ext/lua/ldebug.h +0 -33
- data/lua-hooks/ext/lua/ldo.c +0 -519
- data/lua-hooks/ext/lua/ldo.h +0 -57
- data/lua-hooks/ext/lua/ldump.c +0 -164
- data/lua-hooks/ext/lua/lfunc.c +0 -174
- data/lua-hooks/ext/lua/lfunc.h +0 -34
- data/lua-hooks/ext/lua/lgc.c +0 -710
- data/lua-hooks/ext/lua/lgc.h +0 -110
- data/lua-hooks/ext/lua/linit.c +0 -38
- data/lua-hooks/ext/lua/liolib.c +0 -556
- data/lua-hooks/ext/lua/llex.c +0 -463
- data/lua-hooks/ext/lua/llex.h +0 -81
- data/lua-hooks/ext/lua/llimits.h +0 -128
- data/lua-hooks/ext/lua/lmathlib.c +0 -263
- data/lua-hooks/ext/lua/lmem.c +0 -86
- data/lua-hooks/ext/lua/lmem.h +0 -49
- data/lua-hooks/ext/lua/loadlib.c +0 -705
- data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
- data/lua-hooks/ext/lua/lobject.c +0 -214
- data/lua-hooks/ext/lua/lobject.h +0 -381
- data/lua-hooks/ext/lua/lopcodes.c +0 -102
- data/lua-hooks/ext/lua/lopcodes.h +0 -268
- data/lua-hooks/ext/lua/loslib.c +0 -243
- data/lua-hooks/ext/lua/lparser.c +0 -1339
- data/lua-hooks/ext/lua/lparser.h +0 -82
- data/lua-hooks/ext/lua/lstate.c +0 -214
- data/lua-hooks/ext/lua/lstate.h +0 -169
- data/lua-hooks/ext/lua/lstring.c +0 -111
- data/lua-hooks/ext/lua/lstring.h +0 -31
- data/lua-hooks/ext/lua/lstrlib.c +0 -871
- data/lua-hooks/ext/lua/ltable.c +0 -588
- data/lua-hooks/ext/lua/ltable.h +0 -40
- data/lua-hooks/ext/lua/ltablib.c +0 -287
- data/lua-hooks/ext/lua/ltm.c +0 -75
- data/lua-hooks/ext/lua/ltm.h +0 -54
- data/lua-hooks/ext/lua/lua.c +0 -392
- data/lua-hooks/ext/lua/lua.def +0 -131
- data/lua-hooks/ext/lua/lua.rc +0 -28
- data/lua-hooks/ext/lua/lua_dll.rc +0 -26
- data/lua-hooks/ext/lua/luac.c +0 -200
- data/lua-hooks/ext/lua/luac.rc +0 -1
- data/lua-hooks/ext/lua/luaconf.h +0 -763
- data/lua-hooks/ext/lua/luaconf.h.in +0 -724
- data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
- data/lua-hooks/ext/lua/lualib.h +0 -53
- data/lua-hooks/ext/lua/lundump.c +0 -227
- data/lua-hooks/ext/lua/lundump.h +0 -36
- data/lua-hooks/ext/lua/lvm.c +0 -767
- data/lua-hooks/ext/lua/lvm.h +0 -36
- data/lua-hooks/ext/lua/lzio.c +0 -82
- data/lua-hooks/ext/lua/lzio.h +0 -67
- data/lua-hooks/ext/lua/print.c +0 -227
@@ -0,0 +1,440 @@
|
|
1
|
+
/*
|
2
|
+
** Common definitions for the JIT compiler.
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
4
|
+
*/
|
5
|
+
|
6
|
+
#ifndef _LJ_JIT_H
|
7
|
+
#define _LJ_JIT_H
|
8
|
+
|
9
|
+
#include "lj_obj.h"
|
10
|
+
#include "lj_ir.h"
|
11
|
+
|
12
|
+
/* JIT engine flags. */
|
13
|
+
#define JIT_F_ON 0x00000001
|
14
|
+
|
15
|
+
/* CPU-specific JIT engine flags. */
|
16
|
+
#if LJ_TARGET_X86ORX64
|
17
|
+
#define JIT_F_SSE2 0x00000010
|
18
|
+
#define JIT_F_SSE3 0x00000020
|
19
|
+
#define JIT_F_SSE4_1 0x00000040
|
20
|
+
#define JIT_F_PREFER_IMUL 0x00000080
|
21
|
+
#define JIT_F_LEA_AGU 0x00000100
|
22
|
+
|
23
|
+
/* Names for the CPU-specific flags. Must match the order above. */
|
24
|
+
#define JIT_F_CPU_FIRST JIT_F_SSE2
|
25
|
+
#define JIT_F_CPUSTRING "\4SSE2\4SSE3\6SSE4.1\3AMD\4ATOM"
|
26
|
+
#elif LJ_TARGET_ARM
|
27
|
+
#define JIT_F_ARMV6_ 0x00000010
|
28
|
+
#define JIT_F_ARMV6T2_ 0x00000020
|
29
|
+
#define JIT_F_ARMV7 0x00000040
|
30
|
+
#define JIT_F_VFPV2 0x00000080
|
31
|
+
#define JIT_F_VFPV3 0x00000100
|
32
|
+
|
33
|
+
#define JIT_F_ARMV6 (JIT_F_ARMV6_|JIT_F_ARMV6T2_|JIT_F_ARMV7)
|
34
|
+
#define JIT_F_ARMV6T2 (JIT_F_ARMV6T2_|JIT_F_ARMV7)
|
35
|
+
#define JIT_F_VFP (JIT_F_VFPV2|JIT_F_VFPV3)
|
36
|
+
|
37
|
+
/* Names for the CPU-specific flags. Must match the order above. */
|
38
|
+
#define JIT_F_CPU_FIRST JIT_F_ARMV6_
|
39
|
+
#define JIT_F_CPUSTRING "\5ARMv6\7ARMv6T2\5ARMv7\5VFPv2\5VFPv3"
|
40
|
+
#elif LJ_TARGET_PPC
|
41
|
+
#define JIT_F_SQRT 0x00000010
|
42
|
+
#define JIT_F_ROUND 0x00000020
|
43
|
+
|
44
|
+
/* Names for the CPU-specific flags. Must match the order above. */
|
45
|
+
#define JIT_F_CPU_FIRST JIT_F_SQRT
|
46
|
+
#define JIT_F_CPUSTRING "\4SQRT\5ROUND"
|
47
|
+
#elif LJ_TARGET_MIPS
|
48
|
+
#define JIT_F_MIPS32R2 0x00000010
|
49
|
+
|
50
|
+
/* Names for the CPU-specific flags. Must match the order above. */
|
51
|
+
#define JIT_F_CPU_FIRST JIT_F_MIPS32R2
|
52
|
+
#define JIT_F_CPUSTRING "\010MIPS32R2"
|
53
|
+
#else
|
54
|
+
#define JIT_F_CPU_FIRST 0
|
55
|
+
#define JIT_F_CPUSTRING ""
|
56
|
+
#endif
|
57
|
+
|
58
|
+
/* Optimization flags. */
|
59
|
+
#define JIT_F_OPT_MASK 0x0fff0000
|
60
|
+
|
61
|
+
#define JIT_F_OPT_FOLD 0x00010000
|
62
|
+
#define JIT_F_OPT_CSE 0x00020000
|
63
|
+
#define JIT_F_OPT_DCE 0x00040000
|
64
|
+
#define JIT_F_OPT_FWD 0x00080000
|
65
|
+
#define JIT_F_OPT_DSE 0x00100000
|
66
|
+
#define JIT_F_OPT_NARROW 0x00200000
|
67
|
+
#define JIT_F_OPT_LOOP 0x00400000
|
68
|
+
#define JIT_F_OPT_ABC 0x00800000
|
69
|
+
#define JIT_F_OPT_SINK 0x01000000
|
70
|
+
#define JIT_F_OPT_FUSE 0x02000000
|
71
|
+
|
72
|
+
/* Optimizations names for -O. Must match the order above. */
|
73
|
+
#define JIT_F_OPT_FIRST JIT_F_OPT_FOLD
|
74
|
+
#define JIT_F_OPTSTRING \
|
75
|
+
"\4fold\3cse\3dce\3fwd\3dse\6narrow\4loop\3abc\4sink\4fuse"
|
76
|
+
|
77
|
+
/* Optimization levels set a fixed combination of flags. */
|
78
|
+
#define JIT_F_OPT_0 0
|
79
|
+
#define JIT_F_OPT_1 (JIT_F_OPT_FOLD|JIT_F_OPT_CSE|JIT_F_OPT_DCE)
|
80
|
+
#define JIT_F_OPT_2 (JIT_F_OPT_1|JIT_F_OPT_NARROW|JIT_F_OPT_LOOP)
|
81
|
+
#define JIT_F_OPT_3 (JIT_F_OPT_2|\
|
82
|
+
JIT_F_OPT_FWD|JIT_F_OPT_DSE|JIT_F_OPT_ABC|JIT_F_OPT_SINK|JIT_F_OPT_FUSE)
|
83
|
+
#define JIT_F_OPT_DEFAULT JIT_F_OPT_3
|
84
|
+
|
85
|
+
#if LJ_TARGET_WINDOWS || LJ_64
|
86
|
+
/* See: http://blogs.msdn.com/oldnewthing/archive/2003/10/08/55239.aspx */
|
87
|
+
#define JIT_P_sizemcode_DEFAULT 64
|
88
|
+
#else
|
89
|
+
/* Could go as low as 4K, but the mmap() overhead would be rather high. */
|
90
|
+
#define JIT_P_sizemcode_DEFAULT 32
|
91
|
+
#endif
|
92
|
+
|
93
|
+
/* Optimization parameters and their defaults. Length is a char in octal! */
|
94
|
+
#define JIT_PARAMDEF(_) \
|
95
|
+
_(\010, maxtrace, 1000) /* Max. # of traces in cache. */ \
|
96
|
+
_(\011, maxrecord, 4000) /* Max. # of recorded IR instructions. */ \
|
97
|
+
_(\012, maxirconst, 500) /* Max. # of IR constants of a trace. */ \
|
98
|
+
_(\007, maxside, 100) /* Max. # of side traces of a root trace. */ \
|
99
|
+
_(\007, maxsnap, 500) /* Max. # of snapshots for a trace. */ \
|
100
|
+
_(\011, minstitch, 0) /* Min. # of IR ins for a stitched trace. */ \
|
101
|
+
\
|
102
|
+
_(\007, hotloop, 56) /* # of iter. to detect a hot loop/call. */ \
|
103
|
+
_(\007, hotexit, 10) /* # of taken exits to start a side trace. */ \
|
104
|
+
_(\007, tryside, 4) /* # of attempts to compile a side trace. */ \
|
105
|
+
\
|
106
|
+
_(\012, instunroll, 4) /* Max. unroll for instable loops. */ \
|
107
|
+
_(\012, loopunroll, 15) /* Max. unroll for loop ops in side traces. */ \
|
108
|
+
_(\012, callunroll, 3) /* Max. unroll for recursive calls. */ \
|
109
|
+
_(\011, recunroll, 2) /* Min. unroll for true recursion. */ \
|
110
|
+
\
|
111
|
+
/* Size of each machine code area (in KBytes). */ \
|
112
|
+
_(\011, sizemcode, JIT_P_sizemcode_DEFAULT) \
|
113
|
+
/* Max. total size of all machine code areas (in KBytes). */ \
|
114
|
+
_(\010, maxmcode, 512) \
|
115
|
+
/* End of list. */
|
116
|
+
|
117
|
+
enum {
|
118
|
+
#define JIT_PARAMENUM(len, name, value) JIT_P_##name,
|
119
|
+
JIT_PARAMDEF(JIT_PARAMENUM)
|
120
|
+
#undef JIT_PARAMENUM
|
121
|
+
JIT_P__MAX
|
122
|
+
};
|
123
|
+
|
124
|
+
#define JIT_PARAMSTR(len, name, value) #len #name
|
125
|
+
#define JIT_P_STRING JIT_PARAMDEF(JIT_PARAMSTR)
|
126
|
+
|
127
|
+
/* Trace compiler state. */
|
128
|
+
typedef enum {
|
129
|
+
LJ_TRACE_IDLE, /* Trace compiler idle. */
|
130
|
+
LJ_TRACE_ACTIVE = 0x10,
|
131
|
+
LJ_TRACE_RECORD, /* Bytecode recording active. */
|
132
|
+
LJ_TRACE_START, /* New trace started. */
|
133
|
+
LJ_TRACE_END, /* End of trace. */
|
134
|
+
LJ_TRACE_ASM, /* Assemble trace. */
|
135
|
+
LJ_TRACE_ERR /* Trace aborted with error. */
|
136
|
+
} TraceState;
|
137
|
+
|
138
|
+
/* Post-processing action. */
|
139
|
+
typedef enum {
|
140
|
+
LJ_POST_NONE, /* No action. */
|
141
|
+
LJ_POST_FIXCOMP, /* Fixup comparison and emit pending guard. */
|
142
|
+
LJ_POST_FIXGUARD, /* Fixup and emit pending guard. */
|
143
|
+
LJ_POST_FIXGUARDSNAP, /* Fixup and emit pending guard and snapshot. */
|
144
|
+
LJ_POST_FIXBOOL, /* Fixup boolean result. */
|
145
|
+
LJ_POST_FIXCONST, /* Fixup constant results. */
|
146
|
+
LJ_POST_FFRETRY /* Suppress recording of retried fast functions. */
|
147
|
+
} PostProc;
|
148
|
+
|
149
|
+
/* Machine code type. */
|
150
|
+
#if LJ_TARGET_X86ORX64
|
151
|
+
typedef uint8_t MCode;
|
152
|
+
#else
|
153
|
+
typedef uint32_t MCode;
|
154
|
+
#endif
|
155
|
+
|
156
|
+
/* Stack snapshot header. */
|
157
|
+
typedef struct SnapShot {
|
158
|
+
uint16_t mapofs; /* Offset into snapshot map. */
|
159
|
+
IRRef1 ref; /* First IR ref for this snapshot. */
|
160
|
+
uint8_t nslots; /* Number of valid slots. */
|
161
|
+
uint8_t topslot; /* Maximum frame extent. */
|
162
|
+
uint8_t nent; /* Number of compressed entries. */
|
163
|
+
uint8_t count; /* Count of taken exits for this snapshot. */
|
164
|
+
} SnapShot;
|
165
|
+
|
166
|
+
#define SNAPCOUNT_DONE 255 /* Already compiled and linked a side trace. */
|
167
|
+
|
168
|
+
/* Compressed snapshot entry. */
|
169
|
+
typedef uint32_t SnapEntry;
|
170
|
+
|
171
|
+
#define SNAP_FRAME 0x010000 /* Frame slot. */
|
172
|
+
#define SNAP_CONT 0x020000 /* Continuation slot. */
|
173
|
+
#define SNAP_NORESTORE 0x040000 /* No need to restore slot. */
|
174
|
+
#define SNAP_SOFTFPNUM 0x080000 /* Soft-float number. */
|
175
|
+
LJ_STATIC_ASSERT(SNAP_FRAME == TREF_FRAME);
|
176
|
+
LJ_STATIC_ASSERT(SNAP_CONT == TREF_CONT);
|
177
|
+
|
178
|
+
#define SNAP(slot, flags, ref) (((SnapEntry)(slot) << 24) + (flags) + (ref))
|
179
|
+
#define SNAP_TR(slot, tr) \
|
180
|
+
(((SnapEntry)(slot) << 24) + ((tr) & (TREF_CONT|TREF_FRAME|TREF_REFMASK)))
|
181
|
+
#define SNAP_MKPC(pc) ((SnapEntry)u32ptr(pc))
|
182
|
+
#define SNAP_MKFTSZ(ftsz) ((SnapEntry)(ftsz))
|
183
|
+
#define snap_ref(sn) ((sn) & 0xffff)
|
184
|
+
#define snap_slot(sn) ((BCReg)((sn) >> 24))
|
185
|
+
#define snap_isframe(sn) ((sn) & SNAP_FRAME)
|
186
|
+
#define snap_pc(sn) ((const BCIns *)(uintptr_t)(sn))
|
187
|
+
#define snap_setref(sn, ref) (((sn) & (0xffff0000&~SNAP_NORESTORE)) | (ref))
|
188
|
+
|
189
|
+
/* Snapshot and exit numbers. */
|
190
|
+
typedef uint32_t SnapNo;
|
191
|
+
typedef uint32_t ExitNo;
|
192
|
+
|
193
|
+
/* Trace number. */
|
194
|
+
typedef uint32_t TraceNo; /* Used to pass around trace numbers. */
|
195
|
+
typedef uint16_t TraceNo1; /* Stored trace number. */
|
196
|
+
|
197
|
+
/* Type of link. ORDER LJ_TRLINK */
|
198
|
+
typedef enum {
|
199
|
+
LJ_TRLINK_NONE, /* Incomplete trace. No link, yet. */
|
200
|
+
LJ_TRLINK_ROOT, /* Link to other root trace. */
|
201
|
+
LJ_TRLINK_LOOP, /* Loop to same trace. */
|
202
|
+
LJ_TRLINK_TAILREC, /* Tail-recursion. */
|
203
|
+
LJ_TRLINK_UPREC, /* Up-recursion. */
|
204
|
+
LJ_TRLINK_DOWNREC, /* Down-recursion. */
|
205
|
+
LJ_TRLINK_INTERP, /* Fallback to interpreter. */
|
206
|
+
LJ_TRLINK_RETURN, /* Return to interpreter. */
|
207
|
+
LJ_TRLINK_STITCH /* Trace stitching. */
|
208
|
+
} TraceLink;
|
209
|
+
|
210
|
+
/* Trace object. */
|
211
|
+
typedef struct GCtrace {
|
212
|
+
GCHeader;
|
213
|
+
uint8_t topslot; /* Top stack slot already checked to be allocated. */
|
214
|
+
uint8_t linktype; /* Type of link. */
|
215
|
+
IRRef nins; /* Next IR instruction. Biased with REF_BIAS. */
|
216
|
+
#if LJ_GC64
|
217
|
+
uint32_t unused_gc64;
|
218
|
+
#endif
|
219
|
+
GCRef gclist;
|
220
|
+
IRIns *ir; /* IR instructions/constants. Biased with REF_BIAS. */
|
221
|
+
IRRef nk; /* Lowest IR constant. Biased with REF_BIAS. */
|
222
|
+
uint16_t nsnap; /* Number of snapshots. */
|
223
|
+
uint16_t nsnapmap; /* Number of snapshot map elements. */
|
224
|
+
SnapShot *snap; /* Snapshot array. */
|
225
|
+
SnapEntry *snapmap; /* Snapshot map. */
|
226
|
+
GCRef startpt; /* Starting prototype. */
|
227
|
+
MRef startpc; /* Bytecode PC of starting instruction. */
|
228
|
+
BCIns startins; /* Original bytecode of starting instruction. */
|
229
|
+
MSize szmcode; /* Size of machine code. */
|
230
|
+
MCode *mcode; /* Start of machine code. */
|
231
|
+
MSize mcloop; /* Offset of loop start in machine code. */
|
232
|
+
uint16_t nchild; /* Number of child traces (root trace only). */
|
233
|
+
uint16_t spadjust; /* Stack pointer adjustment (offset in bytes). */
|
234
|
+
TraceNo1 traceno; /* Trace number. */
|
235
|
+
TraceNo1 link; /* Linked trace (or self for loops). */
|
236
|
+
TraceNo1 root; /* Root trace of side trace (or 0 for root traces). */
|
237
|
+
TraceNo1 nextroot; /* Next root trace for same prototype. */
|
238
|
+
TraceNo1 nextside; /* Next side trace of same root trace. */
|
239
|
+
uint8_t sinktags; /* Trace has SINK tags. */
|
240
|
+
uint8_t unused1;
|
241
|
+
#ifdef LUAJIT_USE_GDBJIT
|
242
|
+
void *gdbjit_entry; /* GDB JIT entry. */
|
243
|
+
#endif
|
244
|
+
} GCtrace;
|
245
|
+
|
246
|
+
#define gco2trace(o) check_exp((o)->gch.gct == ~LJ_TTRACE, (GCtrace *)(o))
|
247
|
+
#define traceref(J, n) \
|
248
|
+
check_exp((n)>0 && (MSize)(n)<J->sizetrace, (GCtrace *)gcref(J->trace[(n)]))
|
249
|
+
|
250
|
+
LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCtrace, gclist));
|
251
|
+
|
252
|
+
static LJ_AINLINE MSize snap_nextofs(GCtrace *T, SnapShot *snap)
|
253
|
+
{
|
254
|
+
if (snap+1 == &T->snap[T->nsnap])
|
255
|
+
return T->nsnapmap;
|
256
|
+
else
|
257
|
+
return (snap+1)->mapofs;
|
258
|
+
}
|
259
|
+
|
260
|
+
/* Round-robin penalty cache for bytecodes leading to aborted traces. */
|
261
|
+
typedef struct HotPenalty {
|
262
|
+
MRef pc; /* Starting bytecode PC. */
|
263
|
+
uint16_t val; /* Penalty value, i.e. hotcount start. */
|
264
|
+
uint16_t reason; /* Abort reason (really TraceErr). */
|
265
|
+
} HotPenalty;
|
266
|
+
|
267
|
+
#define PENALTY_SLOTS 64 /* Penalty cache slot. Must be a power of 2. */
|
268
|
+
#define PENALTY_MIN (36*2) /* Minimum penalty value. */
|
269
|
+
#define PENALTY_MAX 60000 /* Maximum penalty value. */
|
270
|
+
#define PENALTY_RNDBITS 4 /* # of random bits to add to penalty value. */
|
271
|
+
|
272
|
+
/* Round-robin backpropagation cache for narrowing conversions. */
|
273
|
+
typedef struct BPropEntry {
|
274
|
+
IRRef1 key; /* Key: original reference. */
|
275
|
+
IRRef1 val; /* Value: reference after conversion. */
|
276
|
+
IRRef mode; /* Mode for this entry (currently IRCONV_*). */
|
277
|
+
} BPropEntry;
|
278
|
+
|
279
|
+
/* Number of slots for the backpropagation cache. Must be a power of 2. */
|
280
|
+
#define BPROP_SLOTS 16
|
281
|
+
|
282
|
+
/* Scalar evolution analysis cache. */
|
283
|
+
typedef struct ScEvEntry {
|
284
|
+
MRef pc; /* Bytecode PC of FORI. */
|
285
|
+
IRRef1 idx; /* Index reference. */
|
286
|
+
IRRef1 start; /* Constant start reference. */
|
287
|
+
IRRef1 stop; /* Constant stop reference. */
|
288
|
+
IRRef1 step; /* Constant step reference. */
|
289
|
+
IRType1 t; /* Scalar type. */
|
290
|
+
uint8_t dir; /* Direction. 1: +, 0: -. */
|
291
|
+
} ScEvEntry;
|
292
|
+
|
293
|
+
/* Reverse bytecode map (IRRef -> PC). Only for selected instructions. */
|
294
|
+
typedef struct RBCHashEntry {
|
295
|
+
MRef pc; /* Bytecode PC. */
|
296
|
+
GCRef pt; /* Prototype. */
|
297
|
+
IRRef ref; /* IR reference. */
|
298
|
+
} RBCHashEntry;
|
299
|
+
|
300
|
+
/* Number of slots in the reverse bytecode hash table. Must be a power of 2. */
|
301
|
+
#define RBCHASH_SLOTS 8
|
302
|
+
|
303
|
+
/* 128 bit SIMD constants. */
|
304
|
+
enum {
|
305
|
+
LJ_KSIMD_ABS,
|
306
|
+
LJ_KSIMD_NEG,
|
307
|
+
LJ_KSIMD__MAX
|
308
|
+
};
|
309
|
+
|
310
|
+
/* Get 16 byte aligned pointer to SIMD constant. */
|
311
|
+
#define LJ_KSIMD(J, n) \
|
312
|
+
((TValue *)(((intptr_t)&J->ksimd[2*(n)] + 15) & ~(intptr_t)15))
|
313
|
+
|
314
|
+
/* Set/reset flag to activate the SPLIT pass for the current trace. */
|
315
|
+
#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)
|
316
|
+
#define lj_needsplit(J) (J->needsplit = 1)
|
317
|
+
#define lj_resetsplit(J) (J->needsplit = 0)
|
318
|
+
#else
|
319
|
+
#define lj_needsplit(J) UNUSED(J)
|
320
|
+
#define lj_resetsplit(J) UNUSED(J)
|
321
|
+
#endif
|
322
|
+
|
323
|
+
/* Fold state is used to fold instructions on-the-fly. */
|
324
|
+
typedef struct FoldState {
|
325
|
+
IRIns ins; /* Currently emitted instruction. */
|
326
|
+
IRIns left; /* Instruction referenced by left operand. */
|
327
|
+
IRIns right; /* Instruction referenced by right operand. */
|
328
|
+
} FoldState;
|
329
|
+
|
330
|
+
/* JIT compiler state. */
|
331
|
+
typedef struct jit_State {
|
332
|
+
GCtrace cur; /* Current trace. */
|
333
|
+
|
334
|
+
lua_State *L; /* Current Lua state. */
|
335
|
+
const BCIns *pc; /* Current PC. */
|
336
|
+
GCfunc *fn; /* Current function. */
|
337
|
+
GCproto *pt; /* Current prototype. */
|
338
|
+
TRef *base; /* Current frame base, points into J->slots. */
|
339
|
+
|
340
|
+
uint32_t flags; /* JIT engine flags. */
|
341
|
+
BCReg maxslot; /* Relative to baseslot. */
|
342
|
+
BCReg baseslot; /* Current frame base, offset into J->slots. */
|
343
|
+
|
344
|
+
uint8_t mergesnap; /* Allowed to merge with next snapshot. */
|
345
|
+
uint8_t needsnap; /* Need snapshot before recording next bytecode. */
|
346
|
+
IRType1 guardemit; /* Accumulated IRT_GUARD for emitted instructions. */
|
347
|
+
uint8_t bcskip; /* Number of bytecode instructions to skip. */
|
348
|
+
|
349
|
+
FoldState fold; /* Fold state. */
|
350
|
+
|
351
|
+
const BCIns *bc_min; /* Start of allowed bytecode range for root trace. */
|
352
|
+
MSize bc_extent; /* Extent of the range. */
|
353
|
+
|
354
|
+
TraceState state; /* Trace compiler state. */
|
355
|
+
|
356
|
+
int32_t instunroll; /* Unroll counter for instable loops. */
|
357
|
+
int32_t loopunroll; /* Unroll counter for loop ops in side traces. */
|
358
|
+
int32_t tailcalled; /* Number of successive tailcalls. */
|
359
|
+
int32_t framedepth; /* Current frame depth. */
|
360
|
+
int32_t retdepth; /* Return frame depth (count of RETF). */
|
361
|
+
|
362
|
+
MRef k64; /* Pointer to chained array of 64 bit constants. */
|
363
|
+
TValue ksimd[LJ_KSIMD__MAX*2+1]; /* 16 byte aligned SIMD constants. */
|
364
|
+
|
365
|
+
IRIns *irbuf; /* Temp. IR instruction buffer. Biased with REF_BIAS. */
|
366
|
+
IRRef irtoplim; /* Upper limit of instuction buffer (biased). */
|
367
|
+
IRRef irbotlim; /* Lower limit of instuction buffer (biased). */
|
368
|
+
IRRef loopref; /* Last loop reference or ref of final LOOP (or 0). */
|
369
|
+
|
370
|
+
MSize sizesnap; /* Size of temp. snapshot buffer. */
|
371
|
+
SnapShot *snapbuf; /* Temp. snapshot buffer. */
|
372
|
+
SnapEntry *snapmapbuf; /* Temp. snapshot map buffer. */
|
373
|
+
MSize sizesnapmap; /* Size of temp. snapshot map buffer. */
|
374
|
+
|
375
|
+
PostProc postproc; /* Required post-processing after execution. */
|
376
|
+
#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)
|
377
|
+
uint8_t needsplit; /* Need SPLIT pass. */
|
378
|
+
#endif
|
379
|
+
uint8_t retryrec; /* Retry recording. */
|
380
|
+
|
381
|
+
GCRef *trace; /* Array of traces. */
|
382
|
+
TraceNo freetrace; /* Start of scan for next free trace. */
|
383
|
+
MSize sizetrace; /* Size of trace array. */
|
384
|
+
|
385
|
+
IRRef1 chain[IR__MAX]; /* IR instruction skip-list chain anchors. */
|
386
|
+
TRef slot[LJ_MAX_JSLOTS+LJ_STACK_EXTRA]; /* Stack slot map. */
|
387
|
+
|
388
|
+
int32_t param[JIT_P__MAX]; /* JIT engine parameters. */
|
389
|
+
|
390
|
+
MCode *exitstubgroup[LJ_MAX_EXITSTUBGR]; /* Exit stub group addresses. */
|
391
|
+
|
392
|
+
HotPenalty penalty[PENALTY_SLOTS]; /* Penalty slots. */
|
393
|
+
uint32_t penaltyslot; /* Round-robin index into penalty slots. */
|
394
|
+
uint32_t prngstate; /* PRNG state. */
|
395
|
+
|
396
|
+
#ifdef LUAJIT_ENABLE_TABLE_BUMP
|
397
|
+
RBCHashEntry rbchash[RBCHASH_SLOTS]; /* Reverse bytecode map. */
|
398
|
+
#endif
|
399
|
+
|
400
|
+
BPropEntry bpropcache[BPROP_SLOTS]; /* Backpropagation cache slots. */
|
401
|
+
uint32_t bpropslot; /* Round-robin index into bpropcache slots. */
|
402
|
+
|
403
|
+
ScEvEntry scev; /* Scalar evolution analysis cache slots. */
|
404
|
+
|
405
|
+
const BCIns *startpc; /* Bytecode PC of starting instruction. */
|
406
|
+
TraceNo parent; /* Parent of current side trace (0 for root traces). */
|
407
|
+
ExitNo exitno; /* Exit number in parent of current side trace. */
|
408
|
+
|
409
|
+
BCIns *patchpc; /* PC for pending re-patch. */
|
410
|
+
BCIns patchins; /* Instruction for pending re-patch. */
|
411
|
+
|
412
|
+
int mcprot; /* Protection of current mcode area. */
|
413
|
+
MCode *mcarea; /* Base of current mcode area. */
|
414
|
+
MCode *mctop; /* Top of current mcode area. */
|
415
|
+
MCode *mcbot; /* Bottom of current mcode area. */
|
416
|
+
size_t szmcarea; /* Size of current mcode area. */
|
417
|
+
size_t szallmcarea; /* Total size of all allocated mcode areas. */
|
418
|
+
|
419
|
+
TValue errinfo; /* Additional info element for trace errors. */
|
420
|
+
|
421
|
+
#if LJ_HASPROFILE
|
422
|
+
GCproto *prev_pt; /* Previous prototype. */
|
423
|
+
BCLine prev_line; /* Previous line. */
|
424
|
+
int prof_mode; /* Profiling mode: 0, 'f', 'l'. */
|
425
|
+
#endif
|
426
|
+
}
|
427
|
+
#if LJ_TARGET_ARM
|
428
|
+
LJ_ALIGN(16) /* For DISPATCH-relative addresses in assembler part. */
|
429
|
+
#endif
|
430
|
+
jit_State;
|
431
|
+
|
432
|
+
/* Trivial PRNG e.g. used for penalty randomization. */
|
433
|
+
static LJ_AINLINE uint32_t LJ_PRNG_BITS(jit_State *J, int bits)
|
434
|
+
{
|
435
|
+
/* Yes, this LCG is very weak, but that doesn't matter for our use case. */
|
436
|
+
J->prngstate = J->prngstate * 1103515245 + 12345;
|
437
|
+
return J->prngstate >> (32-bits);
|
438
|
+
}
|
439
|
+
|
440
|
+
#endif
|
@@ -0,0 +1,482 @@
|
|
1
|
+
/*
|
2
|
+
** Lexical analyzer.
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
4
|
+
**
|
5
|
+
** Major 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_lex_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
|
+
#if LJ_HASFFI
|
18
|
+
#include "lj_tab.h"
|
19
|
+
#include "lj_ctype.h"
|
20
|
+
#include "lj_cdata.h"
|
21
|
+
#include "lualib.h"
|
22
|
+
#endif
|
23
|
+
#include "lj_state.h"
|
24
|
+
#include "lj_lex.h"
|
25
|
+
#include "lj_parse.h"
|
26
|
+
#include "lj_char.h"
|
27
|
+
#include "lj_strscan.h"
|
28
|
+
#include "lj_strfmt.h"
|
29
|
+
|
30
|
+
/* Lua lexer token names. */
|
31
|
+
static const char *const tokennames[] = {
|
32
|
+
#define TKSTR1(name) #name,
|
33
|
+
#define TKSTR2(name, sym) #sym,
|
34
|
+
TKDEF(TKSTR1, TKSTR2)
|
35
|
+
#undef TKSTR1
|
36
|
+
#undef TKSTR2
|
37
|
+
NULL
|
38
|
+
};
|
39
|
+
|
40
|
+
/* -- Buffer handling ----------------------------------------------------- */
|
41
|
+
|
42
|
+
#define LEX_EOF (-1)
|
43
|
+
#define lex_iseol(ls) (ls->c == '\n' || ls->c == '\r')
|
44
|
+
|
45
|
+
/* Get more input from reader. */
|
46
|
+
static LJ_NOINLINE LexChar lex_more(LexState *ls)
|
47
|
+
{
|
48
|
+
size_t sz;
|
49
|
+
const char *p = ls->rfunc(ls->L, ls->rdata, &sz);
|
50
|
+
if (p == NULL || sz == 0) return LEX_EOF;
|
51
|
+
ls->pe = p + sz;
|
52
|
+
ls->p = p + 1;
|
53
|
+
return (LexChar)(uint8_t)p[0];
|
54
|
+
}
|
55
|
+
|
56
|
+
/* Get next character. */
|
57
|
+
static LJ_AINLINE LexChar lex_next(LexState *ls)
|
58
|
+
{
|
59
|
+
return (ls->c = ls->p < ls->pe ? (LexChar)(uint8_t)*ls->p++ : lex_more(ls));
|
60
|
+
}
|
61
|
+
|
62
|
+
/* Save character. */
|
63
|
+
static LJ_AINLINE void lex_save(LexState *ls, LexChar c)
|
64
|
+
{
|
65
|
+
lj_buf_putb(&ls->sb, c);
|
66
|
+
}
|
67
|
+
|
68
|
+
/* Save previous character and get next character. */
|
69
|
+
static LJ_AINLINE LexChar lex_savenext(LexState *ls)
|
70
|
+
{
|
71
|
+
lex_save(ls, ls->c);
|
72
|
+
return lex_next(ls);
|
73
|
+
}
|
74
|
+
|
75
|
+
/* Skip line break. Handles "\n", "\r", "\r\n" or "\n\r". */
|
76
|
+
static void lex_newline(LexState *ls)
|
77
|
+
{
|
78
|
+
LexChar old = ls->c;
|
79
|
+
lua_assert(lex_iseol(ls));
|
80
|
+
lex_next(ls); /* Skip "\n" or "\r". */
|
81
|
+
if (lex_iseol(ls) && ls->c != old) lex_next(ls); /* Skip "\n\r" or "\r\n". */
|
82
|
+
if (++ls->linenumber >= LJ_MAX_LINE)
|
83
|
+
lj_lex_error(ls, ls->tok, LJ_ERR_XLINES);
|
84
|
+
}
|
85
|
+
|
86
|
+
/* -- Scanner for terminals ----------------------------------------------- */
|
87
|
+
|
88
|
+
/* Parse a number literal. */
|
89
|
+
static void lex_number(LexState *ls, TValue *tv)
|
90
|
+
{
|
91
|
+
StrScanFmt fmt;
|
92
|
+
LexChar c, xp = 'e';
|
93
|
+
lua_assert(lj_char_isdigit(ls->c));
|
94
|
+
if ((c = ls->c) == '0' && (lex_savenext(ls) | 0x20) == 'x')
|
95
|
+
xp = 'p';
|
96
|
+
while (lj_char_isident(ls->c) || ls->c == '.' ||
|
97
|
+
((ls->c == '-' || ls->c == '+') && (c | 0x20) == xp)) {
|
98
|
+
c = ls->c;
|
99
|
+
lex_savenext(ls);
|
100
|
+
}
|
101
|
+
lex_save(ls, '\0');
|
102
|
+
fmt = lj_strscan_scan((const uint8_t *)sbufB(&ls->sb), tv,
|
103
|
+
(LJ_DUALNUM ? STRSCAN_OPT_TOINT : STRSCAN_OPT_TONUM) |
|
104
|
+
(LJ_HASFFI ? (STRSCAN_OPT_LL|STRSCAN_OPT_IMAG) : 0));
|
105
|
+
if (LJ_DUALNUM && fmt == STRSCAN_INT) {
|
106
|
+
setitype(tv, LJ_TISNUM);
|
107
|
+
} else if (fmt == STRSCAN_NUM) {
|
108
|
+
/* Already in correct format. */
|
109
|
+
#if LJ_HASFFI
|
110
|
+
} else if (fmt != STRSCAN_ERROR) {
|
111
|
+
lua_State *L = ls->L;
|
112
|
+
GCcdata *cd;
|
113
|
+
lua_assert(fmt == STRSCAN_I64 || fmt == STRSCAN_U64 || fmt == STRSCAN_IMAG);
|
114
|
+
if (!ctype_ctsG(G(L))) {
|
115
|
+
ptrdiff_t oldtop = savestack(L, L->top);
|
116
|
+
luaopen_ffi(L); /* Load FFI library on-demand. */
|
117
|
+
L->top = restorestack(L, oldtop);
|
118
|
+
}
|
119
|
+
if (fmt == STRSCAN_IMAG) {
|
120
|
+
cd = lj_cdata_new_(L, CTID_COMPLEX_DOUBLE, 2*sizeof(double));
|
121
|
+
((double *)cdataptr(cd))[0] = 0;
|
122
|
+
((double *)cdataptr(cd))[1] = numV(tv);
|
123
|
+
} else {
|
124
|
+
cd = lj_cdata_new_(L, fmt==STRSCAN_I64 ? CTID_INT64 : CTID_UINT64, 8);
|
125
|
+
*(uint64_t *)cdataptr(cd) = tv->u64;
|
126
|
+
}
|
127
|
+
lj_parse_keepcdata(ls, tv, cd);
|
128
|
+
#endif
|
129
|
+
} else {
|
130
|
+
lua_assert(fmt == STRSCAN_ERROR);
|
131
|
+
lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER);
|
132
|
+
}
|
133
|
+
}
|
134
|
+
|
135
|
+
/* Skip equal signs for "[=...=[" and "]=...=]" and return their count. */
|
136
|
+
static int lex_skipeq(LexState *ls)
|
137
|
+
{
|
138
|
+
int count = 0;
|
139
|
+
LexChar s = ls->c;
|
140
|
+
lua_assert(s == '[' || s == ']');
|
141
|
+
while (lex_savenext(ls) == '=')
|
142
|
+
count++;
|
143
|
+
return (ls->c == s) ? count : (-count) - 1;
|
144
|
+
}
|
145
|
+
|
146
|
+
/* Parse a long string or long comment (tv set to NULL). */
|
147
|
+
static void lex_longstring(LexState *ls, TValue *tv, int sep)
|
148
|
+
{
|
149
|
+
lex_savenext(ls); /* Skip second '['. */
|
150
|
+
if (lex_iseol(ls)) /* Skip initial newline. */
|
151
|
+
lex_newline(ls);
|
152
|
+
for (;;) {
|
153
|
+
switch (ls->c) {
|
154
|
+
case LEX_EOF:
|
155
|
+
lj_lex_error(ls, TK_eof, tv ? LJ_ERR_XLSTR : LJ_ERR_XLCOM);
|
156
|
+
break;
|
157
|
+
case ']':
|
158
|
+
if (lex_skipeq(ls) == sep) {
|
159
|
+
lex_savenext(ls); /* Skip second ']'. */
|
160
|
+
goto endloop;
|
161
|
+
}
|
162
|
+
break;
|
163
|
+
case '\n':
|
164
|
+
case '\r':
|
165
|
+
lex_save(ls, '\n');
|
166
|
+
lex_newline(ls);
|
167
|
+
if (!tv) lj_buf_reset(&ls->sb); /* Don't waste space for comments. */
|
168
|
+
break;
|
169
|
+
default:
|
170
|
+
lex_savenext(ls);
|
171
|
+
break;
|
172
|
+
}
|
173
|
+
} endloop:
|
174
|
+
if (tv) {
|
175
|
+
GCstr *str = lj_parse_keepstr(ls, sbufB(&ls->sb) + (2 + (MSize)sep),
|
176
|
+
sbuflen(&ls->sb) - 2*(2 + (MSize)sep));
|
177
|
+
setstrV(ls->L, tv, str);
|
178
|
+
}
|
179
|
+
}
|
180
|
+
|
181
|
+
/* Parse a string. */
|
182
|
+
static void lex_string(LexState *ls, TValue *tv)
|
183
|
+
{
|
184
|
+
LexChar delim = ls->c; /* Delimiter is '\'' or '"'. */
|
185
|
+
lex_savenext(ls);
|
186
|
+
while (ls->c != delim) {
|
187
|
+
switch (ls->c) {
|
188
|
+
case LEX_EOF:
|
189
|
+
lj_lex_error(ls, TK_eof, LJ_ERR_XSTR);
|
190
|
+
continue;
|
191
|
+
case '\n':
|
192
|
+
case '\r':
|
193
|
+
lj_lex_error(ls, TK_string, LJ_ERR_XSTR);
|
194
|
+
continue;
|
195
|
+
case '\\': {
|
196
|
+
LexChar c = lex_next(ls); /* Skip the '\\'. */
|
197
|
+
switch (c) {
|
198
|
+
case 'a': c = '\a'; break;
|
199
|
+
case 'b': c = '\b'; break;
|
200
|
+
case 'f': c = '\f'; break;
|
201
|
+
case 'n': c = '\n'; break;
|
202
|
+
case 'r': c = '\r'; break;
|
203
|
+
case 't': c = '\t'; break;
|
204
|
+
case 'v': c = '\v'; break;
|
205
|
+
case 'x': /* Hexadecimal escape '\xXX'. */
|
206
|
+
c = (lex_next(ls) & 15u) << 4;
|
207
|
+
if (!lj_char_isdigit(ls->c)) {
|
208
|
+
if (!lj_char_isxdigit(ls->c)) goto err_xesc;
|
209
|
+
c += 9 << 4;
|
210
|
+
}
|
211
|
+
c += (lex_next(ls) & 15u);
|
212
|
+
if (!lj_char_isdigit(ls->c)) {
|
213
|
+
if (!lj_char_isxdigit(ls->c)) goto err_xesc;
|
214
|
+
c += 9;
|
215
|
+
}
|
216
|
+
break;
|
217
|
+
case 'z': /* Skip whitespace. */
|
218
|
+
lex_next(ls);
|
219
|
+
while (lj_char_isspace(ls->c))
|
220
|
+
if (lex_iseol(ls)) lex_newline(ls); else lex_next(ls);
|
221
|
+
continue;
|
222
|
+
case '\n': case '\r': lex_save(ls, '\n'); lex_newline(ls); continue;
|
223
|
+
case '\\': case '\"': case '\'': break;
|
224
|
+
case LEX_EOF: continue;
|
225
|
+
default:
|
226
|
+
if (!lj_char_isdigit(c))
|
227
|
+
goto err_xesc;
|
228
|
+
c -= '0'; /* Decimal escape '\ddd'. */
|
229
|
+
if (lj_char_isdigit(lex_next(ls))) {
|
230
|
+
c = c*10 + (ls->c - '0');
|
231
|
+
if (lj_char_isdigit(lex_next(ls))) {
|
232
|
+
c = c*10 + (ls->c - '0');
|
233
|
+
if (c > 255) {
|
234
|
+
err_xesc:
|
235
|
+
lj_lex_error(ls, TK_string, LJ_ERR_XESC);
|
236
|
+
}
|
237
|
+
lex_next(ls);
|
238
|
+
}
|
239
|
+
}
|
240
|
+
lex_save(ls, c);
|
241
|
+
continue;
|
242
|
+
}
|
243
|
+
lex_save(ls, c);
|
244
|
+
lex_next(ls);
|
245
|
+
continue;
|
246
|
+
}
|
247
|
+
default:
|
248
|
+
lex_savenext(ls);
|
249
|
+
break;
|
250
|
+
}
|
251
|
+
}
|
252
|
+
lex_savenext(ls); /* Skip trailing delimiter. */
|
253
|
+
setstrV(ls->L, tv,
|
254
|
+
lj_parse_keepstr(ls, sbufB(&ls->sb)+1, sbuflen(&ls->sb)-2));
|
255
|
+
}
|
256
|
+
|
257
|
+
/* -- Main lexical scanner ------------------------------------------------ */
|
258
|
+
|
259
|
+
/* Get next lexical token. */
|
260
|
+
static LexToken lex_scan(LexState *ls, TValue *tv)
|
261
|
+
{
|
262
|
+
lj_buf_reset(&ls->sb);
|
263
|
+
for (;;) {
|
264
|
+
if (lj_char_isident(ls->c)) {
|
265
|
+
GCstr *s;
|
266
|
+
if (lj_char_isdigit(ls->c)) { /* Numeric literal. */
|
267
|
+
lex_number(ls, tv);
|
268
|
+
return TK_number;
|
269
|
+
}
|
270
|
+
/* Identifier or reserved word. */
|
271
|
+
do {
|
272
|
+
lex_savenext(ls);
|
273
|
+
} while (lj_char_isident(ls->c));
|
274
|
+
s = lj_parse_keepstr(ls, sbufB(&ls->sb), sbuflen(&ls->sb));
|
275
|
+
setstrV(ls->L, tv, s);
|
276
|
+
if (s->reserved > 0) /* Reserved word? */
|
277
|
+
return TK_OFS + s->reserved;
|
278
|
+
return TK_name;
|
279
|
+
}
|
280
|
+
switch (ls->c) {
|
281
|
+
case '\n':
|
282
|
+
case '\r':
|
283
|
+
lex_newline(ls);
|
284
|
+
continue;
|
285
|
+
case ' ':
|
286
|
+
case '\t':
|
287
|
+
case '\v':
|
288
|
+
case '\f':
|
289
|
+
lex_next(ls);
|
290
|
+
continue;
|
291
|
+
case '-':
|
292
|
+
lex_next(ls);
|
293
|
+
if (ls->c != '-') return '-';
|
294
|
+
lex_next(ls);
|
295
|
+
if (ls->c == '[') { /* Long comment "--[=*[...]=*]". */
|
296
|
+
int sep = lex_skipeq(ls);
|
297
|
+
lj_buf_reset(&ls->sb); /* `lex_skipeq' may dirty the buffer */
|
298
|
+
if (sep >= 0) {
|
299
|
+
lex_longstring(ls, NULL, sep);
|
300
|
+
lj_buf_reset(&ls->sb);
|
301
|
+
continue;
|
302
|
+
}
|
303
|
+
}
|
304
|
+
/* Short comment "--.*\n". */
|
305
|
+
while (!lex_iseol(ls) && ls->c != LEX_EOF)
|
306
|
+
lex_next(ls);
|
307
|
+
continue;
|
308
|
+
case '[': {
|
309
|
+
int sep = lex_skipeq(ls);
|
310
|
+
if (sep >= 0) {
|
311
|
+
lex_longstring(ls, tv, sep);
|
312
|
+
return TK_string;
|
313
|
+
} else if (sep == -1) {
|
314
|
+
return '[';
|
315
|
+
} else {
|
316
|
+
lj_lex_error(ls, TK_string, LJ_ERR_XLDELIM);
|
317
|
+
continue;
|
318
|
+
}
|
319
|
+
}
|
320
|
+
case '=':
|
321
|
+
lex_next(ls);
|
322
|
+
if (ls->c != '=') return '='; else { lex_next(ls); return TK_eq; }
|
323
|
+
case '<':
|
324
|
+
lex_next(ls);
|
325
|
+
if (ls->c != '=') return '<'; else { lex_next(ls); return TK_le; }
|
326
|
+
case '>':
|
327
|
+
lex_next(ls);
|
328
|
+
if (ls->c != '=') return '>'; else { lex_next(ls); return TK_ge; }
|
329
|
+
case '~':
|
330
|
+
lex_next(ls);
|
331
|
+
if (ls->c != '=') return '~'; else { lex_next(ls); return TK_ne; }
|
332
|
+
case ':':
|
333
|
+
lex_next(ls);
|
334
|
+
if (ls->c != ':') return ':'; else { lex_next(ls); return TK_label; }
|
335
|
+
case '"':
|
336
|
+
case '\'':
|
337
|
+
lex_string(ls, tv);
|
338
|
+
return TK_string;
|
339
|
+
case '.':
|
340
|
+
if (lex_savenext(ls) == '.') {
|
341
|
+
lex_next(ls);
|
342
|
+
if (ls->c == '.') {
|
343
|
+
lex_next(ls);
|
344
|
+
return TK_dots; /* ... */
|
345
|
+
}
|
346
|
+
return TK_concat; /* .. */
|
347
|
+
} else if (!lj_char_isdigit(ls->c)) {
|
348
|
+
return '.';
|
349
|
+
} else {
|
350
|
+
lex_number(ls, tv);
|
351
|
+
return TK_number;
|
352
|
+
}
|
353
|
+
case LEX_EOF:
|
354
|
+
return TK_eof;
|
355
|
+
default: {
|
356
|
+
LexChar c = ls->c;
|
357
|
+
lex_next(ls);
|
358
|
+
return c; /* Single-char tokens (+ - / ...). */
|
359
|
+
}
|
360
|
+
}
|
361
|
+
}
|
362
|
+
}
|
363
|
+
|
364
|
+
/* -- Lexer API ----------------------------------------------------------- */
|
365
|
+
|
366
|
+
/* Setup lexer state. */
|
367
|
+
int lj_lex_setup(lua_State *L, LexState *ls)
|
368
|
+
{
|
369
|
+
int header = 0;
|
370
|
+
ls->L = L;
|
371
|
+
ls->fs = NULL;
|
372
|
+
ls->pe = ls->p = NULL;
|
373
|
+
ls->vstack = NULL;
|
374
|
+
ls->sizevstack = 0;
|
375
|
+
ls->vtop = 0;
|
376
|
+
ls->bcstack = NULL;
|
377
|
+
ls->sizebcstack = 0;
|
378
|
+
ls->tok = 0;
|
379
|
+
ls->lookahead = TK_eof; /* No look-ahead token. */
|
380
|
+
ls->linenumber = 1;
|
381
|
+
ls->lastline = 1;
|
382
|
+
lex_next(ls); /* Read-ahead first char. */
|
383
|
+
if (ls->c == 0xef && ls->p + 2 <= ls->pe && (uint8_t)ls->p[0] == 0xbb &&
|
384
|
+
(uint8_t)ls->p[1] == 0xbf) { /* Skip UTF-8 BOM (if buffered). */
|
385
|
+
ls->p += 2;
|
386
|
+
lex_next(ls);
|
387
|
+
header = 1;
|
388
|
+
}
|
389
|
+
if (ls->c == '#') { /* Skip POSIX #! header line. */
|
390
|
+
do {
|
391
|
+
lex_next(ls);
|
392
|
+
if (ls->c == LEX_EOF) return 0;
|
393
|
+
} while (!lex_iseol(ls));
|
394
|
+
lex_newline(ls);
|
395
|
+
header = 1;
|
396
|
+
}
|
397
|
+
if (ls->c == LUA_SIGNATURE[0]) { /* Bytecode dump. */
|
398
|
+
if (header) {
|
399
|
+
/*
|
400
|
+
** Loading bytecode with an extra header is disabled for security
|
401
|
+
** reasons. This may circumvent the usual check for bytecode vs.
|
402
|
+
** Lua code by looking at the first char. Since this is a potential
|
403
|
+
** security violation no attempt is made to echo the chunkname either.
|
404
|
+
*/
|
405
|
+
setstrV(L, L->top++, lj_err_str(L, LJ_ERR_BCBAD));
|
406
|
+
lj_err_throw(L, LUA_ERRSYNTAX);
|
407
|
+
}
|
408
|
+
return 1;
|
409
|
+
}
|
410
|
+
return 0;
|
411
|
+
}
|
412
|
+
|
413
|
+
/* Cleanup lexer state. */
|
414
|
+
void lj_lex_cleanup(lua_State *L, LexState *ls)
|
415
|
+
{
|
416
|
+
global_State *g = G(L);
|
417
|
+
lj_mem_freevec(g, ls->bcstack, ls->sizebcstack, BCInsLine);
|
418
|
+
lj_mem_freevec(g, ls->vstack, ls->sizevstack, VarInfo);
|
419
|
+
lj_buf_free(g, &ls->sb);
|
420
|
+
}
|
421
|
+
|
422
|
+
/* Return next lexical token. */
|
423
|
+
void lj_lex_next(LexState *ls)
|
424
|
+
{
|
425
|
+
ls->lastline = ls->linenumber;
|
426
|
+
if (LJ_LIKELY(ls->lookahead == TK_eof)) { /* No lookahead token? */
|
427
|
+
ls->tok = lex_scan(ls, &ls->tokval); /* Get next token. */
|
428
|
+
} else { /* Otherwise return lookahead token. */
|
429
|
+
ls->tok = ls->lookahead;
|
430
|
+
ls->lookahead = TK_eof;
|
431
|
+
ls->tokval = ls->lookaheadval;
|
432
|
+
}
|
433
|
+
}
|
434
|
+
|
435
|
+
/* Look ahead for the next token. */
|
436
|
+
LexToken lj_lex_lookahead(LexState *ls)
|
437
|
+
{
|
438
|
+
lua_assert(ls->lookahead == TK_eof);
|
439
|
+
ls->lookahead = lex_scan(ls, &ls->lookaheadval);
|
440
|
+
return ls->lookahead;
|
441
|
+
}
|
442
|
+
|
443
|
+
/* Convert token to string. */
|
444
|
+
const char *lj_lex_token2str(LexState *ls, LexToken tok)
|
445
|
+
{
|
446
|
+
if (tok > TK_OFS)
|
447
|
+
return tokennames[tok-TK_OFS-1];
|
448
|
+
else if (!lj_char_iscntrl(tok))
|
449
|
+
return lj_strfmt_pushf(ls->L, "%c", tok);
|
450
|
+
else
|
451
|
+
return lj_strfmt_pushf(ls->L, "char(%d)", tok);
|
452
|
+
}
|
453
|
+
|
454
|
+
/* Lexer error. */
|
455
|
+
void lj_lex_error(LexState *ls, LexToken tok, ErrMsg em, ...)
|
456
|
+
{
|
457
|
+
const char *tokstr;
|
458
|
+
va_list argp;
|
459
|
+
if (tok == 0) {
|
460
|
+
tokstr = NULL;
|
461
|
+
} else if (tok == TK_name || tok == TK_string || tok == TK_number) {
|
462
|
+
lex_save(ls, '\0');
|
463
|
+
tokstr = sbufB(&ls->sb);
|
464
|
+
} else {
|
465
|
+
tokstr = lj_lex_token2str(ls, tok);
|
466
|
+
}
|
467
|
+
va_start(argp, em);
|
468
|
+
lj_err_lex(ls->L, ls->chunkname, tokstr, ls->linenumber, em, argp);
|
469
|
+
va_end(argp);
|
470
|
+
}
|
471
|
+
|
472
|
+
/* Initialize strings for reserved words. */
|
473
|
+
void lj_lex_init(lua_State *L)
|
474
|
+
{
|
475
|
+
uint32_t i;
|
476
|
+
for (i = 0; i < TK_RESERVED; i++) {
|
477
|
+
GCstr *s = lj_str_newz(L, tokennames[i]);
|
478
|
+
fixstring(s); /* Reserved words are never collected. */
|
479
|
+
s->reserved = (uint8_t)(i+1);
|
480
|
+
}
|
481
|
+
}
|
482
|
+
|