immunio 1.2.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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));
|