immunio 0.15.4 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +0 -27
- data/ext/immunio/Rakefile +9 -0
- data/lib/immunio/plugins/active_record.rb +1 -1
- data/lib/immunio/plugins/active_record_relation.rb +1 -1
- data/lib/immunio/plugins/environment_reporter.rb +20 -0
- data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
- data/lib/immunio/version.rb +1 -1
- data/lib/immunio/vm.rb +1 -2
- data/lua-hooks/Makefile +97 -0
- data/lua-hooks/ext/all.c +41 -52
- data/lua-hooks/ext/all.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
- data/lua-hooks/ext/libinjection/lualib.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.o +0 -0
- data/lua-hooks/ext/lpeg/lpcode.c +2 -2
- data/lua-hooks/ext/lpeg/lpcode.h +1 -1
- data/lua-hooks/ext/lpeg/lpcode.o +0 -0
- data/lua-hooks/ext/lpeg/lpprint.o +0 -0
- data/lua-hooks/ext/lpeg/lptree.c +2 -2
- data/lua-hooks/ext/lpeg/lptypes.h +1 -1
- data/lua-hooks/ext/lpeg/lpvm.c +2 -2
- data/lua-hooks/ext/lpeg/lpvm.o +0 -0
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
- data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
- data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
- data/lua-hooks/ext/luajit/Makefile +159 -0
- data/lua-hooks/ext/luajit/README +16 -0
- data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
- data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
- data/lua-hooks/ext/luajit/doc/changes.html +804 -0
- data/lua-hooks/ext/luajit/doc/contact.html +104 -0
- data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
- data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
- data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
- data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
- data/lua-hooks/ext/luajit/doc/faq.html +186 -0
- data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
- data/lua-hooks/ext/luajit/doc/install.html +659 -0
- data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
- data/lua-hooks/ext/luajit/doc/running.html +309 -0
- data/lua-hooks/ext/luajit/doc/status.html +118 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
- data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
- data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
- data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
- data/lua-hooks/ext/luajit/src/Makefile +697 -0
- data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
- data/lua-hooks/ext/luajit/src/host/README +4 -0
- data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
- data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
- data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
- data/lua-hooks/ext/luajit/src/host/minilua +0 -0
- data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
- data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
- data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
- data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
- data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
- data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
- data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
- data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
- data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
- data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
- data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
- data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
- data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
- data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
- data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
- data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
- data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
- data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
- data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
- data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
- data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
- data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
- data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
- data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
- data/lua-hooks/ext/luajit/src/lj.supp +26 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
- data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
- data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
- data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
- data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
- data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
- data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
- data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
- data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
- data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
- data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
- data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
- data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
- data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
- data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
- data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
- data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
- data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
- data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
- data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
- data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
- data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
- data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
- data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
- data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
- data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
- data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
- data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
- data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
- data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
- data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
- data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
- data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
- data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
- data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
- data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
- data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
- data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
- data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
- data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
- data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
- data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
- data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
- data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
- data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
- data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
- data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
- data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
- data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
- data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
- data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
- data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
- data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
- data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
- data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
- data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
- data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
- data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
- data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
- data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
- data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
- data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
- data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
- data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
- data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
- data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
- data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
- data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
- data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
- data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
- data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
- data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
- data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
- data/lua-hooks/ext/luajit/src/luajit +0 -0
- data/lua-hooks/ext/luajit/src/luajit.c +570 -0
- data/lua-hooks/ext/luajit/src/luajit.h +79 -0
- data/lua-hooks/ext/luajit/src/luajit.o +0 -0
- data/lua-hooks/ext/luajit/src/lualib.h +43 -0
- data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
- data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
- data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
- data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
- data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
- data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
- data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
- data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
- data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
- data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
- data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
- data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
- data/lua-hooks/lib/boot.lua +37 -2
- metadata +372 -69
- data/lua-hooks/ext/bitop/README +0 -22
- data/lua-hooks/ext/bitop/bit.c +0 -189
- data/lua-hooks/ext/extconf.rb +0 -38
- data/lua-hooks/ext/lua/COPYRIGHT +0 -34
- data/lua-hooks/ext/lua/lapi.c +0 -1087
- data/lua-hooks/ext/lua/lapi.h +0 -16
- data/lua-hooks/ext/lua/lauxlib.c +0 -652
- data/lua-hooks/ext/lua/lbaselib.c +0 -659
- data/lua-hooks/ext/lua/lcode.c +0 -831
- data/lua-hooks/ext/lua/lcode.h +0 -76
- data/lua-hooks/ext/lua/ldblib.c +0 -398
- data/lua-hooks/ext/lua/ldebug.c +0 -638
- data/lua-hooks/ext/lua/ldebug.h +0 -33
- data/lua-hooks/ext/lua/ldo.c +0 -519
- data/lua-hooks/ext/lua/ldo.h +0 -57
- data/lua-hooks/ext/lua/ldump.c +0 -164
- data/lua-hooks/ext/lua/lfunc.c +0 -174
- data/lua-hooks/ext/lua/lfunc.h +0 -34
- data/lua-hooks/ext/lua/lgc.c +0 -710
- data/lua-hooks/ext/lua/lgc.h +0 -110
- data/lua-hooks/ext/lua/linit.c +0 -38
- data/lua-hooks/ext/lua/liolib.c +0 -556
- data/lua-hooks/ext/lua/llex.c +0 -463
- data/lua-hooks/ext/lua/llex.h +0 -81
- data/lua-hooks/ext/lua/llimits.h +0 -128
- data/lua-hooks/ext/lua/lmathlib.c +0 -263
- data/lua-hooks/ext/lua/lmem.c +0 -86
- data/lua-hooks/ext/lua/lmem.h +0 -49
- data/lua-hooks/ext/lua/loadlib.c +0 -705
- data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
- data/lua-hooks/ext/lua/lobject.c +0 -214
- data/lua-hooks/ext/lua/lobject.h +0 -381
- data/lua-hooks/ext/lua/lopcodes.c +0 -102
- data/lua-hooks/ext/lua/lopcodes.h +0 -268
- data/lua-hooks/ext/lua/loslib.c +0 -243
- data/lua-hooks/ext/lua/lparser.c +0 -1339
- data/lua-hooks/ext/lua/lparser.h +0 -82
- data/lua-hooks/ext/lua/lstate.c +0 -214
- data/lua-hooks/ext/lua/lstate.h +0 -169
- data/lua-hooks/ext/lua/lstring.c +0 -111
- data/lua-hooks/ext/lua/lstring.h +0 -31
- data/lua-hooks/ext/lua/lstrlib.c +0 -871
- data/lua-hooks/ext/lua/ltable.c +0 -588
- data/lua-hooks/ext/lua/ltable.h +0 -40
- data/lua-hooks/ext/lua/ltablib.c +0 -287
- data/lua-hooks/ext/lua/ltm.c +0 -75
- data/lua-hooks/ext/lua/ltm.h +0 -54
- data/lua-hooks/ext/lua/lua.c +0 -392
- data/lua-hooks/ext/lua/lua.def +0 -131
- data/lua-hooks/ext/lua/lua.rc +0 -28
- data/lua-hooks/ext/lua/lua_dll.rc +0 -26
- data/lua-hooks/ext/lua/luac.c +0 -200
- data/lua-hooks/ext/lua/luac.rc +0 -1
- data/lua-hooks/ext/lua/luaconf.h +0 -763
- data/lua-hooks/ext/lua/luaconf.h.in +0 -724
- data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
- data/lua-hooks/ext/lua/lualib.h +0 -53
- data/lua-hooks/ext/lua/lundump.c +0 -227
- data/lua-hooks/ext/lua/lundump.h +0 -36
- data/lua-hooks/ext/lua/lvm.c +0 -767
- data/lua-hooks/ext/lua/lvm.h +0 -36
- data/lua-hooks/ext/lua/lzio.c +0 -82
- data/lua-hooks/ext/lua/lzio.h +0 -67
- data/lua-hooks/ext/lua/print.c +0 -227
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** String formatting.
|
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#ifndef _LJ_STRFMT_H
|
|
7
|
+
#define _LJ_STRFMT_H
|
|
8
|
+
|
|
9
|
+
#include "lj_obj.h"
|
|
10
|
+
|
|
11
|
+
typedef uint32_t SFormat; /* Format indicator. */
|
|
12
|
+
|
|
13
|
+
/* Format parser state. */
|
|
14
|
+
typedef struct FormatState {
|
|
15
|
+
const uint8_t *p; /* Current format string pointer. */
|
|
16
|
+
const uint8_t *e; /* End of format string. */
|
|
17
|
+
const char *str; /* Returned literal string. */
|
|
18
|
+
MSize len; /* Size of literal string. */
|
|
19
|
+
} FormatState;
|
|
20
|
+
|
|
21
|
+
/* Format types (max. 16). */
|
|
22
|
+
typedef enum FormatType {
|
|
23
|
+
STRFMT_EOF, STRFMT_ERR, STRFMT_LIT,
|
|
24
|
+
STRFMT_INT, STRFMT_UINT, STRFMT_NUM, STRFMT_STR, STRFMT_CHAR, STRFMT_PTR
|
|
25
|
+
} FormatType;
|
|
26
|
+
|
|
27
|
+
/* Format subtypes (bits are reused). */
|
|
28
|
+
#define STRFMT_T_HEX 0x0010 /* STRFMT_UINT */
|
|
29
|
+
#define STRFMT_T_OCT 0x0020 /* STRFMT_UINT */
|
|
30
|
+
#define STRFMT_T_FP_A 0x0000 /* STRFMT_NUM */
|
|
31
|
+
#define STRFMT_T_FP_E 0x0010 /* STRFMT_NUM */
|
|
32
|
+
#define STRFMT_T_FP_F 0x0020 /* STRFMT_NUM */
|
|
33
|
+
#define STRFMT_T_FP_G 0x0030 /* STRFMT_NUM */
|
|
34
|
+
#define STRFMT_T_QUOTED 0x0010 /* STRFMT_STR */
|
|
35
|
+
|
|
36
|
+
/* Format flags. */
|
|
37
|
+
#define STRFMT_F_LEFT 0x0100
|
|
38
|
+
#define STRFMT_F_PLUS 0x0200
|
|
39
|
+
#define STRFMT_F_ZERO 0x0400
|
|
40
|
+
#define STRFMT_F_SPACE 0x0800
|
|
41
|
+
#define STRFMT_F_ALT 0x1000
|
|
42
|
+
#define STRFMT_F_UPPER 0x2000
|
|
43
|
+
|
|
44
|
+
/* Format indicator fields. */
|
|
45
|
+
#define STRFMT_SH_WIDTH 16
|
|
46
|
+
#define STRFMT_SH_PREC 24
|
|
47
|
+
|
|
48
|
+
#define STRFMT_TYPE(sf) ((FormatType)((sf) & 15))
|
|
49
|
+
#define STRFMT_WIDTH(sf) (((sf) >> STRFMT_SH_WIDTH) & 255u)
|
|
50
|
+
#define STRFMT_PREC(sf) ((((sf) >> STRFMT_SH_PREC) & 255u) - 1u)
|
|
51
|
+
#define STRFMT_FP(sf) (((sf) >> 4) & 3)
|
|
52
|
+
|
|
53
|
+
/* Formats for conversion characters. */
|
|
54
|
+
#define STRFMT_A (STRFMT_NUM|STRFMT_T_FP_A)
|
|
55
|
+
#define STRFMT_C (STRFMT_CHAR)
|
|
56
|
+
#define STRFMT_D (STRFMT_INT)
|
|
57
|
+
#define STRFMT_E (STRFMT_NUM|STRFMT_T_FP_E)
|
|
58
|
+
#define STRFMT_F (STRFMT_NUM|STRFMT_T_FP_F)
|
|
59
|
+
#define STRFMT_G (STRFMT_NUM|STRFMT_T_FP_G)
|
|
60
|
+
#define STRFMT_I STRFMT_D
|
|
61
|
+
#define STRFMT_O (STRFMT_UINT|STRFMT_T_OCT)
|
|
62
|
+
#define STRFMT_P (STRFMT_PTR)
|
|
63
|
+
#define STRFMT_Q (STRFMT_STR|STRFMT_T_QUOTED)
|
|
64
|
+
#define STRFMT_S (STRFMT_STR)
|
|
65
|
+
#define STRFMT_U (STRFMT_UINT)
|
|
66
|
+
#define STRFMT_X (STRFMT_UINT|STRFMT_T_HEX)
|
|
67
|
+
|
|
68
|
+
/* Maximum buffer sizes for conversions. */
|
|
69
|
+
#define STRFMT_MAXBUF_XINT (1+22) /* '0' prefix + uint64_t in octal. */
|
|
70
|
+
#define STRFMT_MAXBUF_INT (1+10) /* Sign + int32_t in decimal. */
|
|
71
|
+
#define STRFMT_MAXBUF_NUM LUAI_MAXNUMBER2STR
|
|
72
|
+
#define STRFMT_MAXBUF_PTR (2+2*sizeof(ptrdiff_t)) /* "0x" + hex ptr. */
|
|
73
|
+
|
|
74
|
+
/* Format parser. */
|
|
75
|
+
LJ_FUNC SFormat LJ_FASTCALL lj_strfmt_parse(FormatState *fs);
|
|
76
|
+
|
|
77
|
+
static LJ_AINLINE void lj_strfmt_init(FormatState *fs, const char *p, MSize len)
|
|
78
|
+
{
|
|
79
|
+
fs->p = (const uint8_t *)p;
|
|
80
|
+
fs->e = (const uint8_t *)p + len;
|
|
81
|
+
lua_assert(*fs->e == 0); /* Must be NUL-terminated (may have NULs inside). */
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Raw conversions. */
|
|
85
|
+
LJ_FUNC char * LJ_FASTCALL lj_strfmt_wint(char *p, int32_t k);
|
|
86
|
+
LJ_FUNC char * LJ_FASTCALL lj_strfmt_wnum(char *p, cTValue *o);
|
|
87
|
+
LJ_FUNC char * LJ_FASTCALL lj_strfmt_wptr(char *p, const void *v);
|
|
88
|
+
LJ_FUNC char * LJ_FASTCALL lj_strfmt_wuleb128(char *p, uint32_t v);
|
|
89
|
+
LJ_FUNC const char *lj_strfmt_wstrnum(char *buf, cTValue *o, MSize *lenp);
|
|
90
|
+
|
|
91
|
+
/* Unformatted conversions to buffer. */
|
|
92
|
+
LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putint(SBuf *sb, int32_t k);
|
|
93
|
+
#if LJ_HASJIT
|
|
94
|
+
LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putnum(SBuf *sb, cTValue *o);
|
|
95
|
+
#endif
|
|
96
|
+
LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putptr(SBuf *sb, const void *v);
|
|
97
|
+
LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putquoted(SBuf *sb, GCstr *str);
|
|
98
|
+
|
|
99
|
+
/* Formatted conversions to buffer. */
|
|
100
|
+
LJ_FUNC SBuf *lj_strfmt_putfxint(SBuf *sb, SFormat sf, uint64_t k);
|
|
101
|
+
LJ_FUNC SBuf *lj_strfmt_putfnum_int(SBuf *sb, SFormat sf, lua_Number n);
|
|
102
|
+
LJ_FUNC SBuf *lj_strfmt_putfnum_uint(SBuf *sb, SFormat sf, lua_Number n);
|
|
103
|
+
LJ_FUNC SBuf *lj_strfmt_putfnum(SBuf *sb, SFormat, lua_Number n);
|
|
104
|
+
LJ_FUNC SBuf *lj_strfmt_putfchar(SBuf *sb, SFormat, int32_t c);
|
|
105
|
+
LJ_FUNC SBuf *lj_strfmt_putfstr(SBuf *sb, SFormat, GCstr *str);
|
|
106
|
+
|
|
107
|
+
/* Conversions to strings. */
|
|
108
|
+
LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_int(lua_State *L, int32_t k);
|
|
109
|
+
LJ_FUNCA GCstr * LJ_FASTCALL lj_strfmt_num(lua_State *L, cTValue *o);
|
|
110
|
+
LJ_FUNCA GCstr * LJ_FASTCALL lj_strfmt_number(lua_State *L, cTValue *o);
|
|
111
|
+
#if LJ_HASJIT
|
|
112
|
+
LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_char(lua_State *L, int c);
|
|
113
|
+
#endif
|
|
114
|
+
LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_obj(lua_State *L, cTValue *o);
|
|
115
|
+
|
|
116
|
+
/* Internal string formatting. */
|
|
117
|
+
LJ_FUNC const char *lj_strfmt_pushvf(lua_State *L, const char *fmt,
|
|
118
|
+
va_list argp);
|
|
119
|
+
LJ_FUNC const char *lj_strfmt_pushf(lua_State *L, const char *fmt, ...)
|
|
120
|
+
#ifdef __GNUC__
|
|
121
|
+
__attribute__ ((format (printf, 2, 3)))
|
|
122
|
+
#endif
|
|
123
|
+
;
|
|
124
|
+
|
|
125
|
+
#endif
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** String scanning.
|
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include <math.h>
|
|
7
|
+
|
|
8
|
+
#define lj_strscan_c
|
|
9
|
+
#define LUA_CORE
|
|
10
|
+
|
|
11
|
+
#include "lj_obj.h"
|
|
12
|
+
#include "lj_char.h"
|
|
13
|
+
#include "lj_strscan.h"
|
|
14
|
+
|
|
15
|
+
/* -- Scanning numbers ---------------------------------------------------- */
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
** Rationale for the builtin string to number conversion library:
|
|
19
|
+
**
|
|
20
|
+
** It removes a dependency on libc's strtod(), which is a true portability
|
|
21
|
+
** nightmare. Mainly due to the plethora of supported OS and toolchain
|
|
22
|
+
** combinations. Sadly, the various implementations
|
|
23
|
+
** a) are often buggy, incomplete (no hex floats) and/or imprecise,
|
|
24
|
+
** b) sometimes crash or hang on certain inputs,
|
|
25
|
+
** c) return non-standard NaNs that need to be filtered out, and
|
|
26
|
+
** d) fail if the locale-specific decimal separator is not a dot,
|
|
27
|
+
** which can only be fixed with atrocious workarounds.
|
|
28
|
+
**
|
|
29
|
+
** Also, most of the strtod() implementations are hopelessly bloated,
|
|
30
|
+
** which is not just an I-cache hog, but a problem for static linkage
|
|
31
|
+
** on embedded systems, too.
|
|
32
|
+
**
|
|
33
|
+
** OTOH the builtin conversion function is very compact. Even though it
|
|
34
|
+
** does a lot more, like parsing long longs, octal or imaginary numbers
|
|
35
|
+
** and returning the result in different formats:
|
|
36
|
+
** a) It needs less than 3 KB (!) of machine code (on x64 with -Os),
|
|
37
|
+
** b) it doesn't perform any dynamic allocation and,
|
|
38
|
+
** c) it needs only around 600 bytes of stack space.
|
|
39
|
+
**
|
|
40
|
+
** The builtin function is faster than strtod() for typical inputs, e.g.
|
|
41
|
+
** "123", "1.5" or "1e6". Arguably, it's slower for very large exponents,
|
|
42
|
+
** which are not very common (this could be fixed, if needed).
|
|
43
|
+
**
|
|
44
|
+
** And most importantly, the builtin function is equally precise on all
|
|
45
|
+
** platforms. It correctly converts and rounds any input to a double.
|
|
46
|
+
** If this is not the case, please send a bug report -- but PLEASE verify
|
|
47
|
+
** that the implementation you're comparing to is not the culprit!
|
|
48
|
+
**
|
|
49
|
+
** The implementation quickly pre-scans the entire string first and
|
|
50
|
+
** handles simple integers on-the-fly. Otherwise, it dispatches to the
|
|
51
|
+
** base-specific parser. Hex and octal is straightforward.
|
|
52
|
+
**
|
|
53
|
+
** Decimal to binary conversion uses a fixed-length circular buffer in
|
|
54
|
+
** base 100. Some simple cases are handled directly. For other cases, the
|
|
55
|
+
** number in the buffer is up-scaled or down-scaled until the integer part
|
|
56
|
+
** is in the proper range. Then the integer part is rounded and converted
|
|
57
|
+
** to a double which is finally rescaled to the result. Denormals need
|
|
58
|
+
** special treatment to prevent incorrect 'double rounding'.
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/* Definitions for circular decimal digit buffer (base 100 = 2 digits/byte). */
|
|
62
|
+
#define STRSCAN_DIG 1024
|
|
63
|
+
#define STRSCAN_MAXDIG 800 /* 772 + extra are sufficient. */
|
|
64
|
+
#define STRSCAN_DDIG (STRSCAN_DIG/2)
|
|
65
|
+
#define STRSCAN_DMASK (STRSCAN_DDIG-1)
|
|
66
|
+
|
|
67
|
+
/* Helpers for circular buffer. */
|
|
68
|
+
#define DNEXT(a) (((a)+1) & STRSCAN_DMASK)
|
|
69
|
+
#define DPREV(a) (((a)-1) & STRSCAN_DMASK)
|
|
70
|
+
#define DLEN(lo, hi) ((int32_t)(((lo)-(hi)) & STRSCAN_DMASK))
|
|
71
|
+
|
|
72
|
+
#define casecmp(c, k) (((c) | 0x20) == k)
|
|
73
|
+
|
|
74
|
+
/* Final conversion to double. */
|
|
75
|
+
static void strscan_double(uint64_t x, TValue *o, int32_t ex2, int32_t neg)
|
|
76
|
+
{
|
|
77
|
+
double n;
|
|
78
|
+
|
|
79
|
+
/* Avoid double rounding for denormals. */
|
|
80
|
+
if (LJ_UNLIKELY(ex2 <= -1075 && x != 0)) {
|
|
81
|
+
/* NYI: all of this generates way too much code on 32 bit CPUs. */
|
|
82
|
+
#if defined(__GNUC__) && LJ_64
|
|
83
|
+
int32_t b = (int32_t)(__builtin_clzll(x)^63);
|
|
84
|
+
#else
|
|
85
|
+
int32_t b = (x>>32) ? 32+(int32_t)lj_fls((uint32_t)(x>>32)) :
|
|
86
|
+
(int32_t)lj_fls((uint32_t)x);
|
|
87
|
+
#endif
|
|
88
|
+
if ((int32_t)b + ex2 <= -1023 && (int32_t)b + ex2 >= -1075) {
|
|
89
|
+
uint64_t rb = (uint64_t)1 << (-1075-ex2);
|
|
90
|
+
if ((x & rb) && ((x & (rb+rb+rb-1)))) x += rb+rb;
|
|
91
|
+
x = (x & ~(rb+rb-1));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Convert to double using a signed int64_t conversion, then rescale. */
|
|
96
|
+
lua_assert((int64_t)x >= 0);
|
|
97
|
+
n = (double)(int64_t)x;
|
|
98
|
+
if (neg) n = -n;
|
|
99
|
+
if (ex2) n = ldexp(n, ex2);
|
|
100
|
+
o->n = n;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Parse hexadecimal number. */
|
|
104
|
+
static StrScanFmt strscan_hex(const uint8_t *p, TValue *o,
|
|
105
|
+
StrScanFmt fmt, uint32_t opt,
|
|
106
|
+
int32_t ex2, int32_t neg, uint32_t dig)
|
|
107
|
+
{
|
|
108
|
+
uint64_t x = 0;
|
|
109
|
+
uint32_t i;
|
|
110
|
+
|
|
111
|
+
/* Scan hex digits. */
|
|
112
|
+
for (i = dig > 16 ? 16 : dig ; i; i--, p++) {
|
|
113
|
+
uint32_t d = (*p != '.' ? *p : *++p); if (d > '9') d += 9;
|
|
114
|
+
x = (x << 4) + (d & 15);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* Summarize rounding-effect of excess digits. */
|
|
118
|
+
for (i = 16; i < dig; i++, p++)
|
|
119
|
+
x |= ((*p != '.' ? *p : *++p) != '0'), ex2 += 4;
|
|
120
|
+
|
|
121
|
+
/* Format-specific handling. */
|
|
122
|
+
switch (fmt) {
|
|
123
|
+
case STRSCAN_INT:
|
|
124
|
+
if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) {
|
|
125
|
+
o->i = neg ? -(int32_t)x : (int32_t)x;
|
|
126
|
+
return STRSCAN_INT; /* Fast path for 32 bit integers. */
|
|
127
|
+
}
|
|
128
|
+
if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; break; }
|
|
129
|
+
/* fallthrough */
|
|
130
|
+
case STRSCAN_U32:
|
|
131
|
+
if (dig > 8) return STRSCAN_ERROR;
|
|
132
|
+
o->i = neg ? -(int32_t)x : (int32_t)x;
|
|
133
|
+
return STRSCAN_U32;
|
|
134
|
+
case STRSCAN_I64:
|
|
135
|
+
case STRSCAN_U64:
|
|
136
|
+
if (dig > 16) return STRSCAN_ERROR;
|
|
137
|
+
o->u64 = neg ? (uint64_t)-(int64_t)x : x;
|
|
138
|
+
return fmt;
|
|
139
|
+
default:
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* Reduce range, then convert to double. */
|
|
144
|
+
if ((x & U64x(c0000000,0000000))) { x = (x >> 2) | (x & 3); ex2 += 2; }
|
|
145
|
+
strscan_double(x, o, ex2, neg);
|
|
146
|
+
return fmt;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Parse octal number. */
|
|
150
|
+
static StrScanFmt strscan_oct(const uint8_t *p, TValue *o,
|
|
151
|
+
StrScanFmt fmt, int32_t neg, uint32_t dig)
|
|
152
|
+
{
|
|
153
|
+
uint64_t x = 0;
|
|
154
|
+
|
|
155
|
+
/* Scan octal digits. */
|
|
156
|
+
if (dig > 22 || (dig == 22 && *p > '1')) return STRSCAN_ERROR;
|
|
157
|
+
while (dig-- > 0) {
|
|
158
|
+
if (!(*p >= '0' && *p <= '7')) return STRSCAN_ERROR;
|
|
159
|
+
x = (x << 3) + (*p++ & 7);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* Format-specific handling. */
|
|
163
|
+
switch (fmt) {
|
|
164
|
+
case STRSCAN_INT:
|
|
165
|
+
if (x >= 0x80000000u+neg) fmt = STRSCAN_U32;
|
|
166
|
+
/* fallthrough */
|
|
167
|
+
case STRSCAN_U32:
|
|
168
|
+
if ((x >> 32)) return STRSCAN_ERROR;
|
|
169
|
+
o->i = neg ? -(int32_t)x : (int32_t)x;
|
|
170
|
+
break;
|
|
171
|
+
default:
|
|
172
|
+
case STRSCAN_I64:
|
|
173
|
+
case STRSCAN_U64:
|
|
174
|
+
o->u64 = neg ? (uint64_t)-(int64_t)x : x;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
return fmt;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* Parse decimal number. */
|
|
181
|
+
static StrScanFmt strscan_dec(const uint8_t *p, TValue *o,
|
|
182
|
+
StrScanFmt fmt, uint32_t opt,
|
|
183
|
+
int32_t ex10, int32_t neg, uint32_t dig)
|
|
184
|
+
{
|
|
185
|
+
uint8_t xi[STRSCAN_DDIG], *xip = xi;
|
|
186
|
+
|
|
187
|
+
if (dig) {
|
|
188
|
+
uint32_t i = dig;
|
|
189
|
+
if (i > STRSCAN_MAXDIG) {
|
|
190
|
+
ex10 += (int32_t)(i - STRSCAN_MAXDIG);
|
|
191
|
+
i = STRSCAN_MAXDIG;
|
|
192
|
+
}
|
|
193
|
+
/* Scan unaligned leading digit. */
|
|
194
|
+
if (((ex10^i) & 1))
|
|
195
|
+
*xip++ = ((*p != '.' ? *p : *++p) & 15), i--, p++;
|
|
196
|
+
/* Scan aligned double-digits. */
|
|
197
|
+
for ( ; i > 1; i -= 2) {
|
|
198
|
+
uint32_t d = 10 * ((*p != '.' ? *p : *++p) & 15); p++;
|
|
199
|
+
*xip++ = d + ((*p != '.' ? *p : *++p) & 15); p++;
|
|
200
|
+
}
|
|
201
|
+
/* Scan and realign trailing digit. */
|
|
202
|
+
if (i) *xip++ = 10 * ((*p != '.' ? *p : *++p) & 15), ex10--, dig++, p++;
|
|
203
|
+
|
|
204
|
+
/* Summarize rounding-effect of excess digits. */
|
|
205
|
+
if (dig > STRSCAN_MAXDIG) {
|
|
206
|
+
do {
|
|
207
|
+
if ((*p != '.' ? *p : *++p) != '0') { xip[-1] |= 1; break; }
|
|
208
|
+
p++;
|
|
209
|
+
} while (--dig > STRSCAN_MAXDIG);
|
|
210
|
+
dig = STRSCAN_MAXDIG;
|
|
211
|
+
} else { /* Simplify exponent. */
|
|
212
|
+
while (ex10 > 0 && dig <= 18) *xip++ = 0, ex10 -= 2, dig += 2;
|
|
213
|
+
}
|
|
214
|
+
} else { /* Only got zeros. */
|
|
215
|
+
ex10 = 0;
|
|
216
|
+
xi[0] = 0;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* Fast path for numbers in integer format (but handles e.g. 1e6, too). */
|
|
220
|
+
if (dig <= 20 && ex10 == 0) {
|
|
221
|
+
uint8_t *xis;
|
|
222
|
+
uint64_t x = xi[0];
|
|
223
|
+
double n;
|
|
224
|
+
for (xis = xi+1; xis < xip; xis++) x = x * 100 + *xis;
|
|
225
|
+
if (!(dig == 20 && (xi[0] > 18 || (int64_t)x >= 0))) { /* No overflow? */
|
|
226
|
+
/* Format-specific handling. */
|
|
227
|
+
switch (fmt) {
|
|
228
|
+
case STRSCAN_INT:
|
|
229
|
+
if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) {
|
|
230
|
+
o->i = neg ? -(int32_t)x : (int32_t)x;
|
|
231
|
+
return STRSCAN_INT; /* Fast path for 32 bit integers. */
|
|
232
|
+
}
|
|
233
|
+
if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; goto plainnumber; }
|
|
234
|
+
/* fallthrough */
|
|
235
|
+
case STRSCAN_U32:
|
|
236
|
+
if ((x >> 32) != 0) return STRSCAN_ERROR;
|
|
237
|
+
o->i = neg ? -(int32_t)x : (int32_t)x;
|
|
238
|
+
return STRSCAN_U32;
|
|
239
|
+
case STRSCAN_I64:
|
|
240
|
+
case STRSCAN_U64:
|
|
241
|
+
o->u64 = neg ? (uint64_t)-(int64_t)x : x;
|
|
242
|
+
return fmt;
|
|
243
|
+
default:
|
|
244
|
+
plainnumber: /* Fast path for plain numbers < 2^63. */
|
|
245
|
+
if ((int64_t)x < 0) break;
|
|
246
|
+
n = (double)(int64_t)x;
|
|
247
|
+
if (neg) n = -n;
|
|
248
|
+
o->n = n;
|
|
249
|
+
return fmt;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/* Slow non-integer path. */
|
|
255
|
+
if (fmt == STRSCAN_INT) {
|
|
256
|
+
if ((opt & STRSCAN_OPT_C)) return STRSCAN_ERROR;
|
|
257
|
+
fmt = STRSCAN_NUM;
|
|
258
|
+
} else if (fmt > STRSCAN_INT) {
|
|
259
|
+
return STRSCAN_ERROR;
|
|
260
|
+
}
|
|
261
|
+
{
|
|
262
|
+
uint32_t hi = 0, lo = (uint32_t)(xip-xi);
|
|
263
|
+
int32_t ex2 = 0, idig = (int32_t)lo + (ex10 >> 1);
|
|
264
|
+
|
|
265
|
+
lua_assert(lo > 0 && (ex10 & 1) == 0);
|
|
266
|
+
|
|
267
|
+
/* Handle simple overflow/underflow. */
|
|
268
|
+
if (idig > 310/2) { if (neg) setminfV(o); else setpinfV(o); return fmt; }
|
|
269
|
+
else if (idig < -326/2) { o->n = neg ? -0.0 : 0.0; return fmt; }
|
|
270
|
+
|
|
271
|
+
/* Scale up until we have at least 17 or 18 integer part digits. */
|
|
272
|
+
while (idig < 9 && idig < DLEN(lo, hi)) {
|
|
273
|
+
uint32_t i, cy = 0;
|
|
274
|
+
ex2 -= 6;
|
|
275
|
+
for (i = DPREV(lo); ; i = DPREV(i)) {
|
|
276
|
+
uint32_t d = (xi[i] << 6) + cy;
|
|
277
|
+
cy = (((d >> 2) * 5243) >> 17); d = d - cy * 100; /* Div/mod 100. */
|
|
278
|
+
xi[i] = (uint8_t)d;
|
|
279
|
+
if (i == hi) break;
|
|
280
|
+
if (d == 0 && i == DPREV(lo)) lo = i;
|
|
281
|
+
}
|
|
282
|
+
if (cy) {
|
|
283
|
+
hi = DPREV(hi);
|
|
284
|
+
if (xi[DPREV(lo)] == 0) lo = DPREV(lo);
|
|
285
|
+
else if (hi == lo) { lo = DPREV(lo); xi[DPREV(lo)] |= xi[lo]; }
|
|
286
|
+
xi[hi] = (uint8_t)cy; idig++;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* Scale down until no more than 17 or 18 integer part digits remain. */
|
|
291
|
+
while (idig > 9) {
|
|
292
|
+
uint32_t i = hi, cy = 0;
|
|
293
|
+
ex2 += 6;
|
|
294
|
+
do {
|
|
295
|
+
cy += xi[i];
|
|
296
|
+
xi[i] = (cy >> 6);
|
|
297
|
+
cy = 100 * (cy & 0x3f);
|
|
298
|
+
if (xi[i] == 0 && i == hi) hi = DNEXT(hi), idig--;
|
|
299
|
+
i = DNEXT(i);
|
|
300
|
+
} while (i != lo);
|
|
301
|
+
while (cy) {
|
|
302
|
+
if (hi == lo) { xi[DPREV(lo)] |= 1; break; }
|
|
303
|
+
xi[lo] = (cy >> 6); lo = DNEXT(lo);
|
|
304
|
+
cy = 100 * (cy & 0x3f);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* Collect integer part digits and convert to rescaled double. */
|
|
309
|
+
{
|
|
310
|
+
uint64_t x = xi[hi];
|
|
311
|
+
uint32_t i;
|
|
312
|
+
for (i = DNEXT(hi); --idig > 0 && i != lo; i = DNEXT(i))
|
|
313
|
+
x = x * 100 + xi[i];
|
|
314
|
+
if (i == lo) {
|
|
315
|
+
while (--idig >= 0) x = x * 100;
|
|
316
|
+
} else { /* Gather round bit from remaining digits. */
|
|
317
|
+
x <<= 1; ex2--;
|
|
318
|
+
do {
|
|
319
|
+
if (xi[i]) { x |= 1; break; }
|
|
320
|
+
i = DNEXT(i);
|
|
321
|
+
} while (i != lo);
|
|
322
|
+
}
|
|
323
|
+
strscan_double(x, o, ex2, neg);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return fmt;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/* Parse binary number. */
|
|
330
|
+
static StrScanFmt strscan_bin(const uint8_t *p, TValue *o,
|
|
331
|
+
StrScanFmt fmt, uint32_t opt,
|
|
332
|
+
int32_t ex2, int32_t neg, uint32_t dig)
|
|
333
|
+
{
|
|
334
|
+
uint64_t x = 0;
|
|
335
|
+
uint32_t i;
|
|
336
|
+
|
|
337
|
+
if (ex2 || dig > 64) return STRSCAN_ERROR;
|
|
338
|
+
|
|
339
|
+
/* Scan binary digits. */
|
|
340
|
+
for (i = dig; i; i--, p++) {
|
|
341
|
+
if ((*p & ~1) != '0') return STRSCAN_ERROR;
|
|
342
|
+
x = (x << 1) | (*p & 1);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/* Format-specific handling. */
|
|
346
|
+
switch (fmt) {
|
|
347
|
+
case STRSCAN_INT:
|
|
348
|
+
if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) {
|
|
349
|
+
o->i = neg ? -(int32_t)x : (int32_t)x;
|
|
350
|
+
return STRSCAN_INT; /* Fast path for 32 bit integers. */
|
|
351
|
+
}
|
|
352
|
+
if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; break; }
|
|
353
|
+
/* fallthrough */
|
|
354
|
+
case STRSCAN_U32:
|
|
355
|
+
if (dig > 32) return STRSCAN_ERROR;
|
|
356
|
+
o->i = neg ? -(int32_t)x : (int32_t)x;
|
|
357
|
+
return STRSCAN_U32;
|
|
358
|
+
case STRSCAN_I64:
|
|
359
|
+
case STRSCAN_U64:
|
|
360
|
+
o->u64 = neg ? (uint64_t)-(int64_t)x : x;
|
|
361
|
+
return fmt;
|
|
362
|
+
default:
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/* Reduce range, then convert to double. */
|
|
367
|
+
if ((x & U64x(c0000000,0000000))) { x = (x >> 2) | (x & 3); ex2 += 2; }
|
|
368
|
+
strscan_double(x, o, ex2, neg);
|
|
369
|
+
return fmt;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/* Scan string containing a number. Returns format. Returns value in o. */
|
|
373
|
+
StrScanFmt lj_strscan_scan(const uint8_t *p, TValue *o, uint32_t opt)
|
|
374
|
+
{
|
|
375
|
+
int32_t neg = 0;
|
|
376
|
+
|
|
377
|
+
/* Remove leading space, parse sign and non-numbers. */
|
|
378
|
+
if (LJ_UNLIKELY(!lj_char_isdigit(*p))) {
|
|
379
|
+
while (lj_char_isspace(*p)) p++;
|
|
380
|
+
if (*p == '+' || *p == '-') neg = (*p++ == '-');
|
|
381
|
+
if (LJ_UNLIKELY(*p >= 'A')) { /* Parse "inf", "infinity" or "nan". */
|
|
382
|
+
TValue tmp;
|
|
383
|
+
setnanV(&tmp);
|
|
384
|
+
if (casecmp(p[0],'i') && casecmp(p[1],'n') && casecmp(p[2],'f')) {
|
|
385
|
+
if (neg) setminfV(&tmp); else setpinfV(&tmp);
|
|
386
|
+
p += 3;
|
|
387
|
+
if (casecmp(p[0],'i') && casecmp(p[1],'n') && casecmp(p[2],'i') &&
|
|
388
|
+
casecmp(p[3],'t') && casecmp(p[4],'y')) p += 5;
|
|
389
|
+
} else if (casecmp(p[0],'n') && casecmp(p[1],'a') && casecmp(p[2],'n')) {
|
|
390
|
+
p += 3;
|
|
391
|
+
}
|
|
392
|
+
while (lj_char_isspace(*p)) p++;
|
|
393
|
+
if (*p) return STRSCAN_ERROR;
|
|
394
|
+
o->u64 = tmp.u64;
|
|
395
|
+
return STRSCAN_NUM;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/* Parse regular number. */
|
|
400
|
+
{
|
|
401
|
+
StrScanFmt fmt = STRSCAN_INT;
|
|
402
|
+
int cmask = LJ_CHAR_DIGIT;
|
|
403
|
+
int base = (opt & STRSCAN_OPT_C) && *p == '0' ? 0 : 10;
|
|
404
|
+
const uint8_t *sp, *dp = NULL;
|
|
405
|
+
uint32_t dig = 0, hasdig = 0, x = 0;
|
|
406
|
+
int32_t ex = 0;
|
|
407
|
+
|
|
408
|
+
/* Determine base and skip leading zeros. */
|
|
409
|
+
if (LJ_UNLIKELY(*p <= '0')) {
|
|
410
|
+
if (*p == '0') {
|
|
411
|
+
if (casecmp(p[1], 'x'))
|
|
412
|
+
base = 16, cmask = LJ_CHAR_XDIGIT, p += 2;
|
|
413
|
+
else if (casecmp(p[1], 'b'))
|
|
414
|
+
base = 2, cmask = LJ_CHAR_DIGIT, p += 2;
|
|
415
|
+
}
|
|
416
|
+
for ( ; ; p++) {
|
|
417
|
+
if (*p == '0') {
|
|
418
|
+
hasdig = 1;
|
|
419
|
+
} else if (*p == '.') {
|
|
420
|
+
if (dp) return STRSCAN_ERROR;
|
|
421
|
+
dp = p;
|
|
422
|
+
} else {
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/* Preliminary digit and decimal point scan. */
|
|
429
|
+
for (sp = p; ; p++) {
|
|
430
|
+
if (LJ_LIKELY(lj_char_isa(*p, cmask))) {
|
|
431
|
+
x = x * 10 + (*p & 15); /* For fast path below. */
|
|
432
|
+
dig++;
|
|
433
|
+
} else if (*p == '.') {
|
|
434
|
+
if (dp) return STRSCAN_ERROR;
|
|
435
|
+
dp = p;
|
|
436
|
+
} else {
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
if (!(hasdig | dig)) return STRSCAN_ERROR;
|
|
441
|
+
|
|
442
|
+
/* Handle decimal point. */
|
|
443
|
+
if (dp) {
|
|
444
|
+
fmt = STRSCAN_NUM;
|
|
445
|
+
if (dig) {
|
|
446
|
+
ex = (int32_t)(dp-(p-1)); dp = p-1;
|
|
447
|
+
while (ex < 0 && *dp-- == '0') ex++, dig--; /* Skip trailing zeros. */
|
|
448
|
+
if (base == 16) ex *= 4;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/* Parse exponent. */
|
|
453
|
+
if (base >= 10 && casecmp(*p, (uint32_t)(base == 16 ? 'p' : 'e'))) {
|
|
454
|
+
uint32_t xx;
|
|
455
|
+
int negx = 0;
|
|
456
|
+
fmt = STRSCAN_NUM; p++;
|
|
457
|
+
if (*p == '+' || *p == '-') negx = (*p++ == '-');
|
|
458
|
+
if (!lj_char_isdigit(*p)) return STRSCAN_ERROR;
|
|
459
|
+
xx = (*p++ & 15);
|
|
460
|
+
while (lj_char_isdigit(*p)) {
|
|
461
|
+
if (xx < 65536) xx = xx * 10 + (*p & 15);
|
|
462
|
+
p++;
|
|
463
|
+
}
|
|
464
|
+
ex += negx ? -(int32_t)xx : (int32_t)xx;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/* Parse suffix. */
|
|
468
|
+
if (*p) {
|
|
469
|
+
/* I (IMAG), U (U32), LL (I64), ULL/LLU (U64), L (long), UL/LU (ulong). */
|
|
470
|
+
/* NYI: f (float). Not needed until cp_number() handles non-integers. */
|
|
471
|
+
if (casecmp(*p, 'i')) {
|
|
472
|
+
if (!(opt & STRSCAN_OPT_IMAG)) return STRSCAN_ERROR;
|
|
473
|
+
p++; fmt = STRSCAN_IMAG;
|
|
474
|
+
} else if (fmt == STRSCAN_INT) {
|
|
475
|
+
if (casecmp(*p, 'u')) p++, fmt = STRSCAN_U32;
|
|
476
|
+
if (casecmp(*p, 'l')) {
|
|
477
|
+
p++;
|
|
478
|
+
if (casecmp(*p, 'l')) p++, fmt += STRSCAN_I64 - STRSCAN_INT;
|
|
479
|
+
else if (!(opt & STRSCAN_OPT_C)) return STRSCAN_ERROR;
|
|
480
|
+
else if (sizeof(long) == 8) fmt += STRSCAN_I64 - STRSCAN_INT;
|
|
481
|
+
}
|
|
482
|
+
if (casecmp(*p, 'u') && (fmt == STRSCAN_INT || fmt == STRSCAN_I64))
|
|
483
|
+
p++, fmt += STRSCAN_U32 - STRSCAN_INT;
|
|
484
|
+
if ((fmt == STRSCAN_U32 && !(opt & STRSCAN_OPT_C)) ||
|
|
485
|
+
(fmt >= STRSCAN_I64 && !(opt & STRSCAN_OPT_LL)))
|
|
486
|
+
return STRSCAN_ERROR;
|
|
487
|
+
}
|
|
488
|
+
while (lj_char_isspace(*p)) p++;
|
|
489
|
+
if (*p) return STRSCAN_ERROR;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/* Fast path for decimal 32 bit integers. */
|
|
493
|
+
if (fmt == STRSCAN_INT && base == 10 &&
|
|
494
|
+
(dig < 10 || (dig == 10 && *sp <= '2' && x < 0x80000000u+neg))) {
|
|
495
|
+
int32_t y = neg ? -(int32_t)x : (int32_t)x;
|
|
496
|
+
if ((opt & STRSCAN_OPT_TONUM)) {
|
|
497
|
+
o->n = (double)y;
|
|
498
|
+
return STRSCAN_NUM;
|
|
499
|
+
} else {
|
|
500
|
+
o->i = y;
|
|
501
|
+
return STRSCAN_INT;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/* Dispatch to base-specific parser. */
|
|
506
|
+
if (base == 0 && !(fmt == STRSCAN_NUM || fmt == STRSCAN_IMAG))
|
|
507
|
+
return strscan_oct(sp, o, fmt, neg, dig);
|
|
508
|
+
if (base == 16)
|
|
509
|
+
fmt = strscan_hex(sp, o, fmt, opt, ex, neg, dig);
|
|
510
|
+
else if (base == 2)
|
|
511
|
+
fmt = strscan_bin(sp, o, fmt, opt, ex, neg, dig);
|
|
512
|
+
else
|
|
513
|
+
fmt = strscan_dec(sp, o, fmt, opt, ex, neg, dig);
|
|
514
|
+
|
|
515
|
+
/* Try to convert number to integer, if requested. */
|
|
516
|
+
if (fmt == STRSCAN_NUM && (opt & STRSCAN_OPT_TOINT)) {
|
|
517
|
+
double n = o->n;
|
|
518
|
+
int32_t i = lj_num2int(n);
|
|
519
|
+
if (n == (lua_Number)i) { o->i = i; return STRSCAN_INT; }
|
|
520
|
+
}
|
|
521
|
+
return fmt;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
int LJ_FASTCALL lj_strscan_num(GCstr *str, TValue *o)
|
|
526
|
+
{
|
|
527
|
+
StrScanFmt fmt = lj_strscan_scan((const uint8_t *)strdata(str), o,
|
|
528
|
+
STRSCAN_OPT_TONUM);
|
|
529
|
+
lua_assert(fmt == STRSCAN_ERROR || fmt == STRSCAN_NUM);
|
|
530
|
+
return (fmt != STRSCAN_ERROR);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
#if LJ_DUALNUM
|
|
534
|
+
int LJ_FASTCALL lj_strscan_number(GCstr *str, TValue *o)
|
|
535
|
+
{
|
|
536
|
+
StrScanFmt fmt = lj_strscan_scan((const uint8_t *)strdata(str), o,
|
|
537
|
+
STRSCAN_OPT_TOINT);
|
|
538
|
+
lua_assert(fmt == STRSCAN_ERROR || fmt == STRSCAN_NUM || fmt == STRSCAN_INT);
|
|
539
|
+
if (fmt == STRSCAN_INT) setitype(o, LJ_TISNUM);
|
|
540
|
+
return (fmt != STRSCAN_ERROR);
|
|
541
|
+
}
|
|
542
|
+
#endif
|
|
543
|
+
|
|
544
|
+
#undef DNEXT
|
|
545
|
+
#undef DPREV
|
|
546
|
+
#undef DLEN
|
|
547
|
+
|