immunio 1.2.1 → 2.0.2
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/README.md +13 -5
- data/ext/immunio/Rakefile +14 -6
- data/lib/immunio/context.rb +2 -0
- data/lib/immunio/plugins/action_view.rb +7 -668
- data/lib/immunio/plugins/action_view/action_view.rb +22 -0
- data/lib/immunio/plugins/action_view/active_support_hash.rb +29 -0
- data/lib/immunio/plugins/action_view/cache_store.rb +24 -0
- data/lib/immunio/plugins/action_view/erubi.rb +38 -0
- data/lib/immunio/plugins/action_view/erubis.rb +39 -0
- data/lib/immunio/plugins/action_view/fragment_caching.rb +29 -0
- data/lib/immunio/plugins/action_view/haml.rb +46 -0
- data/lib/immunio/plugins/action_view/slim.rb +42 -0
- data/lib/immunio/plugins/action_view/template.rb +431 -0
- data/lib/immunio/plugins/action_view/template_rendering.rb +45 -0
- data/lib/immunio/plugins/http_tracker.rb +2 -0
- data/lib/immunio/plugins/io.rb +34 -0
- data/lib/immunio/version.rb +1 -1
- data/lua-hooks/Makefile +36 -9
- data/lua-hooks/ext/luajit/COPYRIGHT +1 -1
- data/lua-hooks/ext/luajit/Makefile +22 -15
- data/lua-hooks/ext/luajit/README +2 -2
- data/lua-hooks/ext/luajit/doc/bluequad-print.css +1 -1
- data/lua-hooks/ext/luajit/doc/bluequad.css +1 -1
- data/lua-hooks/ext/luajit/doc/changes.html +69 -3
- data/lua-hooks/ext/luajit/doc/contact.html +10 -3
- data/lua-hooks/ext/luajit/doc/ext_c_api.html +2 -2
- data/lua-hooks/ext/luajit/doc/ext_ffi.html +2 -2
- data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +2 -2
- data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +3 -4
- data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +2 -2
- data/lua-hooks/ext/luajit/doc/ext_jit.html +3 -3
- data/lua-hooks/ext/luajit/doc/ext_profiler.html +2 -2
- data/lua-hooks/ext/luajit/doc/extensions.html +47 -20
- data/lua-hooks/ext/luajit/doc/faq.html +2 -2
- data/lua-hooks/ext/luajit/doc/install.html +74 -45
- data/lua-hooks/ext/luajit/doc/luajit.html +5 -5
- data/lua-hooks/ext/luajit/doc/running.html +3 -3
- data/lua-hooks/ext/luajit/doc/status.html +13 -8
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +8 -5
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +66 -11
- data/lua-hooks/ext/luajit/dynasm/dasm_mips64.lua +12 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +5 -1
- data/lua-hooks/ext/luajit/dynasm/dynasm.lua +2 -2
- data/lua-hooks/ext/luajit/etc/luajit.1 +1 -1
- data/lua-hooks/ext/luajit/etc/luajit.pc +1 -1
- data/lua-hooks/ext/luajit/src/Makefile +15 -11
- data/lua-hooks/ext/luajit/src/Makefile.dep +16 -16
- data/lua-hooks/ext/luajit/src/host/buildvm.c +2 -2
- data/lua-hooks/ext/luajit/src/host/buildvm.h +1 -1
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +9 -4
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +2 -2
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +1 -1
- data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +14 -3
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +27 -3
- data/lua-hooks/ext/luajit/src/host/genlibbc.lua +1 -1
- data/lua-hooks/ext/luajit/src/host/genminilua.lua +6 -5
- data/lua-hooks/ext/luajit/src/host/minilua.c +1 -1
- data/lua-hooks/ext/luajit/src/jit/bc.lua +1 -1
- data/lua-hooks/ext/luajit/src/jit/bcsave.lua +8 -8
- data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +2 -2
- data/lua-hooks/ext/luajit/src/jit/dis_arm64.lua +1216 -0
- data/lua-hooks/ext/luajit/src/jit/dis_arm64be.lua +12 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +35 -20
- data/lua-hooks/ext/luajit/src/jit/dis_mips64.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips64el.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +1 -1
- data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +2 -2
- data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +1 -1
- data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +7 -4
- data/lua-hooks/ext/luajit/src/jit/dump.lua +17 -12
- data/lua-hooks/ext/luajit/src/jit/p.lua +3 -2
- data/lua-hooks/ext/luajit/src/jit/v.lua +2 -2
- data/lua-hooks/ext/luajit/src/jit/zone.lua +1 -1
- data/lua-hooks/ext/luajit/src/lauxlib.h +14 -20
- data/lua-hooks/ext/luajit/src/lib_aux.c +38 -27
- data/lua-hooks/ext/luajit/src/lib_base.c +12 -5
- data/lua-hooks/ext/luajit/src/lib_bit.c +1 -1
- data/lua-hooks/ext/luajit/src/lib_debug.c +5 -5
- data/lua-hooks/ext/luajit/src/lib_ffi.c +2 -2
- data/lua-hooks/ext/luajit/src/lib_init.c +16 -16
- data/lua-hooks/ext/luajit/src/lib_io.c +6 -7
- data/lua-hooks/ext/luajit/src/lib_jit.c +14 -4
- data/lua-hooks/ext/luajit/src/lib_math.c +1 -5
- data/lua-hooks/ext/luajit/src/lib_os.c +1 -1
- data/lua-hooks/ext/luajit/src/lib_package.c +14 -23
- data/lua-hooks/ext/luajit/src/lib_string.c +1 -5
- data/lua-hooks/ext/luajit/src/lib_table.c +21 -1
- data/lua-hooks/ext/luajit/src/lj.supp +3 -3
- data/lua-hooks/ext/luajit/src/lj_alloc.c +174 -83
- data/lua-hooks/ext/luajit/src/lj_api.c +97 -18
- data/lua-hooks/ext/luajit/src/lj_arch.h +54 -22
- data/lua-hooks/ext/luajit/src/lj_asm.c +172 -53
- data/lua-hooks/ext/luajit/src/lj_asm.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_asm_arm.h +19 -16
- data/lua-hooks/ext/luajit/src/lj_asm_arm64.h +2022 -0
- data/lua-hooks/ext/luajit/src/lj_asm_mips.h +564 -158
- data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +19 -18
- data/lua-hooks/ext/luajit/src/lj_asm_x86.h +578 -92
- data/lua-hooks/ext/luajit/src/lj_bc.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_bc.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_bcdump.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_bcread.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_bcwrite.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_buf.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_buf.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_carith.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_carith.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ccall.c +172 -7
- data/lua-hooks/ext/luajit/src/lj_ccall.h +21 -5
- data/lua-hooks/ext/luajit/src/lj_ccallback.c +71 -17
- data/lua-hooks/ext/luajit/src/lj_ccallback.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_cconv.c +4 -2
- data/lua-hooks/ext/luajit/src/lj_cconv.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_cdata.c +7 -5
- data/lua-hooks/ext/luajit/src/lj_cdata.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_clib.c +5 -5
- data/lua-hooks/ext/luajit/src/lj_clib.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_cparse.c +11 -6
- data/lua-hooks/ext/luajit/src/lj_cparse.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_crecord.c +70 -14
- data/lua-hooks/ext/luajit/src/lj_crecord.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ctype.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_ctype.h +8 -8
- data/lua-hooks/ext/luajit/src/lj_debug.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_debug.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_def.h +6 -9
- data/lua-hooks/ext/luajit/src/lj_dispatch.c +3 -3
- data/lua-hooks/ext/luajit/src/lj_dispatch.h +2 -1
- data/lua-hooks/ext/luajit/src/lj_emit_arm.h +5 -4
- data/lua-hooks/ext/luajit/src/lj_emit_arm64.h +419 -0
- data/lua-hooks/ext/luajit/src/lj_emit_mips.h +100 -20
- data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +4 -4
- data/lua-hooks/ext/luajit/src/lj_emit_x86.h +116 -25
- data/lua-hooks/ext/luajit/src/lj_err.c +34 -13
- data/lua-hooks/ext/luajit/src/lj_err.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_errmsg.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ff.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ffrecord.c +58 -49
- data/lua-hooks/ext/luajit/src/lj_ffrecord.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_frame.h +33 -6
- data/lua-hooks/ext/luajit/src/lj_func.c +4 -2
- data/lua-hooks/ext/luajit/src/lj_func.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_gc.c +16 -7
- data/lua-hooks/ext/luajit/src/lj_gc.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_gdbjit.c +31 -1
- data/lua-hooks/ext/luajit/src/lj_gdbjit.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ir.c +69 -96
- data/lua-hooks/ext/luajit/src/lj_ir.h +29 -18
- data/lua-hooks/ext/luajit/src/lj_ircall.h +24 -30
- data/lua-hooks/ext/luajit/src/lj_iropt.h +9 -9
- data/lua-hooks/ext/luajit/src/lj_jit.h +67 -9
- data/lua-hooks/ext/luajit/src/lj_lex.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_lex.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_lib.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_lib.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_load.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_mcode.c +11 -10
- data/lua-hooks/ext/luajit/src/lj_mcode.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_meta.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_meta.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_obj.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_obj.h +7 -3
- data/lua-hooks/ext/luajit/src/lj_opt_dce.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_opt_fold.c +84 -17
- data/lua-hooks/ext/luajit/src/lj_opt_loop.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_opt_mem.c +3 -3
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +24 -22
- data/lua-hooks/ext/luajit/src/lj_opt_sink.c +11 -6
- data/lua-hooks/ext/luajit/src/lj_opt_split.c +11 -2
- data/lua-hooks/ext/luajit/src/lj_parse.c +9 -7
- data/lua-hooks/ext/luajit/src/lj_parse.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_profile.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_profile.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_record.c +201 -117
- data/lua-hooks/ext/luajit/src/lj_record.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_snap.c +72 -26
- data/lua-hooks/ext/luajit/src/lj_snap.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_state.c +6 -6
- data/lua-hooks/ext/luajit/src/lj_state.h +2 -2
- data/lua-hooks/ext/luajit/src/lj_str.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_str.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_strfmt.c +7 -3
- data/lua-hooks/ext/luajit/src/lj_strfmt.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_strfmt_num.c +4 -3
- data/lua-hooks/ext/luajit/src/lj_strscan.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_strscan.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_tab.c +1 -2
- data/lua-hooks/ext/luajit/src/lj_tab.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_target.h +3 -3
- data/lua-hooks/ext/luajit/src/lj_target_arm.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_target_arm64.h +239 -7
- data/lua-hooks/ext/luajit/src/lj_target_mips.h +111 -22
- data/lua-hooks/ext/luajit/src/lj_target_ppc.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_target_x86.h +21 -4
- data/lua-hooks/ext/luajit/src/lj_trace.c +63 -18
- data/lua-hooks/ext/luajit/src/lj_trace.h +2 -1
- data/lua-hooks/ext/luajit/src/lj_traceerr.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_udata.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_udata.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_vm.h +5 -1
- data/lua-hooks/ext/luajit/src/lj_vmevent.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_vmevent.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_vmmath.c +1 -1
- data/lua-hooks/ext/luajit/src/ljamalg.c +1 -1
- data/lua-hooks/ext/luajit/src/lua.h +9 -1
- data/lua-hooks/ext/luajit/src/luaconf.h +3 -7
- data/lua-hooks/ext/luajit/src/luajit.c +69 -54
- data/lua-hooks/ext/luajit/src/luajit.h +4 -4
- data/lua-hooks/ext/luajit/src/lualib.h +1 -1
- data/lua-hooks/ext/luajit/src/msvcbuild.bat +12 -4
- data/lua-hooks/ext/luajit/src/vm_arm.dasc +1 -1
- data/lua-hooks/ext/luajit/src/vm_arm64.dasc +255 -32
- data/lua-hooks/ext/luajit/src/vm_mips.dasc +26 -23
- data/lua-hooks/ext/luajit/src/vm_mips64.dasc +5062 -0
- data/lua-hooks/ext/luajit/src/vm_ppc.dasc +1 -1
- data/lua-hooks/ext/luajit/src/vm_x64.dasc +24 -25
- data/lua-hooks/ext/luajit/src/vm_x86.dasc +77 -4
- data/lua-hooks/libluahooks.darwin.a +0 -0
- data/lua-hooks/libluahooks.linux.a +0 -0
- data/lua-hooks/options.mk +1 -1
- metadata +37 -77
- data/lua-hooks/ext/all.c +0 -69
- data/lua-hooks/ext/libinjection/COPYING +0 -37
- data/lua-hooks/ext/libinjection/libinjection.h +0 -65
- data/lua-hooks/ext/libinjection/libinjection_html5.c +0 -847
- data/lua-hooks/ext/libinjection/libinjection_html5.h +0 -54
- data/lua-hooks/ext/libinjection/libinjection_sqli.c +0 -2301
- data/lua-hooks/ext/libinjection/libinjection_sqli.h +0 -295
- data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +0 -9349
- data/lua-hooks/ext/libinjection/libinjection_xss.c +0 -531
- data/lua-hooks/ext/libinjection/libinjection_xss.h +0 -21
- data/lua-hooks/ext/libinjection/lualib.c +0 -145
- data/lua-hooks/ext/libinjection/module.mk +0 -5
- data/lua-hooks/ext/lpeg/HISTORY +0 -96
- data/lua-hooks/ext/lpeg/lpcap.c +0 -537
- data/lua-hooks/ext/lpeg/lpcap.h +0 -56
- data/lua-hooks/ext/lpeg/lpcode.c +0 -1014
- data/lua-hooks/ext/lpeg/lpcode.h +0 -40
- data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
- data/lua-hooks/ext/lpeg/lpeg.html +0 -1445
- data/lua-hooks/ext/lpeg/lpprint.c +0 -244
- data/lua-hooks/ext/lpeg/lpprint.h +0 -36
- data/lua-hooks/ext/lpeg/lptree.c +0 -1303
- data/lua-hooks/ext/lpeg/lptree.h +0 -82
- data/lua-hooks/ext/lpeg/lptypes.h +0 -149
- data/lua-hooks/ext/lpeg/lpvm.c +0 -364
- data/lua-hooks/ext/lpeg/lpvm.h +0 -58
- data/lua-hooks/ext/lpeg/makefile +0 -55
- data/lua-hooks/ext/lpeg/module.mk +0 -6
- data/lua-hooks/ext/lpeg/re.html +0 -498
- data/lua-hooks/ext/lua-cmsgpack/.gitignore +0 -13
- data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +0 -45
- data/lua-hooks/ext/lua-cmsgpack/README.md +0 -115
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +0 -970
- data/lua-hooks/ext/lua-cmsgpack/module.mk +0 -2
- data/lua-hooks/ext/lua-cmsgpack/test.lua +0 -570
- data/lua-hooks/ext/lua-snapshot/LICENSE +0 -7
- data/lua-hooks/ext/lua-snapshot/Makefile +0 -12
- data/lua-hooks/ext/lua-snapshot/README.md +0 -18
- data/lua-hooks/ext/lua-snapshot/dump.lua +0 -15
- data/lua-hooks/ext/lua-snapshot/module.mk +0 -2
- data/lua-hooks/ext/lua-snapshot/snapshot.c +0 -462
- data/lua-hooks/ext/luautf8/README.md +0 -152
- data/lua-hooks/ext/luautf8/lutf8lib.c +0 -1274
- data/lua-hooks/ext/luautf8/module.mk +0 -2
- data/lua-hooks/ext/luautf8/unidata.h +0 -3064
- data/lua-hooks/ext/module.mk +0 -15
- data/lua-hooks/ext/modules.h +0 -17
- data/lua-hooks/ext/perf/luacpu.c +0 -114
- data/lua-hooks/ext/perf/lualoadavg.c +0 -40
- data/lua-hooks/ext/perf/luameminfo.c +0 -38
- data/lua-hooks/ext/perf/luaoslib.c +0 -203
- data/lua-hooks/ext/perf/module.mk +0 -5
- data/lua-hooks/ext/sha1/luasha1.c +0 -74
- data/lua-hooks/ext/sha1/module.mk +0 -5
- data/lua-hooks/ext/sha1/sha1.c +0 -145
- data/lua-hooks/ext/sha2/luasha256.c +0 -77
- data/lua-hooks/ext/sha2/module.mk +0 -5
- data/lua-hooks/ext/sha2/sha256.c +0 -196
- data/lua-hooks/ext/sysutils/lua_utils.c +0 -56
- data/lua-hooks/ext/sysutils/module.mk +0 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
** Error handling.
|
|
3
|
-
** Copyright (C) 2005-
|
|
3
|
+
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
#define lj_err_c
|
|
@@ -46,7 +46,8 @@
|
|
|
46
46
|
** the wrapper function feature. Lua errors thrown through C++ frames
|
|
47
47
|
** cannot be caught by C++ code and C++ destructors are not run.
|
|
48
48
|
**
|
|
49
|
-
** EXT is the default on x64 systems, INT is the default on all
|
|
49
|
+
** EXT is the default on x64 systems and on Windows, INT is the default on all
|
|
50
|
+
** other systems.
|
|
50
51
|
**
|
|
51
52
|
** EXT can be manually enabled on POSIX systems using GCC and DWARF2 stack
|
|
52
53
|
** unwinding with -DLUAJIT_UNWIND_EXTERNAL. *All* C code must be compiled
|
|
@@ -55,7 +56,6 @@
|
|
|
55
56
|
** and all C libraries that have callbacks which may be used to call back
|
|
56
57
|
** into Lua. C++ code must *not* be compiled with -fno-exceptions.
|
|
57
58
|
**
|
|
58
|
-
** EXT cannot be enabled on WIN32 since system exceptions use code-driven SEH.
|
|
59
59
|
** EXT is mandatory on WIN64 since the calling convention has an abundance
|
|
60
60
|
** of callee-saved registers (rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15).
|
|
61
61
|
** The POSIX/x64 interpreter only saves r12/r13 for INT (e.g. PS4).
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
|
|
64
64
|
#if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) && !LJ_NO_UNWIND
|
|
65
65
|
#define LJ_UNWIND_EXT 1
|
|
66
|
-
#elif
|
|
66
|
+
#elif LJ_TARGET_WINDOWS
|
|
67
67
|
#define LJ_UNWIND_EXT 1
|
|
68
68
|
#endif
|
|
69
69
|
|
|
@@ -310,7 +310,6 @@ static void err_raise_ext(int errcode)
|
|
|
310
310
|
#define _US_FORCE_UNWIND 8
|
|
311
311
|
|
|
312
312
|
typedef struct _Unwind_Control_Block _Unwind_Control_Block;
|
|
313
|
-
typedef struct _Unwind_Context _Unwind_Context;
|
|
314
313
|
|
|
315
314
|
struct _Unwind_Control_Block {
|
|
316
315
|
uint64_t exclass;
|
|
@@ -385,7 +384,7 @@ static void err_raise_ext(int errcode)
|
|
|
385
384
|
|
|
386
385
|
#endif /* LJ_TARGET_ARM */
|
|
387
386
|
|
|
388
|
-
#elif
|
|
387
|
+
#elif LJ_ABI_WIN
|
|
389
388
|
|
|
390
389
|
/*
|
|
391
390
|
** Someone in Redmond owes me several days of my life. A lot of this is
|
|
@@ -403,6 +402,7 @@ static void err_raise_ext(int errcode)
|
|
|
403
402
|
#define WIN32_LEAN_AND_MEAN
|
|
404
403
|
#include <windows.h>
|
|
405
404
|
|
|
405
|
+
#if LJ_TARGET_X64
|
|
406
406
|
/* Taken from: http://www.nynaeve.net/?p=99 */
|
|
407
407
|
typedef struct UndocumentedDispatcherContext {
|
|
408
408
|
ULONG64 ControlPc;
|
|
@@ -417,11 +417,14 @@ typedef struct UndocumentedDispatcherContext {
|
|
|
417
417
|
ULONG ScopeIndex;
|
|
418
418
|
ULONG Fill0;
|
|
419
419
|
} UndocumentedDispatcherContext;
|
|
420
|
+
#else
|
|
421
|
+
typedef void *UndocumentedDispatcherContext;
|
|
422
|
+
#endif
|
|
420
423
|
|
|
421
424
|
/* Another wild guess. */
|
|
422
425
|
extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);
|
|
423
426
|
|
|
424
|
-
#
|
|
427
|
+
#if LJ_TARGET_X64 && defined(MINGW_SDK_INIT)
|
|
425
428
|
/* Workaround for broken MinGW64 declaration. */
|
|
426
429
|
VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");
|
|
427
430
|
#define RtlUnwindEx RtlUnwindEx_FIXED
|
|
@@ -435,10 +438,15 @@ VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");
|
|
|
435
438
|
#define LJ_EXCODE_CHECK(cl) (((cl) ^ LJ_EXCODE) <= 0xff)
|
|
436
439
|
#define LJ_EXCODE_ERRCODE(cl) ((int)((cl) & 0xff))
|
|
437
440
|
|
|
438
|
-
/*
|
|
439
|
-
LJ_FUNCA
|
|
440
|
-
void *
|
|
441
|
+
/* Windows exception handler for interpreter frame. */
|
|
442
|
+
LJ_FUNCA int lj_err_unwind_win(EXCEPTION_RECORD *rec,
|
|
443
|
+
void *f, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch)
|
|
441
444
|
{
|
|
445
|
+
#if LJ_TARGET_X64
|
|
446
|
+
void *cf = f;
|
|
447
|
+
#else
|
|
448
|
+
void *cf = (char *)f - CFRAME_OFS_SEH;
|
|
449
|
+
#endif
|
|
442
450
|
lua_State *L = cframe_L(cf);
|
|
443
451
|
int errcode = LJ_EXCODE_CHECK(rec->ExceptionCode) ?
|
|
444
452
|
LJ_EXCODE_ERRCODE(rec->ExceptionCode) : LUA_ERRRUN;
|
|
@@ -456,8 +464,9 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
|
|
|
456
464
|
setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));
|
|
457
465
|
} else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) {
|
|
458
466
|
/* Don't catch access violations etc. */
|
|
459
|
-
return ExceptionContinueSearch
|
|
467
|
+
return 1; /* ExceptionContinueSearch */
|
|
460
468
|
}
|
|
469
|
+
#if LJ_TARGET_X64
|
|
461
470
|
/* Unwind the stack and call all handlers for all lower C frames
|
|
462
471
|
** (including ourselves) again with EH_UNWINDING set. Then set
|
|
463
472
|
** rsp = cf, rax = errcode and jump to the specified target.
|
|
@@ -467,9 +476,21 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
|
|
|
467
476
|
lj_vm_unwind_c_eh),
|
|
468
477
|
rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable);
|
|
469
478
|
/* RtlUnwindEx should never return. */
|
|
479
|
+
#else
|
|
480
|
+
UNUSED(ctx);
|
|
481
|
+
UNUSED(dispatch);
|
|
482
|
+
/* Call all handlers for all lower C frames (including ourselves) again
|
|
483
|
+
** with EH_UNWINDING set. Then call the specified function, passing cf
|
|
484
|
+
** and errcode.
|
|
485
|
+
*/
|
|
486
|
+
lj_vm_rtlunwind(cf, (void *)rec,
|
|
487
|
+
(cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ?
|
|
488
|
+
(void *)lj_vm_unwind_ff : (void *)lj_vm_unwind_c, errcode);
|
|
489
|
+
/* lj_vm_rtlunwind does not return. */
|
|
490
|
+
#endif
|
|
470
491
|
}
|
|
471
492
|
}
|
|
472
|
-
return ExceptionContinueSearch
|
|
493
|
+
return 1; /* ExceptionContinueSearch */
|
|
473
494
|
}
|
|
474
495
|
|
|
475
496
|
/* Raise Windows exception. */
|
|
@@ -488,7 +509,7 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode)
|
|
|
488
509
|
global_State *g = G(L);
|
|
489
510
|
lj_trace_abort(g);
|
|
490
511
|
setmref(g->jit_base, NULL);
|
|
491
|
-
L->status =
|
|
512
|
+
L->status = LUA_OK;
|
|
492
513
|
#if LJ_UNWIND_EXT
|
|
493
514
|
err_raise_ext(errcode);
|
|
494
515
|
/*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
** Fast function call recorder.
|
|
3
|
-
** Copyright (C) 2005-
|
|
3
|
+
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
#define lj_ffrecord_c
|
|
@@ -102,42 +102,41 @@ static void recff_stitch(jit_State *J)
|
|
|
102
102
|
ASMFunction cont = lj_cont_stitch;
|
|
103
103
|
lua_State *L = J->L;
|
|
104
104
|
TValue *base = L->base;
|
|
105
|
+
BCReg nslot = J->maxslot + 1 + LJ_FR2;
|
|
106
|
+
TValue *nframe = base + 1 + LJ_FR2;
|
|
105
107
|
const BCIns *pc = frame_pc(base-1);
|
|
106
108
|
TValue *pframe = frame_prevl(base-1);
|
|
107
|
-
TRef trcont;
|
|
108
109
|
|
|
109
|
-
lua_assert(!LJ_FR2); /* TODO_FR2: handle frame shift. */
|
|
110
110
|
/* Move func + args up in Lua stack and insert continuation. */
|
|
111
|
-
memmove(&base[1], &base[-1], sizeof(TValue)*
|
|
112
|
-
setframe_ftsz(
|
|
113
|
-
setcont(base, cont);
|
|
111
|
+
memmove(&base[1], &base[-1-LJ_FR2], sizeof(TValue)*nslot);
|
|
112
|
+
setframe_ftsz(nframe, ((char *)nframe - (char *)pframe) + FRAME_CONT);
|
|
113
|
+
setcont(base-LJ_FR2, cont);
|
|
114
114
|
setframe_pc(base, pc);
|
|
115
|
-
setnilV(base-1); /* Incorrect, but rec_check_slots() won't run anymore. */
|
|
116
|
-
L->base += 2;
|
|
117
|
-
L->top += 2;
|
|
115
|
+
setnilV(base-1-LJ_FR2); /* Incorrect, but rec_check_slots() won't run anymore. */
|
|
116
|
+
L->base += 2 + LJ_FR2;
|
|
117
|
+
L->top += 2 + LJ_FR2;
|
|
118
118
|
|
|
119
119
|
/* Ditto for the IR. */
|
|
120
|
-
memmove(&J->base[1], &J->base[-1], sizeof(TRef)*
|
|
121
|
-
#if
|
|
122
|
-
|
|
120
|
+
memmove(&J->base[1], &J->base[-1-LJ_FR2], sizeof(TRef)*nslot);
|
|
121
|
+
#if LJ_FR2
|
|
122
|
+
J->base[2] = TREF_FRAME;
|
|
123
|
+
J->base[-1] = lj_ir_k64(J, IR_KNUM, u64ptr(contptr(cont)));
|
|
124
|
+
J->base[0] = lj_ir_k64(J, IR_KNUM, u64ptr(pc)) | TREF_CONT;
|
|
123
125
|
#else
|
|
124
|
-
|
|
126
|
+
J->base[0] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;
|
|
125
127
|
#endif
|
|
126
|
-
J->base[
|
|
127
|
-
J->
|
|
128
|
-
|
|
129
|
-
J->base[-1] = emitir(IRT(IR_XLOAD, IRT_P64), lj_ir_kptr(J, &J->ktracep->gcr), 0);
|
|
130
|
-
J->base += 2;
|
|
131
|
-
J->baseslot += 2;
|
|
128
|
+
J->ktrace = tref_ref((J->base[-1-LJ_FR2] = lj_ir_ktrace(J)));
|
|
129
|
+
J->base += 2 + LJ_FR2;
|
|
130
|
+
J->baseslot += 2 + LJ_FR2;
|
|
132
131
|
J->framedepth++;
|
|
133
132
|
|
|
134
133
|
lj_record_stop(J, LJ_TRLINK_STITCH, 0);
|
|
135
134
|
|
|
136
135
|
/* Undo Lua stack changes. */
|
|
137
|
-
memmove(&base[-1], &base[1], sizeof(TValue)*
|
|
136
|
+
memmove(&base[-1-LJ_FR2], &base[1], sizeof(TValue)*nslot);
|
|
138
137
|
setframe_pc(base-1, pc);
|
|
139
|
-
L->base -= 2;
|
|
140
|
-
L->top -= 2;
|
|
138
|
+
L->base -= 2 + LJ_FR2;
|
|
139
|
+
L->top -= 2 + LJ_FR2;
|
|
141
140
|
}
|
|
142
141
|
|
|
143
142
|
/* Fallback handler for fast functions that are not recorded (yet). */
|
|
@@ -179,7 +178,7 @@ static void LJ_FASTCALL recff_nyi(jit_State *J, RecordFFData *rd)
|
|
|
179
178
|
/* Emit BUFHDR for the global temporary buffer. */
|
|
180
179
|
static TRef recff_bufhdr(jit_State *J)
|
|
181
180
|
{
|
|
182
|
-
return emitir(IRT(IR_BUFHDR,
|
|
181
|
+
return emitir(IRT(IR_BUFHDR, IRT_PGC),
|
|
183
182
|
lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
|
|
184
183
|
}
|
|
185
184
|
|
|
@@ -229,7 +228,7 @@ static void LJ_FASTCALL recff_setmetatable(jit_State *J, RecordFFData *rd)
|
|
|
229
228
|
ix.tab = tr;
|
|
230
229
|
copyTV(J->L, &ix.tabv, &rd->argv[0]);
|
|
231
230
|
lj_record_mm_lookup(J, &ix, MM_metatable); /* Guard for no __metatable. */
|
|
232
|
-
fref = emitir(IRT(IR_FREF,
|
|
231
|
+
fref = emitir(IRT(IR_FREF, IRT_PGC), tr, IRFL_TAB_META);
|
|
233
232
|
mtref = tref_isnil(mt) ? lj_ir_knull(J, IRT_TAB) : mt;
|
|
234
233
|
emitir(IRT(IR_FSTORE, IRT_TAB), fref, mtref);
|
|
235
234
|
if (!tref_isnil(mt))
|
|
@@ -295,7 +294,7 @@ int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv)
|
|
|
295
294
|
if (strV(tv)->len == 1) {
|
|
296
295
|
emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, strV(tv)));
|
|
297
296
|
} else {
|
|
298
|
-
TRef trptr = emitir(IRT(IR_STRREF,
|
|
297
|
+
TRef trptr = emitir(IRT(IR_STRREF, IRT_PGC), tr, lj_ir_kint(J, 0));
|
|
299
298
|
TRef trchar = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY);
|
|
300
299
|
emitir(IRTG(IR_EQ, IRT_INT), trchar, lj_ir_kint(J, '#'));
|
|
301
300
|
}
|
|
@@ -380,10 +379,10 @@ static int recff_metacall(jit_State *J, RecordFFData *rd, MMS mm)
|
|
|
380
379
|
int errcode;
|
|
381
380
|
TValue argv0;
|
|
382
381
|
/* Temporarily insert metamethod below object. */
|
|
383
|
-
J->base[1] = J->base[0];
|
|
382
|
+
J->base[1+LJ_FR2] = J->base[0];
|
|
384
383
|
J->base[0] = ix.mobj;
|
|
385
384
|
copyTV(J->L, &argv0, &rd->argv[0]);
|
|
386
|
-
copyTV(J->L, &rd->argv[1], &rd->argv[0]);
|
|
385
|
+
copyTV(J->L, &rd->argv[1+LJ_FR2], &rd->argv[0]);
|
|
387
386
|
copyTV(J->L, &rd->argv[0], &ix.mobjv);
|
|
388
387
|
/* Need to protect lj_record_tailcall because it may throw. */
|
|
389
388
|
errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp);
|
|
@@ -450,6 +449,10 @@ static void LJ_FASTCALL recff_xpairs(jit_State *J, RecordFFData *rd)
|
|
|
450
449
|
static void LJ_FASTCALL recff_pcall(jit_State *J, RecordFFData *rd)
|
|
451
450
|
{
|
|
452
451
|
if (J->maxslot >= 1) {
|
|
452
|
+
#if LJ_FR2
|
|
453
|
+
/* Shift function arguments up. */
|
|
454
|
+
memmove(J->base + 1, J->base, sizeof(TRef) * J->maxslot);
|
|
455
|
+
#endif
|
|
453
456
|
lj_record_call(J, 0, J->maxslot - 1);
|
|
454
457
|
rd->nres = -1; /* Pending call. */
|
|
455
458
|
} /* else: Interpreter will throw. */
|
|
@@ -469,13 +472,16 @@ static void LJ_FASTCALL recff_xpcall(jit_State *J, RecordFFData *rd)
|
|
|
469
472
|
TValue argv0, argv1;
|
|
470
473
|
TRef tmp;
|
|
471
474
|
int errcode;
|
|
472
|
-
lua_assert(!LJ_FR2); /* TODO_FR2: handle different frame setup. */
|
|
473
475
|
/* Swap function and traceback. */
|
|
474
476
|
tmp = J->base[0]; J->base[0] = J->base[1]; J->base[1] = tmp;
|
|
475
477
|
copyTV(J->L, &argv0, &rd->argv[0]);
|
|
476
478
|
copyTV(J->L, &argv1, &rd->argv[1]);
|
|
477
479
|
copyTV(J->L, &rd->argv[0], &argv1);
|
|
478
480
|
copyTV(J->L, &rd->argv[1], &argv0);
|
|
481
|
+
#if LJ_FR2
|
|
482
|
+
/* Shift function arguments up. */
|
|
483
|
+
memmove(J->base + 2, J->base + 1, sizeof(TRef) * (J->maxslot-1));
|
|
484
|
+
#endif
|
|
479
485
|
/* Need to protect lj_record_call because it may throw. */
|
|
480
486
|
errcode = lj_vm_cpcall(J->L, NULL, J, recff_xpcall_cp);
|
|
481
487
|
/* Always undo Lua stack swap to avoid confusing the interpreter. */
|
|
@@ -504,7 +510,7 @@ static void LJ_FASTCALL recff_getfenv(jit_State *J, RecordFFData *rd)
|
|
|
504
510
|
static void LJ_FASTCALL recff_math_abs(jit_State *J, RecordFFData *rd)
|
|
505
511
|
{
|
|
506
512
|
TRef tr = lj_ir_tonum(J, J->base[0]);
|
|
507
|
-
J->base[0] = emitir(IRTN(IR_ABS), tr,
|
|
513
|
+
J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_ksimd(J, LJ_KSIMD_ABS));
|
|
508
514
|
UNUSED(rd);
|
|
509
515
|
}
|
|
510
516
|
|
|
@@ -613,10 +619,8 @@ static void LJ_FASTCALL recff_math_modf(jit_State *J, RecordFFData *rd)
|
|
|
613
619
|
|
|
614
620
|
static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd)
|
|
615
621
|
{
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
lj_trace_err(J, LJ_TRERR_BADTYPE);
|
|
619
|
-
J->base[0] = lj_opt_narrow_pow(J, tr, J->base[1], &rd->argv[1]);
|
|
622
|
+
J->base[0] = lj_opt_narrow_pow(J, J->base[0], J->base[1],
|
|
623
|
+
&rd->argv[0], &rd->argv[1]);
|
|
620
624
|
UNUSED(rd);
|
|
621
625
|
}
|
|
622
626
|
|
|
@@ -822,7 +826,7 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
|
|
|
822
826
|
/* Also handle empty range here, to avoid extra traces. */
|
|
823
827
|
TRef trptr, trslen = emitir(IRTI(IR_SUB), trend, trstart);
|
|
824
828
|
emitir(IRTGI(IR_GE), trslen, tr0);
|
|
825
|
-
trptr = emitir(IRT(IR_STRREF,
|
|
829
|
+
trptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
|
|
826
830
|
J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, trslen);
|
|
827
831
|
} else { /* Range underflow: return empty string. */
|
|
828
832
|
emitir(IRTGI(IR_LT), trend, trstart);
|
|
@@ -838,7 +842,7 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
|
|
|
838
842
|
rd->nres = len;
|
|
839
843
|
for (i = 0; i < len; i++) {
|
|
840
844
|
TRef tmp = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, (int32_t)i));
|
|
841
|
-
tmp = emitir(IRT(IR_STRREF,
|
|
845
|
+
tmp = emitir(IRT(IR_STRREF, IRT_PGC), trstr, tmp);
|
|
842
846
|
J->base[i] = emitir(IRT(IR_XLOAD, IRT_U8), tmp, IRXLOAD_READONLY);
|
|
843
847
|
}
|
|
844
848
|
} else { /* Empty range or range underflow: return no results. */
|
|
@@ -860,7 +864,7 @@ static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd)
|
|
|
860
864
|
if (i > 1) { /* Concatenate the strings, if there's more than one. */
|
|
861
865
|
TRef hdr = recff_bufhdr(J), tr = hdr;
|
|
862
866
|
for (i = 0; J->base[i] != 0; i++)
|
|
863
|
-
tr = emitir(IRT(IR_BUFPUT,
|
|
867
|
+
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, J->base[i]);
|
|
864
868
|
J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
|
|
865
869
|
}
|
|
866
870
|
UNUSED(rd);
|
|
@@ -877,14 +881,14 @@ static void LJ_FASTCALL recff_string_rep(jit_State *J, RecordFFData *rd)
|
|
|
877
881
|
emitir(IRTGI(vrep > 1 ? IR_GT : IR_LE), rep, lj_ir_kint(J, 1));
|
|
878
882
|
if (vrep > 1) {
|
|
879
883
|
TRef hdr2 = recff_bufhdr(J);
|
|
880
|
-
TRef tr2 = emitir(IRT(IR_BUFPUT,
|
|
881
|
-
tr2 = emitir(IRT(IR_BUFPUT,
|
|
884
|
+
TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), hdr2, sep);
|
|
885
|
+
tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), tr2, str);
|
|
882
886
|
str2 = emitir(IRT(IR_BUFSTR, IRT_STR), tr2, hdr2);
|
|
883
887
|
}
|
|
884
888
|
}
|
|
885
889
|
tr = hdr = recff_bufhdr(J);
|
|
886
890
|
if (str2) {
|
|
887
|
-
tr = emitir(IRT(IR_BUFPUT,
|
|
891
|
+
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, str);
|
|
888
892
|
str = str2;
|
|
889
893
|
rep = emitir(IRTI(IR_ADD), rep, lj_ir_kint(J, -1));
|
|
890
894
|
}
|
|
@@ -935,8 +939,8 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
|
|
|
935
939
|
if ((J->base[2] && tref_istruecond(J->base[3])) ||
|
|
936
940
|
(emitir(IRTG(IR_EQ, IRT_STR), trpat, lj_ir_kstr(J, pat)),
|
|
937
941
|
!lj_str_haspattern(pat))) { /* Search for fixed string. */
|
|
938
|
-
TRef trsptr = emitir(IRT(IR_STRREF,
|
|
939
|
-
TRef trpptr = emitir(IRT(IR_STRREF,
|
|
942
|
+
TRef trsptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
|
|
943
|
+
TRef trpptr = emitir(IRT(IR_STRREF, IRT_PGC), trpat, tr0);
|
|
940
944
|
TRef trslen = emitir(IRTI(IR_SUB), trlen, trstart);
|
|
941
945
|
TRef trplen = emitir(IRTI(IR_FLOAD), trpat, IRFL_STR_LEN);
|
|
942
946
|
TRef tr = lj_ir_call(J, IRCALL_lj_str_find, trsptr, trpptr, trslen, trplen);
|
|
@@ -944,13 +948,13 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
|
|
|
944
948
|
if (lj_str_find(strdata(str)+(MSize)start, strdata(pat),
|
|
945
949
|
str->len-(MSize)start, pat->len)) {
|
|
946
950
|
TRef pos;
|
|
947
|
-
emitir(IRTG(IR_NE,
|
|
948
|
-
pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF,
|
|
951
|
+
emitir(IRTG(IR_NE, IRT_PGC), tr, trp0);
|
|
952
|
+
pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_PGC), trstr, tr0));
|
|
949
953
|
J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1));
|
|
950
954
|
J->base[1] = emitir(IRTI(IR_ADD), pos, trplen);
|
|
951
955
|
rd->nres = 2;
|
|
952
956
|
} else {
|
|
953
|
-
emitir(IRTG(IR_EQ,
|
|
957
|
+
emitir(IRTG(IR_EQ, IRT_PGC), tr, trp0);
|
|
954
958
|
J->base[0] = TREF_NIL;
|
|
955
959
|
}
|
|
956
960
|
} else { /* Search for pattern. */
|
|
@@ -977,7 +981,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
|
|
|
977
981
|
IRCallID id;
|
|
978
982
|
switch (STRFMT_TYPE(sf)) {
|
|
979
983
|
case STRFMT_LIT:
|
|
980
|
-
tr = emitir(IRT(IR_BUFPUT,
|
|
984
|
+
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
|
|
981
985
|
lj_ir_kstr(J, lj_str_new(J->L, fs.str, fs.len)));
|
|
982
986
|
break;
|
|
983
987
|
case STRFMT_INT:
|
|
@@ -986,7 +990,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
|
|
|
986
990
|
if (!tref_isinteger(tra))
|
|
987
991
|
goto handle_num;
|
|
988
992
|
if (sf == STRFMT_INT) { /* Shortcut for plain %d. */
|
|
989
|
-
tr = emitir(IRT(IR_BUFPUT,
|
|
993
|
+
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
|
|
990
994
|
emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_INT));
|
|
991
995
|
} else {
|
|
992
996
|
#if LJ_HASFFI
|
|
@@ -1016,7 +1020,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
|
|
|
1016
1020
|
return;
|
|
1017
1021
|
}
|
|
1018
1022
|
if (sf == STRFMT_STR) /* Shortcut for plain %s. */
|
|
1019
|
-
tr = emitir(IRT(IR_BUFPUT,
|
|
1023
|
+
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, tra);
|
|
1020
1024
|
else if ((sf & STRFMT_T_QUOTED))
|
|
1021
1025
|
tr = lj_ir_call(J, IRCALL_lj_strfmt_putquoted, tr, tra);
|
|
1022
1026
|
else
|
|
@@ -1025,7 +1029,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
|
|
|
1025
1029
|
case STRFMT_CHAR:
|
|
1026
1030
|
tra = lj_opt_narrow_toint(J, tra);
|
|
1027
1031
|
if (sf == STRFMT_CHAR) /* Shortcut for plain %c. */
|
|
1028
|
-
tr = emitir(IRT(IR_BUFPUT,
|
|
1032
|
+
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
|
|
1029
1033
|
emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_CHAR));
|
|
1030
1034
|
else
|
|
1031
1035
|
tr = lj_ir_call(J, IRCALL_lj_strfmt_putfchar, tr, trsf, tra);
|
|
@@ -1110,8 +1114,13 @@ static TRef recff_io_fp(jit_State *J, TRef *udp, int32_t id)
|
|
|
1110
1114
|
{
|
|
1111
1115
|
TRef tr, ud, fp;
|
|
1112
1116
|
if (id) { /* io.func() */
|
|
1117
|
+
#if LJ_GC64
|
|
1118
|
+
/* TODO: fix ARM32 asm_fload(), so we can use this for all archs. */
|
|
1119
|
+
ud = lj_ir_ggfload(J, IRT_UDATA, GG_OFS(g.gcroot[id]));
|
|
1120
|
+
#else
|
|
1113
1121
|
tr = lj_ir_kptr(J, &J2G(J)->gcroot[id]);
|
|
1114
1122
|
ud = emitir(IRT(IR_XLOAD, IRT_UDATA), tr, 0);
|
|
1123
|
+
#endif
|
|
1115
1124
|
} else { /* fp:method() */
|
|
1116
1125
|
ud = J->base[0];
|
|
1117
1126
|
if (!tref_isudata(ud))
|
|
@@ -1133,7 +1142,7 @@ static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd)
|
|
|
1133
1142
|
ptrdiff_t i = rd->data == 0 ? 1 : 0;
|
|
1134
1143
|
for (; J->base[i]; i++) {
|
|
1135
1144
|
TRef str = lj_ir_tostr(J, J->base[i]);
|
|
1136
|
-
TRef buf = emitir(IRT(IR_STRREF,
|
|
1145
|
+
TRef buf = emitir(IRT(IR_STRREF, IRT_PGC), str, zero);
|
|
1137
1146
|
TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN);
|
|
1138
1147
|
if (tref_isk(len) && IR(tref_ref(len))->i == 1) {
|
|
1139
1148
|
IRIns *irs = IR(tref_ref(str));
|