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
|
** SPLIT: Split 64 bit IR instructions into 32 bit IR instructions.
|
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_opt_split_c
|
@@ -16,6 +16,7 @@
|
|
16
16
|
#include "lj_jit.h"
|
17
17
|
#include "lj_ircall.h"
|
18
18
|
#include "lj_iropt.h"
|
19
|
+
#include "lj_dispatch.h"
|
19
20
|
#include "lj_vm.h"
|
20
21
|
|
21
22
|
/* SPLIT pass:
|
@@ -353,6 +354,8 @@ static void split_ir(jit_State *J)
|
|
353
354
|
ir->prev = ref; /* Identity substitution for loword. */
|
354
355
|
hisubst[ref] = 0;
|
355
356
|
}
|
357
|
+
if (irt_is64(ir->t) && ir->o != IR_KNULL)
|
358
|
+
ref++;
|
356
359
|
}
|
357
360
|
|
358
361
|
/* Process old IR instructions. */
|
@@ -433,7 +436,8 @@ static void split_ir(jit_State *J)
|
|
433
436
|
nir->o = IR_CONV; /* Pass through loword. */
|
434
437
|
nir->op2 = (IRT_INT << 5) | IRT_INT;
|
435
438
|
hi = split_emit(J, IRT(ir->o == IR_NEG ? IR_BXOR : IR_BAND, IRT_SOFTFP),
|
436
|
-
|
439
|
+
hisubst[ir->op1],
|
440
|
+
lj_ir_kint(J, (int32_t)(0x7fffffffu + (ir->o == IR_NEG))));
|
437
441
|
break;
|
438
442
|
case IR_SLOAD:
|
439
443
|
if ((nir->op2 & IRSLOAD_CONVERT)) { /* Convert from int to number. */
|
@@ -448,6 +452,11 @@ static void split_ir(jit_State *J)
|
|
448
452
|
case IR_STRTO:
|
449
453
|
hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);
|
450
454
|
break;
|
455
|
+
case IR_FLOAD:
|
456
|
+
lua_assert(ir->op1 == REF_NIL);
|
457
|
+
hi = lj_ir_kint(J, *(int32_t*)((char*)J2GG(J) + ir->op2 + LJ_LE*4));
|
458
|
+
nir->op2 += LJ_BE*4;
|
459
|
+
break;
|
451
460
|
case IR_XLOAD: {
|
452
461
|
IRIns inslo = *nir; /* Save/undo the emit of the lo XLOAD. */
|
453
462
|
J->cur.nins--;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
** Lua parser (source code -> bytecode).
|
3
|
-
** Copyright (C) 2005-
|
3
|
+
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
|
4
4
|
**
|
5
5
|
** Major portions taken verbatim or adapted from the Lua interpreter.
|
6
6
|
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
@@ -1282,12 +1282,14 @@ static void fscope_end(FuncState *fs)
|
|
1282
1282
|
MSize idx = gola_new(ls, NAME_BREAK, VSTACK_LABEL, fs->pc);
|
1283
1283
|
ls->vtop = idx; /* Drop break label immediately. */
|
1284
1284
|
gola_resolve(ls, bl, idx);
|
1285
|
+
} else { /* Need the fixup step to propagate the breaks. */
|
1286
|
+
gola_fixup(ls, bl);
|
1285
1287
|
return;
|
1286
|
-
}
|
1287
|
-
}
|
1288
|
-
|
1288
|
+
}
|
1289
|
+
}
|
1290
|
+
if ((bl->flags & FSCOPE_GOLA)) {
|
1291
|
+
gola_fixup(ls, bl);
|
1289
1292
|
}
|
1290
|
-
gola_fixup(ls, bl);
|
1291
1293
|
}
|
1292
1294
|
|
1293
1295
|
/* Mark scope as having an upvalue. */
|
@@ -2177,6 +2179,8 @@ static void assign_adjust(LexState *ls, BCReg nvars, BCReg nexps, ExpDesc *e)
|
|
2177
2179
|
bcemit_nil(fs, reg, (BCReg)extra);
|
2178
2180
|
}
|
2179
2181
|
}
|
2182
|
+
if (nexps > nvars)
|
2183
|
+
ls->fs->freereg -= nexps - nvars; /* Drop leftover regs. */
|
2180
2184
|
}
|
2181
2185
|
|
2182
2186
|
/* Recursively parse assignment statement. */
|
@@ -2210,8 +2214,6 @@ static void parse_assignment(LexState *ls, LHSVarList *lh, BCReg nvars)
|
|
2210
2214
|
return;
|
2211
2215
|
}
|
2212
2216
|
assign_adjust(ls, nvars, nexps, &e);
|
2213
|
-
if (nexps > nvars)
|
2214
|
-
ls->fs->freereg -= nexps - nvars; /* Drop leftover regs. */
|
2215
2217
|
}
|
2216
2218
|
/* Assign RHS to LHS and recurse downwards. */
|
2217
2219
|
expr_init(&e, VNONRELOC, ls->fs->freereg-1);
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
** Trace recorder (bytecode -> SSA IR).
|
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_record_c
|
@@ -51,7 +51,7 @@ static void rec_check_ir(jit_State *J)
|
|
51
51
|
{
|
52
52
|
IRRef i, nins = J->cur.nins, nk = J->cur.nk;
|
53
53
|
lua_assert(nk <= REF_BIAS && nins >= REF_BIAS && nins < 65536);
|
54
|
-
for (i =
|
54
|
+
for (i = nk; i < nins; i++) {
|
55
55
|
IRIns *ir = IR(i);
|
56
56
|
uint32_t mode = lj_ir_mode[ir->o];
|
57
57
|
IRRef op1 = ir->op1;
|
@@ -61,7 +61,10 @@ static void rec_check_ir(jit_State *J)
|
|
61
61
|
case IRMref: lua_assert(op1 >= nk);
|
62
62
|
lua_assert(i >= REF_BIAS ? op1 < i : op1 > i); break;
|
63
63
|
case IRMlit: break;
|
64
|
-
case IRMcst: lua_assert(i < REF_BIAS);
|
64
|
+
case IRMcst: lua_assert(i < REF_BIAS);
|
65
|
+
if (irt_is64(ir->t) && ir->o != IR_KNULL)
|
66
|
+
i++;
|
67
|
+
continue;
|
65
68
|
}
|
66
69
|
switch (irm_op2(mode)) {
|
67
70
|
case IRMnone: lua_assert(op2 == 0); break;
|
@@ -84,30 +87,48 @@ static void rec_check_slots(jit_State *J)
|
|
84
87
|
BCReg s, nslots = J->baseslot + J->maxslot;
|
85
88
|
int32_t depth = 0;
|
86
89
|
cTValue *base = J->L->base - J->baseslot;
|
87
|
-
lua_assert(J->baseslot >= 1 && J->baseslot < LJ_MAX_JSLOTS);
|
88
|
-
lua_assert(J->baseslot == 1 || (J->slot[J->baseslot-1] & TREF_FRAME));
|
90
|
+
lua_assert(J->baseslot >= 1+LJ_FR2 && J->baseslot < LJ_MAX_JSLOTS);
|
91
|
+
lua_assert(J->baseslot == 1+LJ_FR2 || (J->slot[J->baseslot-1] & TREF_FRAME));
|
89
92
|
lua_assert(nslots < LJ_MAX_JSLOTS);
|
90
93
|
for (s = 0; s < nslots; s++) {
|
91
94
|
TRef tr = J->slot[s];
|
92
95
|
if (tr) {
|
93
96
|
cTValue *tv = &base[s];
|
94
97
|
IRRef ref = tref_ref(tr);
|
95
|
-
IRIns *ir;
|
96
|
-
|
97
|
-
|
98
|
-
|
98
|
+
IRIns *ir = NULL; /* Silence compiler. */
|
99
|
+
if (!LJ_FR2 || ref || !(tr & (TREF_FRAME | TREF_CONT))) {
|
100
|
+
lua_assert(ref >= J->cur.nk && ref < J->cur.nins);
|
101
|
+
ir = IR(ref);
|
102
|
+
lua_assert(irt_t(ir->t) == tref_t(tr));
|
103
|
+
}
|
99
104
|
if (s == 0) {
|
100
105
|
lua_assert(tref_isfunc(tr));
|
106
|
+
#if LJ_FR2
|
107
|
+
} else if (s == 1) {
|
108
|
+
lua_assert((tr & ~TREF_FRAME) == 0);
|
109
|
+
#endif
|
101
110
|
} else if ((tr & TREF_FRAME)) {
|
102
111
|
GCfunc *fn = gco2func(frame_gc(tv));
|
103
112
|
BCReg delta = (BCReg)(tv - frame_prev(tv));
|
113
|
+
#if LJ_FR2
|
114
|
+
if (ref)
|
115
|
+
lua_assert(ir_knum(ir)->u64 == tv->u64);
|
116
|
+
tr = J->slot[s-1];
|
117
|
+
ir = IR(tref_ref(tr));
|
118
|
+
#endif
|
104
119
|
lua_assert(tref_isfunc(tr));
|
105
120
|
if (tref_isk(tr)) lua_assert(fn == ir_kfunc(ir));
|
106
|
-
lua_assert(s > delta ? (J->slot[s-delta] & TREF_FRAME)
|
121
|
+
lua_assert(s > delta + LJ_FR2 ? (J->slot[s-delta] & TREF_FRAME)
|
122
|
+
: (s == delta + LJ_FR2));
|
107
123
|
depth++;
|
108
124
|
} else if ((tr & TREF_CONT)) {
|
125
|
+
#if LJ_FR2
|
126
|
+
if (ref)
|
127
|
+
lua_assert(ir_knum(ir)->u64 == tv->u64);
|
128
|
+
#else
|
109
129
|
lua_assert(ir_kptr(ir) == gcrefp(tv->gcr, void));
|
110
|
-
|
130
|
+
#endif
|
131
|
+
lua_assert((J->slot[s+1+LJ_FR2] & TREF_FRAME));
|
111
132
|
depth++;
|
112
133
|
} else {
|
113
134
|
if (tvisnumber(tv))
|
@@ -159,10 +180,10 @@ static TRef sload(jit_State *J, int32_t slot)
|
|
159
180
|
/* Get TRef for current function. */
|
160
181
|
static TRef getcurrf(jit_State *J)
|
161
182
|
{
|
162
|
-
if (J->base[-1])
|
163
|
-
return J->base[-1];
|
164
|
-
lua_assert(J->baseslot == 1);
|
165
|
-
return sloadt(J, -1, IRT_FUNC, IRSLOAD_READONLY);
|
183
|
+
if (J->base[-1-LJ_FR2])
|
184
|
+
return J->base[-1-LJ_FR2];
|
185
|
+
lua_assert(J->baseslot == 1+LJ_FR2);
|
186
|
+
return sloadt(J, -1-LJ_FR2, IRT_FUNC, IRSLOAD_READONLY);
|
166
187
|
}
|
167
188
|
|
168
189
|
/* Compare for raw object equality.
|
@@ -506,7 +527,6 @@ static LoopEvent rec_for(jit_State *J, const BCIns *fori, int isforl)
|
|
506
527
|
static LoopEvent rec_iterl(jit_State *J, const BCIns iterins)
|
507
528
|
{
|
508
529
|
BCReg ra = bc_a(iterins);
|
509
|
-
lua_assert(!LJ_FR2); /* TODO_FR2: handle different frame setup. */
|
510
530
|
if (!tref_isnil(getslot(J, ra))) { /* Looping back? */
|
511
531
|
J->base[ra-1] = J->base[ra]; /* Copy result of ITERC to control var. */
|
512
532
|
J->maxslot = ra-1+bc_b(J->pc[-1]);
|
@@ -643,8 +663,8 @@ static TRef rec_call_specialize(jit_State *J, GCfunc *fn, TRef tr)
|
|
643
663
|
GCproto *pt = funcproto(fn);
|
644
664
|
/* Too many closures created? Probably not a monomorphic function. */
|
645
665
|
if (pt->flags >= PROTO_CLC_POLY) { /* Specialize to prototype instead. */
|
646
|
-
TRef trpt = emitir(IRT(IR_FLOAD,
|
647
|
-
emitir(IRTG(IR_EQ,
|
666
|
+
TRef trpt = emitir(IRT(IR_FLOAD, IRT_PGC), tr, IRFL_FUNC_PC);
|
667
|
+
emitir(IRTG(IR_EQ, IRT_PGC), trpt, lj_ir_kptr(J, proto_bc(pt)));
|
648
668
|
(void)lj_ir_kgc(J, obj2gco(pt), IRT_PROTO); /* Prevent GC of proto. */
|
649
669
|
return tr;
|
650
670
|
}
|
@@ -675,22 +695,31 @@ static void rec_call_setup(jit_State *J, BCReg func, ptrdiff_t nargs)
|
|
675
695
|
{
|
676
696
|
RecordIndex ix;
|
677
697
|
TValue *functv = &J->L->base[func];
|
678
|
-
TRef *fbase = &J->base[func];
|
698
|
+
TRef kfunc, *fbase = &J->base[func];
|
679
699
|
ptrdiff_t i;
|
680
|
-
|
681
|
-
for (i =
|
682
|
-
(void)getslot(J, func+i); /* Ensure
|
700
|
+
(void)getslot(J, func); /* Ensure func has a reference. */
|
701
|
+
for (i = 1; i <= nargs; i++)
|
702
|
+
(void)getslot(J, func+LJ_FR2+i); /* Ensure all args have a reference. */
|
683
703
|
if (!tref_isfunc(fbase[0])) { /* Resolve __call metamethod. */
|
684
704
|
ix.tab = fbase[0];
|
685
705
|
copyTV(J->L, &ix.tabv, functv);
|
686
706
|
if (!lj_record_mm_lookup(J, &ix, MM_call) || !tref_isfunc(ix.mobj))
|
687
707
|
lj_trace_err(J, LJ_TRERR_NOMM);
|
688
|
-
for (i = ++nargs; i >
|
689
|
-
fbase[i] = fbase[i-1];
|
708
|
+
for (i = ++nargs; i > LJ_FR2; i--) /* Shift arguments up. */
|
709
|
+
fbase[i+LJ_FR2] = fbase[i+LJ_FR2-1];
|
710
|
+
#if LJ_FR2
|
711
|
+
fbase[2] = fbase[0];
|
712
|
+
#endif
|
690
713
|
fbase[0] = ix.mobj; /* Replace function. */
|
691
714
|
functv = &ix.mobjv;
|
692
715
|
}
|
693
|
-
|
716
|
+
kfunc = rec_call_specialize(J, funcV(functv), fbase[0]);
|
717
|
+
#if LJ_FR2
|
718
|
+
fbase[0] = kfunc;
|
719
|
+
fbase[1] = TREF_FRAME;
|
720
|
+
#else
|
721
|
+
fbase[0] = kfunc | TREF_FRAME;
|
722
|
+
#endif
|
694
723
|
J->maxslot = (BCReg)nargs;
|
695
724
|
}
|
696
725
|
|
@@ -700,8 +729,8 @@ void lj_record_call(jit_State *J, BCReg func, ptrdiff_t nargs)
|
|
700
729
|
rec_call_setup(J, func, nargs);
|
701
730
|
/* Bump frame. */
|
702
731
|
J->framedepth++;
|
703
|
-
J->base += func+1;
|
704
|
-
J->baseslot += func+1;
|
732
|
+
J->base += func+1+LJ_FR2;
|
733
|
+
J->baseslot += func+1+LJ_FR2;
|
705
734
|
}
|
706
735
|
|
707
736
|
/* Record tail call. */
|
@@ -717,7 +746,9 @@ void lj_record_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs)
|
|
717
746
|
func += cbase;
|
718
747
|
}
|
719
748
|
/* Move func + args down. */
|
720
|
-
|
749
|
+
if (LJ_FR2 && J->baseslot == 2)
|
750
|
+
J->base[func+1] = TREF_FRAME;
|
751
|
+
memmove(&J->base[-1-LJ_FR2], &J->base[func], sizeof(TRef)*(J->maxslot+1+LJ_FR2));
|
721
752
|
/* Note: the new TREF_FRAME is now at J->base[-1] (even for slot #0). */
|
722
753
|
/* Tailcalls can form a loop, so count towards the loop unroll limit. */
|
723
754
|
if (++J->tailcalled > J->loopunroll)
|
@@ -758,9 +789,9 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
|
|
758
789
|
(void)getslot(J, rbase+i); /* Ensure all results have a reference. */
|
759
790
|
while (frame_ispcall(frame)) { /* Immediately resolve pcall() returns. */
|
760
791
|
BCReg cbase = (BCReg)frame_delta(frame);
|
761
|
-
if (--J->framedepth
|
792
|
+
if (--J->framedepth <= 0)
|
762
793
|
lj_trace_err(J, LJ_TRERR_NYIRETL);
|
763
|
-
lua_assert(J->baseslot > 1);
|
794
|
+
lua_assert(J->baseslot > 1+LJ_FR2);
|
764
795
|
gotresults++;
|
765
796
|
rbase += cbase;
|
766
797
|
J->baseslot -= (BCReg)cbase;
|
@@ -784,7 +815,7 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
|
|
784
815
|
BCReg cbase = (BCReg)frame_delta(frame);
|
785
816
|
if (--J->framedepth < 0) /* NYI: return of vararg func to lower frame. */
|
786
817
|
lj_trace_err(J, LJ_TRERR_NYIRETL);
|
787
|
-
lua_assert(J->baseslot > 1);
|
818
|
+
lua_assert(J->baseslot > 1+LJ_FR2);
|
788
819
|
rbase += cbase;
|
789
820
|
J->baseslot -= (BCReg)cbase;
|
790
821
|
J->base -= cbase;
|
@@ -794,8 +825,7 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
|
|
794
825
|
BCIns callins = *(frame_pc(frame)-1);
|
795
826
|
ptrdiff_t nresults = bc_b(callins) ? (ptrdiff_t)bc_b(callins)-1 :gotresults;
|
796
827
|
BCReg cbase = bc_a(callins);
|
797
|
-
GCproto *pt = funcproto(frame_func(frame - (cbase+1
|
798
|
-
lua_assert(!LJ_FR2); /* TODO_FR2: handle different frame teardown. */
|
828
|
+
GCproto *pt = funcproto(frame_func(frame - (cbase+1+LJ_FR2)));
|
799
829
|
if ((pt->flags & PROTO_NOJIT))
|
800
830
|
lj_trace_err(J, LJ_TRERR_CJITOFF);
|
801
831
|
if (J->framedepth == 0 && J->pt && frame == J->L->base - 1) {
|
@@ -808,13 +838,13 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
|
|
808
838
|
lj_snap_add(J);
|
809
839
|
}
|
810
840
|
for (i = 0; i < nresults; i++) /* Adjust results. */
|
811
|
-
J->base[i-1] = i < gotresults ? J->base[rbase+i] : TREF_NIL;
|
841
|
+
J->base[i-1-LJ_FR2] = i < gotresults ? J->base[rbase+i] : TREF_NIL;
|
812
842
|
J->maxslot = cbase+(BCReg)nresults;
|
813
843
|
if (J->framedepth > 0) { /* Return to a frame that is part of the trace. */
|
814
844
|
J->framedepth--;
|
815
|
-
lua_assert(J->baseslot > cbase+1);
|
816
|
-
J->baseslot -= cbase+1;
|
817
|
-
J->base -= cbase+1;
|
845
|
+
lua_assert(J->baseslot > cbase+1+LJ_FR2);
|
846
|
+
J->baseslot -= cbase+1+LJ_FR2;
|
847
|
+
J->base -= cbase+1+LJ_FR2;
|
818
848
|
} else if (J->parent == 0 && J->exitno == 0 &&
|
819
849
|
!bc_isret(bc_op(J->cur.startins))) {
|
820
850
|
/* Return to lower frame would leave the loop in a root trace. */
|
@@ -824,13 +854,13 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
|
|
824
854
|
} else { /* Return to lower frame. Guard for the target we return to. */
|
825
855
|
TRef trpt = lj_ir_kgc(J, obj2gco(pt), IRT_PROTO);
|
826
856
|
TRef trpc = lj_ir_kptr(J, (void *)frame_pc(frame));
|
827
|
-
emitir(IRTG(IR_RETF,
|
857
|
+
emitir(IRTG(IR_RETF, IRT_PGC), trpt, trpc);
|
828
858
|
J->retdepth++;
|
829
859
|
J->needsnap = 1;
|
830
|
-
lua_assert(J->baseslot == 1);
|
860
|
+
lua_assert(J->baseslot == 1+LJ_FR2);
|
831
861
|
/* Shift result slots up and clear the slots of the new frame below. */
|
832
|
-
memmove(J->base + cbase, J->base-1, sizeof(TRef)*nresults);
|
833
|
-
memset(J->base-1, 0, sizeof(TRef)*(cbase+1));
|
862
|
+
memmove(J->base + cbase, J->base-1-LJ_FR2, sizeof(TRef)*nresults);
|
863
|
+
memset(J->base-1-LJ_FR2, 0, sizeof(TRef)*(cbase+1+LJ_FR2));
|
834
864
|
}
|
835
865
|
} else if (frame_iscont(frame)) { /* Return to continuation frame. */
|
836
866
|
ASMFunction cont = frame_contf(frame);
|
@@ -839,32 +869,39 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
|
|
839
869
|
lj_trace_err(J, LJ_TRERR_NYIRETL);
|
840
870
|
J->baseslot -= (BCReg)cbase;
|
841
871
|
J->base -= cbase;
|
842
|
-
J->maxslot = cbase-2;
|
872
|
+
J->maxslot = cbase-(2<<LJ_FR2);
|
843
873
|
if (cont == lj_cont_ra) {
|
844
874
|
/* Copy result to destination slot. */
|
845
875
|
BCReg dst = bc_a(*(frame_contpc(frame)-1));
|
846
876
|
J->base[dst] = gotresults ? J->base[cbase+rbase] : TREF_NIL;
|
847
|
-
if (dst >= J->maxslot)
|
877
|
+
if (dst >= J->maxslot) {
|
878
|
+
J->maxslot = dst+1;
|
879
|
+
}
|
848
880
|
} else if (cont == lj_cont_nop) {
|
849
881
|
/* Nothing to do here. */
|
850
882
|
} else if (cont == lj_cont_cat) {
|
851
883
|
BCReg bslot = bc_b(*(frame_contpc(frame)-1));
|
852
884
|
TRef tr = gotresults ? J->base[cbase+rbase] : TREF_NIL;
|
853
|
-
if (bslot !=
|
885
|
+
if (bslot != J->maxslot) { /* Concatenate the remainder. */
|
854
886
|
TValue *b = J->L->base, save; /* Simulate lower frame and result. */
|
855
|
-
J->base[
|
856
|
-
copyTV(J->L, &save, b-2);
|
857
|
-
if (gotresults)
|
887
|
+
J->base[J->maxslot] = tr;
|
888
|
+
copyTV(J->L, &save, b-(2<<LJ_FR2));
|
889
|
+
if (gotresults)
|
890
|
+
copyTV(J->L, b-(2<<LJ_FR2), b+rbase);
|
891
|
+
else
|
892
|
+
setnilV(b-(2<<LJ_FR2));
|
858
893
|
J->L->base = b - cbase;
|
859
|
-
tr = rec_cat(J, bslot, cbase-2);
|
894
|
+
tr = rec_cat(J, bslot, cbase-(2<<LJ_FR2));
|
860
895
|
b = J->L->base + cbase; /* Undo. */
|
861
896
|
J->L->base = b;
|
862
|
-
copyTV(J->L, b-2, &save);
|
897
|
+
copyTV(J->L, b-(2<<LJ_FR2), &save);
|
863
898
|
}
|
864
899
|
if (tr) { /* Store final result. */
|
865
900
|
BCReg dst = bc_a(*(frame_contpc(frame)-1));
|
866
901
|
J->base[dst] = tr;
|
867
|
-
if (dst >= J->maxslot)
|
902
|
+
if (dst >= J->maxslot) {
|
903
|
+
J->maxslot = dst+1;
|
904
|
+
}
|
868
905
|
} /* Otherwise continue with another __concat call. */
|
869
906
|
} else {
|
870
907
|
/* Result type already specialized. */
|
@@ -873,7 +910,7 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
|
|
873
910
|
} else {
|
874
911
|
lj_trace_err(J, LJ_TRERR_NYIRETL); /* NYI: handle return to C frame. */
|
875
912
|
}
|
876
|
-
lua_assert(J->baseslot >= 1);
|
913
|
+
lua_assert(J->baseslot >= 1+LJ_FR2);
|
877
914
|
}
|
878
915
|
|
879
916
|
/* -- Metamethod handling ------------------------------------------------- */
|
@@ -882,16 +919,16 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
|
|
882
919
|
static BCReg rec_mm_prep(jit_State *J, ASMFunction cont)
|
883
920
|
{
|
884
921
|
BCReg s, top = cont == lj_cont_cat ? J->maxslot : curr_proto(J->L)->framesize;
|
885
|
-
#if
|
886
|
-
|
922
|
+
#if LJ_FR2
|
923
|
+
J->base[top] = lj_ir_k64(J, IR_KNUM, u64ptr(contptr(cont)));
|
924
|
+
J->base[top+1] = TREF_CONT;
|
887
925
|
#else
|
888
|
-
|
926
|
+
J->base[top] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;
|
889
927
|
#endif
|
890
|
-
J->base[top] = trcont | TREF_CONT;
|
891
928
|
J->framedepth++;
|
892
929
|
for (s = J->maxslot; s < top; s++)
|
893
930
|
J->base[s] = 0; /* Clear frame gap to avoid resurrecting previous refs. */
|
894
|
-
return top+1;
|
931
|
+
return top+1+LJ_FR2;
|
895
932
|
}
|
896
933
|
|
897
934
|
/* Record metamethod lookup. */
|
@@ -910,7 +947,7 @@ int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm)
|
|
910
947
|
cTValue *mo;
|
911
948
|
if (LJ_HASFFI && udtype == UDTYPE_FFI_CLIB) {
|
912
949
|
/* Specialize to the C library namespace object. */
|
913
|
-
emitir(IRTG(IR_EQ,
|
950
|
+
emitir(IRTG(IR_EQ, IRT_PGC), ix->tab, lj_ir_kptr(J, udataV(&ix->tabv)));
|
914
951
|
} else {
|
915
952
|
/* Specialize to the type of userdata. */
|
916
953
|
TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), ix->tab, IRFL_UDATA_UDTYPE);
|
@@ -939,7 +976,13 @@ int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm)
|
|
939
976
|
}
|
940
977
|
/* The cdata metatable is treated as immutable. */
|
941
978
|
if (LJ_HASFFI && tref_iscdata(ix->tab)) goto immutable_mt;
|
979
|
+
#if LJ_GC64
|
980
|
+
/* TODO: fix ARM32 asm_fload(), so we can use this for all archs. */
|
981
|
+
ix->mt = mix.tab = lj_ir_ggfload(J, IRT_TAB,
|
982
|
+
GG_OFS(g.gcroot[GCROOT_BASEMT+itypemap(&ix->tabv)]));
|
983
|
+
#else
|
942
984
|
ix->mt = mix.tab = lj_ir_ktab(J, mt);
|
985
|
+
#endif
|
943
986
|
goto nocheck;
|
944
987
|
}
|
945
988
|
ix->mt = mt ? mix.tab : TREF_NIL;
|
@@ -969,9 +1012,9 @@ static TRef rec_mm_arith(jit_State *J, RecordIndex *ix, MMS mm)
|
|
969
1012
|
BCReg func = rec_mm_prep(J, mm == MM_concat ? lj_cont_cat : lj_cont_ra);
|
970
1013
|
TRef *base = J->base + func;
|
971
1014
|
TValue *basev = J->L->base + func;
|
972
|
-
base[1] = ix->tab; base[2] = ix->key;
|
973
|
-
copyTV(J->L, basev+1, &ix->tabv);
|
974
|
-
copyTV(J->L, basev+2, &ix->keyv);
|
1015
|
+
base[1+LJ_FR2] = ix->tab; base[2+LJ_FR2] = ix->key;
|
1016
|
+
copyTV(J->L, basev+1+LJ_FR2, &ix->tabv);
|
1017
|
+
copyTV(J->L, basev+2+LJ_FR2, &ix->keyv);
|
975
1018
|
if (!lj_record_mm_lookup(J, ix, mm)) { /* Lookup mm on 1st operand. */
|
976
1019
|
if (mm != MM_unm) {
|
977
1020
|
ix->tab = ix->key;
|
@@ -982,8 +1025,10 @@ static TRef rec_mm_arith(jit_State *J, RecordIndex *ix, MMS mm)
|
|
982
1025
|
lj_trace_err(J, LJ_TRERR_NOMM);
|
983
1026
|
}
|
984
1027
|
ok:
|
985
|
-
lua_assert(!LJ_FR2); /* TODO_FR2: handle different frame setup. */
|
986
1028
|
base[0] = ix->mobj;
|
1029
|
+
#if LJ_FR2
|
1030
|
+
base[1] = 0;
|
1031
|
+
#endif
|
987
1032
|
copyTV(J->L, basev+0, &ix->mobjv);
|
988
1033
|
lj_record_call(J, func, 2);
|
989
1034
|
return 0; /* No result yet. */
|
@@ -999,8 +1044,9 @@ static TRef rec_mm_len(jit_State *J, TRef tr, TValue *tv)
|
|
999
1044
|
BCReg func = rec_mm_prep(J, lj_cont_ra);
|
1000
1045
|
TRef *base = J->base + func;
|
1001
1046
|
TValue *basev = J->L->base + func;
|
1002
|
-
lua_assert(!LJ_FR2); /* TODO_FR2: handle different frame setup. */
|
1003
1047
|
base[0] = ix.mobj; copyTV(J->L, basev+0, &ix.mobjv);
|
1048
|
+
base += LJ_FR2;
|
1049
|
+
basev += LJ_FR2;
|
1004
1050
|
base[1] = tr; copyTV(J->L, basev+1, tv);
|
1005
1051
|
#if LJ_52
|
1006
1052
|
base[2] = tr; copyTV(J->L, basev+2, tv);
|
@@ -1020,11 +1066,10 @@ static TRef rec_mm_len(jit_State *J, TRef tr, TValue *tv)
|
|
1020
1066
|
static void rec_mm_callcomp(jit_State *J, RecordIndex *ix, int op)
|
1021
1067
|
{
|
1022
1068
|
BCReg func = rec_mm_prep(J, (op&1) ? lj_cont_condf : lj_cont_condt);
|
1023
|
-
TRef *base = J->base + func;
|
1024
|
-
TValue *tv = J->L->base + func;
|
1025
|
-
|
1026
|
-
|
1027
|
-
copyTV(J->L, tv+0, &ix->mobjv);
|
1069
|
+
TRef *base = J->base + func + LJ_FR2;
|
1070
|
+
TValue *tv = J->L->base + func + LJ_FR2;
|
1071
|
+
base[-LJ_FR2] = ix->mobj; base[1] = ix->val; base[2] = ix->key;
|
1072
|
+
copyTV(J->L, tv-LJ_FR2, &ix->mobjv);
|
1028
1073
|
copyTV(J->L, tv+1, &ix->valv);
|
1029
1074
|
copyTV(J->L, tv+2, &ix->keyv);
|
1030
1075
|
lj_record_call(J, func, 2);
|
@@ -1257,8 +1302,8 @@ static TRef rec_idx_key(jit_State *J, RecordIndex *ix, IRRef *rbref,
|
|
1257
1302
|
if ((MSize)k < t->asize) { /* Currently an array key? */
|
1258
1303
|
TRef arrayref;
|
1259
1304
|
rec_idx_abc(J, asizeref, ikey, t->asize);
|
1260
|
-
arrayref = emitir(IRT(IR_FLOAD,
|
1261
|
-
return emitir(IRT(IR_AREF,
|
1305
|
+
arrayref = emitir(IRT(IR_FLOAD, IRT_PGC), ix->tab, IRFL_TAB_ARRAY);
|
1306
|
+
return emitir(IRT(IR_AREF, IRT_PGC), arrayref, ikey);
|
1262
1307
|
} else { /* Currently not in array (may be an array extension)? */
|
1263
1308
|
emitir(IRTGI(IR_ULE), asizeref, ikey); /* Inv. bounds check. */
|
1264
1309
|
if (k == 0 && tref_isk(key))
|
@@ -1298,13 +1343,13 @@ static TRef rec_idx_key(jit_State *J, RecordIndex *ix, IRRef *rbref,
|
|
1298
1343
|
*rbguard = J->guardemit;
|
1299
1344
|
hm = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_HMASK);
|
1300
1345
|
emitir(IRTGI(IR_EQ), hm, lj_ir_kint(J, (int32_t)t->hmask));
|
1301
|
-
node = emitir(IRT(IR_FLOAD,
|
1346
|
+
node = emitir(IRT(IR_FLOAD, IRT_PGC), ix->tab, IRFL_TAB_NODE);
|
1302
1347
|
kslot = lj_ir_kslot(J, key, hslot / sizeof(Node));
|
1303
|
-
return emitir(IRTG(IR_HREFK,
|
1348
|
+
return emitir(IRTG(IR_HREFK, IRT_PGC), node, kslot);
|
1304
1349
|
}
|
1305
1350
|
}
|
1306
1351
|
/* Fall back to a regular hash lookup. */
|
1307
|
-
return emitir(IRT(IR_HREF,
|
1352
|
+
return emitir(IRT(IR_HREF, IRT_PGC), ix->tab, key);
|
1308
1353
|
}
|
1309
1354
|
|
1310
1355
|
/* Determine whether a key is NOT one of the fast metamethod names. */
|
@@ -1341,11 +1386,10 @@ TRef lj_record_idx(jit_State *J, RecordIndex *ix)
|
|
1341
1386
|
handlemm:
|
1342
1387
|
if (tref_isfunc(ix->mobj)) { /* Handle metamethod call. */
|
1343
1388
|
BCReg func = rec_mm_prep(J, ix->val ? lj_cont_nop : lj_cont_ra);
|
1344
|
-
TRef *base = J->base + func;
|
1345
|
-
TValue *tv = J->L->base + func;
|
1346
|
-
|
1347
|
-
|
1348
|
-
setfuncV(J->L, tv+0, funcV(&ix->mobjv));
|
1389
|
+
TRef *base = J->base + func + LJ_FR2;
|
1390
|
+
TValue *tv = J->L->base + func + LJ_FR2;
|
1391
|
+
base[-LJ_FR2] = ix->mobj; base[1] = ix->tab; base[2] = ix->key;
|
1392
|
+
setfuncV(J->L, tv-LJ_FR2, funcV(&ix->mobjv));
|
1349
1393
|
copyTV(J->L, tv+1, &ix->tabv);
|
1350
1394
|
copyTV(J->L, tv+2, &ix->keyv);
|
1351
1395
|
if (ix->val) {
|
@@ -1387,7 +1431,7 @@ TRef lj_record_idx(jit_State *J, RecordIndex *ix)
|
|
1387
1431
|
IRType t = itype2irt(oldv);
|
1388
1432
|
TRef res;
|
1389
1433
|
if (oldv == niltvg(J2G(J))) {
|
1390
|
-
emitir(IRTG(IR_EQ,
|
1434
|
+
emitir(IRTG(IR_EQ, IRT_PGC), xref, lj_ir_kkptr(J, niltvg(J2G(J))));
|
1391
1435
|
res = TREF_NIL;
|
1392
1436
|
} else {
|
1393
1437
|
res = emitir(IRTG(loadop, t), xref, 0);
|
@@ -1417,7 +1461,7 @@ TRef lj_record_idx(jit_State *J, RecordIndex *ix)
|
|
1417
1461
|
if (hasmm)
|
1418
1462
|
emitir(IRTG(loadop, IRT_NIL), xref, 0); /* Guard for nil value. */
|
1419
1463
|
else if (xrefop == IR_HREF)
|
1420
|
-
emitir(IRTG(oldv == niltvg(J2G(J)) ? IR_EQ : IR_NE,
|
1464
|
+
emitir(IRTG(oldv == niltvg(J2G(J)) ? IR_EQ : IR_NE, IRT_PGC),
|
1421
1465
|
xref, lj_ir_kkptr(J, niltvg(J2G(J))));
|
1422
1466
|
if (ix->idxchain && lj_record_mm_lookup(J, ix, MM_newindex)) {
|
1423
1467
|
lua_assert(hasmm);
|
@@ -1428,7 +1472,7 @@ TRef lj_record_idx(jit_State *J, RecordIndex *ix)
|
|
1428
1472
|
TRef key = ix->key;
|
1429
1473
|
if (tref_isinteger(key)) /* NEWREF needs a TValue as a key. */
|
1430
1474
|
key = emitir(IRTN(IR_CONV), key, IRCONV_NUM_INT);
|
1431
|
-
xref = emitir(IRT(IR_NEWREF,
|
1475
|
+
xref = emitir(IRT(IR_NEWREF, IRT_PGC), ix->tab, key);
|
1432
1476
|
keybarrier = 0; /* NEWREF already takes care of the key barrier. */
|
1433
1477
|
#ifdef LUAJIT_ENABLE_TABLE_BUMP
|
1434
1478
|
if ((J->flags & JIT_F_OPT_SINK)) /* Avoid a separate flag. */
|
@@ -1438,7 +1482,7 @@ TRef lj_record_idx(jit_State *J, RecordIndex *ix)
|
|
1438
1482
|
} else if (!lj_opt_fwd_wasnonnil(J, loadop, tref_ref(xref))) {
|
1439
1483
|
/* Cannot derive that the previous value was non-nil, must do checks. */
|
1440
1484
|
if (xrefop == IR_HREF) /* Guard against store to niltv. */
|
1441
|
-
emitir(IRTG(IR_NE,
|
1485
|
+
emitir(IRTG(IR_NE, IRT_PGC), xref, lj_ir_kkptr(J, niltvg(J2G(J))));
|
1442
1486
|
if (ix->idxchain) { /* Metamethod lookup required? */
|
1443
1487
|
/* A check for NULL metatable is cheaper (hoistable) than a load. */
|
1444
1488
|
if (!mt) {
|
@@ -1460,7 +1504,7 @@ TRef lj_record_idx(jit_State *J, RecordIndex *ix)
|
|
1460
1504
|
emitir(IRT(IR_TBAR, IRT_NIL), ix->tab, 0);
|
1461
1505
|
/* Invalidate neg. metamethod cache for stores with certain string keys. */
|
1462
1506
|
if (!nommstr(J, ix->key)) {
|
1463
|
-
TRef fref = emitir(IRT(IR_FREF,
|
1507
|
+
TRef fref = emitir(IRT(IR_FREF, IRT_PGC), ix->tab, IRFL_TAB_NOMM);
|
1464
1508
|
emitir(IRT(IR_FSTORE, IRT_U8), fref, lj_ir_kint(J, 0));
|
1465
1509
|
}
|
1466
1510
|
J->needsnap = 1;
|
@@ -1535,7 +1579,11 @@ static TRef rec_upvalue(jit_State *J, uint32_t uv, TRef val)
|
|
1535
1579
|
goto noconstify;
|
1536
1580
|
kfunc = lj_ir_kfunc(J, J->fn);
|
1537
1581
|
emitir(IRTG(IR_EQ, IRT_FUNC), fn, kfunc);
|
1538
|
-
|
1582
|
+
#if LJ_FR2
|
1583
|
+
J->base[-2] = kfunc;
|
1584
|
+
#else
|
1585
|
+
J->base[-1] = kfunc | TREF_FRAME;
|
1586
|
+
#endif
|
1539
1587
|
fn = kfunc;
|
1540
1588
|
}
|
1541
1589
|
tr = lj_record_constify(J, uvval(uvp));
|
@@ -1546,13 +1594,17 @@ noconstify:
|
|
1546
1594
|
/* Note: this effectively limits LJ_MAX_UPVAL to 127. */
|
1547
1595
|
uv = (uv << 8) | (hashrot(uvp->dhash, uvp->dhash + HASH_BIAS) & 0xff);
|
1548
1596
|
if (!uvp->closed) {
|
1597
|
+
uref = tref_ref(emitir(IRTG(IR_UREFO, IRT_PGC), fn, uv));
|
1549
1598
|
/* In current stack? */
|
1550
1599
|
if (uvval(uvp) >= tvref(J->L->stack) &&
|
1551
1600
|
uvval(uvp) < tvref(J->L->maxstack)) {
|
1552
1601
|
int32_t slot = (int32_t)(uvval(uvp) - (J->L->base - J->baseslot));
|
1553
1602
|
if (slot >= 0) { /* Aliases an SSA slot? */
|
1603
|
+
emitir(IRTG(IR_EQ, IRT_PGC),
|
1604
|
+
REF_BASE,
|
1605
|
+
emitir(IRT(IR_ADD, IRT_PGC), uref,
|
1606
|
+
lj_ir_kint(J, (slot - 1 - LJ_FR2) * -8)));
|
1554
1607
|
slot -= (int32_t)J->baseslot; /* Note: slot number may be negative! */
|
1555
|
-
/* NYI: add IR to guard that it's still aliasing the same slot. */
|
1556
1608
|
if (val == 0) {
|
1557
1609
|
return getslot(J, slot);
|
1558
1610
|
} else {
|
@@ -1562,10 +1614,12 @@ noconstify:
|
|
1562
1614
|
}
|
1563
1615
|
}
|
1564
1616
|
}
|
1565
|
-
|
1617
|
+
emitir(IRTG(IR_UGT, IRT_PGC),
|
1618
|
+
emitir(IRT(IR_SUB, IRT_PGC), uref, REF_BASE),
|
1619
|
+
lj_ir_kint(J, (J->baseslot + J->maxslot) * 8));
|
1566
1620
|
} else {
|
1567
1621
|
needbarrier = 1;
|
1568
|
-
uref = tref_ref(emitir(IRTG(IR_UREFC,
|
1622
|
+
uref = tref_ref(emitir(IRTG(IR_UREFC, IRT_PGC), fn, uv));
|
1569
1623
|
}
|
1570
1624
|
if (val == 0) { /* Upvalue load */
|
1571
1625
|
IRType t = itype2irt(uvval(uvp));
|
@@ -1640,11 +1694,14 @@ static void rec_func_setup(jit_State *J)
|
|
1640
1694
|
static void rec_func_vararg(jit_State *J)
|
1641
1695
|
{
|
1642
1696
|
GCproto *pt = J->pt;
|
1643
|
-
BCReg s, fixargs, vframe = J->maxslot+1;
|
1697
|
+
BCReg s, fixargs, vframe = J->maxslot+1+LJ_FR2;
|
1644
1698
|
lua_assert((pt->flags & PROTO_VARARG));
|
1645
1699
|
if (J->baseslot + vframe + pt->framesize >= LJ_MAX_JSLOTS)
|
1646
1700
|
lj_trace_err(J, LJ_TRERR_STACKOV);
|
1647
|
-
J->base[vframe-1] = J->base[-1]; /* Copy function up. */
|
1701
|
+
J->base[vframe-1-LJ_FR2] = J->base[-1-LJ_FR2]; /* Copy function up. */
|
1702
|
+
#if LJ_FR2
|
1703
|
+
J->base[vframe-1] = TREF_FRAME;
|
1704
|
+
#endif
|
1648
1705
|
/* Copy fixarg slots up and set their original slots to nil. */
|
1649
1706
|
fixargs = pt->numparams < J->maxslot ? pt->numparams : J->maxslot;
|
1650
1707
|
for (s = 0; s < fixargs; s++) {
|
@@ -1693,8 +1750,11 @@ static int select_detect(jit_State *J)
|
|
1693
1750
|
BCIns ins = J->pc[1];
|
1694
1751
|
if (bc_op(ins) == BC_CALLM && bc_b(ins) == 2 && bc_c(ins) == 1) {
|
1695
1752
|
cTValue *func = &J->L->base[bc_a(ins)];
|
1696
|
-
if (tvisfunc(func) && funcV(func)->c.ffid == FF_select)
|
1753
|
+
if (tvisfunc(func) && funcV(func)->c.ffid == FF_select) {
|
1754
|
+
TRef kfunc = lj_ir_kfunc(J, funcV(func));
|
1755
|
+
emitir(IRTG(IR_EQ, IRT_FUNC), getslot(J, bc_a(ins)), kfunc);
|
1697
1756
|
return 1;
|
1757
|
+
}
|
1698
1758
|
}
|
1699
1759
|
return 0;
|
1700
1760
|
}
|
@@ -1703,8 +1763,10 @@ static int select_detect(jit_State *J)
|
|
1703
1763
|
static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
|
1704
1764
|
{
|
1705
1765
|
int32_t numparams = J->pt->numparams;
|
1706
|
-
ptrdiff_t nvararg = frame_delta(J->L->base-1) - numparams - 1;
|
1766
|
+
ptrdiff_t nvararg = frame_delta(J->L->base-1) - numparams - 1 - LJ_FR2;
|
1707
1767
|
lua_assert(frame_isvarg(J->L->base-1));
|
1768
|
+
if (LJ_FR2 && dst > J->maxslot)
|
1769
|
+
J->base[dst-1] = 0; /* Prevent resurrection of unrelated slot. */
|
1708
1770
|
if (J->framedepth > 0) { /* Simple case: varargs defined on-trace. */
|
1709
1771
|
ptrdiff_t i;
|
1710
1772
|
if (nvararg < 0) nvararg = 0;
|
@@ -1715,10 +1777,10 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
|
|
1715
1777
|
J->maxslot = dst + (BCReg)nresults;
|
1716
1778
|
}
|
1717
1779
|
for (i = 0; i < nresults; i++)
|
1718
|
-
J->base[dst+i] = i < nvararg ? getslot(J, i - nvararg - 1) : TREF_NIL;
|
1780
|
+
J->base[dst+i] = i < nvararg ? getslot(J, i - nvararg - 1 - LJ_FR2) : TREF_NIL;
|
1719
1781
|
} else { /* Unknown number of varargs passed to trace. */
|
1720
|
-
TRef fr = emitir(IRTI(IR_SLOAD),
|
1721
|
-
int32_t frofs = 8*(1+numparams)+FRAME_VARG;
|
1782
|
+
TRef fr = emitir(IRTI(IR_SLOAD), LJ_FR2, IRSLOAD_READONLY|IRSLOAD_FRAME);
|
1783
|
+
int32_t frofs = 8*(1+LJ_FR2+numparams)+FRAME_VARG;
|
1722
1784
|
if (nresults >= 0) { /* Known fixed number of results. */
|
1723
1785
|
ptrdiff_t i;
|
1724
1786
|
if (nvararg > 0) {
|
@@ -1729,11 +1791,11 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
|
|
1729
1791
|
else
|
1730
1792
|
emitir(IRTGI(IR_EQ), fr,
|
1731
1793
|
lj_ir_kint(J, (int32_t)frame_ftsz(J->L->base-1)));
|
1732
|
-
vbase = emitir(
|
1733
|
-
vbase = emitir(IRT(IR_ADD,
|
1794
|
+
vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr);
|
1795
|
+
vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase, lj_ir_kint(J, frofs-8));
|
1734
1796
|
for (i = 0; i < nload; i++) {
|
1735
|
-
IRType t = itype2irt(&J->L->base[i-1-nvararg]);
|
1736
|
-
TRef aref = emitir(IRT(IR_AREF,
|
1797
|
+
IRType t = itype2irt(&J->L->base[i-1-LJ_FR2-nvararg]);
|
1798
|
+
TRef aref = emitir(IRT(IR_AREF, IRT_PGC),
|
1737
1799
|
vbase, lj_ir_kint(J, (int32_t)i));
|
1738
1800
|
TRef tr = emitir(IRTG(IR_VLOAD, t), aref, 0);
|
1739
1801
|
if (irtype_ispri(t)) tr = TREF_PRI(t); /* Canonicalize primitives. */
|
@@ -1779,15 +1841,16 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
|
|
1779
1841
|
}
|
1780
1842
|
if (idx != 0 && idx <= nvararg) {
|
1781
1843
|
IRType t;
|
1782
|
-
TRef aref, vbase = emitir(
|
1783
|
-
vbase = emitir(IRT(IR_ADD,
|
1784
|
-
|
1785
|
-
|
1844
|
+
TRef aref, vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr);
|
1845
|
+
vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase,
|
1846
|
+
lj_ir_kint(J, frofs-(8<<LJ_FR2)));
|
1847
|
+
t = itype2irt(&J->L->base[idx-2-LJ_FR2-nvararg]);
|
1848
|
+
aref = emitir(IRT(IR_AREF, IRT_PGC), vbase, tridx);
|
1786
1849
|
tr = emitir(IRTG(IR_VLOAD, t), aref, 0);
|
1787
1850
|
if (irtype_ispri(t)) tr = TREF_PRI(t); /* Canonicalize primitives. */
|
1788
1851
|
}
|
1789
|
-
J->base[dst-2] = tr;
|
1790
|
-
J->maxslot = dst-1;
|
1852
|
+
J->base[dst-2-LJ_FR2] = tr;
|
1853
|
+
J->maxslot = dst-1-LJ_FR2;
|
1791
1854
|
J->bcskip = 2; /* Skip CALLM + select. */
|
1792
1855
|
} else {
|
1793
1856
|
nyivarg:
|
@@ -1836,10 +1899,10 @@ static TRef rec_cat(jit_State *J, BCReg baseslot, BCReg topslot)
|
|
1836
1899
|
break;
|
1837
1900
|
}
|
1838
1901
|
xbase = ++trp;
|
1839
|
-
tr = hdr = emitir(IRT(IR_BUFHDR,
|
1902
|
+
tr = hdr = emitir(IRT(IR_BUFHDR, IRT_PGC),
|
1840
1903
|
lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
|
1841
1904
|
do {
|
1842
|
-
tr = emitir(IRT(IR_BUFPUT,
|
1905
|
+
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, *trp++);
|
1843
1906
|
} while (trp <= top);
|
1844
1907
|
tr = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
|
1845
1908
|
J->maxslot = (BCReg)(xbase - J->base);
|
@@ -1880,7 +1943,15 @@ static void rec_comp_fixup(jit_State *J, const BCIns *pc, int cond)
|
|
1880
1943
|
const BCIns *npc = pc + 2 + (cond ? bc_j(jmpins) : 0);
|
1881
1944
|
SnapShot *snap = &J->cur.snap[J->cur.nsnap-1];
|
1882
1945
|
/* Set PC to opposite target to avoid re-recording the comp. in side trace. */
|
1946
|
+
#if LJ_FR2
|
1947
|
+
SnapEntry *flink = &J->cur.snapmap[snap->mapofs + snap->nent];
|
1948
|
+
uint64_t pcbase;
|
1949
|
+
memcpy(&pcbase, flink, sizeof(uint64_t));
|
1950
|
+
pcbase = (pcbase & 0xff) | (u64ptr(npc) << 8);
|
1951
|
+
memcpy(flink, &pcbase, sizeof(uint64_t));
|
1952
|
+
#else
|
1883
1953
|
J->cur.snapmap[snap->mapofs + snap->nent] = SNAP_MKPC(npc);
|
1954
|
+
#endif
|
1884
1955
|
J->needsnap = 1;
|
1885
1956
|
if (bc_a(jmpins) < J->maxslot) J->maxslot = bc_a(jmpins);
|
1886
1957
|
lj_snap_shrink(J); /* Shrink last snapshot if possible. */
|
@@ -2156,14 +2227,14 @@ void lj_record_ins(jit_State *J)
|
|
2156
2227
|
case BC_MODVN: case BC_MODVV:
|
2157
2228
|
recmod:
|
2158
2229
|
if (tref_isnumber_str(rb) && tref_isnumber_str(rc))
|
2159
|
-
rc = lj_opt_narrow_mod(J, rb, rc, rcv);
|
2230
|
+
rc = lj_opt_narrow_mod(J, rb, rc, rbv, rcv);
|
2160
2231
|
else
|
2161
2232
|
rc = rec_mm_arith(J, &ix, MM_mod);
|
2162
2233
|
break;
|
2163
2234
|
|
2164
2235
|
case BC_POW:
|
2165
2236
|
if (tref_isnumber_str(rb) && tref_isnumber_str(rc))
|
2166
|
-
rc = lj_opt_narrow_pow(J,
|
2237
|
+
rc = lj_opt_narrow_pow(J, rb, rc, rbv, rcv);
|
2167
2238
|
else
|
2168
2239
|
rc = rec_mm_arith(J, &ix, MM_pow);
|
2169
2240
|
break;
|
@@ -2178,7 +2249,13 @@ void lj_record_ins(jit_State *J)
|
|
2178
2249
|
|
2179
2250
|
case BC_MOV:
|
2180
2251
|
/* Clear gap of method call to avoid resurrecting previous refs. */
|
2181
|
-
if (ra > J->maxslot)
|
2252
|
+
if (ra > J->maxslot) {
|
2253
|
+
#if LJ_FR2
|
2254
|
+
memset(J->base + J->maxslot, 0, (ra - J->maxslot) * sizeof(TRef));
|
2255
|
+
#else
|
2256
|
+
J->base[ra-1] = 0;
|
2257
|
+
#endif
|
2258
|
+
}
|
2182
2259
|
break;
|
2183
2260
|
case BC_KSTR: case BC_KNUM: case BC_KPRI:
|
2184
2261
|
break;
|
@@ -2186,6 +2263,8 @@ void lj_record_ins(jit_State *J)
|
|
2186
2263
|
rc = lj_ir_kint(J, (int32_t)(int16_t)rc);
|
2187
2264
|
break;
|
2188
2265
|
case BC_KNIL:
|
2266
|
+
if (LJ_FR2 && ra > J->maxslot)
|
2267
|
+
J->base[ra-1] = 0;
|
2189
2268
|
while (ra <= rc)
|
2190
2269
|
J->base[ra++] = TREF_NIL;
|
2191
2270
|
if (rc >= J->maxslot) J->maxslot = rc+1;
|
@@ -2247,14 +2326,14 @@ void lj_record_ins(jit_State *J)
|
|
2247
2326
|
/* -- Calls and vararg handling ----------------------------------------- */
|
2248
2327
|
|
2249
2328
|
case BC_ITERC:
|
2250
|
-
J->base[ra] = getslot(J, ra-3
|
2251
|
-
J->base[ra+1] = getslot(J, ra-2
|
2252
|
-
J->base[ra+2] = getslot(J, ra-1
|
2329
|
+
J->base[ra] = getslot(J, ra-3);
|
2330
|
+
J->base[ra+1+LJ_FR2] = getslot(J, ra-2);
|
2331
|
+
J->base[ra+2+LJ_FR2] = getslot(J, ra-1);
|
2253
2332
|
{ /* Do the actual copy now because lj_record_call needs the values. */
|
2254
2333
|
TValue *b = &J->L->base[ra];
|
2255
|
-
copyTV(J->L, b, b-3
|
2256
|
-
copyTV(J->L, b+1, b-2
|
2257
|
-
copyTV(J->L, b+2, b-1
|
2334
|
+
copyTV(J->L, b, b-3);
|
2335
|
+
copyTV(J->L, b+1+LJ_FR2, b-2);
|
2336
|
+
copyTV(J->L, b+2+LJ_FR2, b-1);
|
2258
2337
|
}
|
2259
2338
|
lj_record_call(J, ra, (ptrdiff_t)rc-1);
|
2260
2339
|
break;
|
@@ -2377,7 +2456,12 @@ void lj_record_ins(jit_State *J)
|
|
2377
2456
|
/* rc == 0 if we have no result yet, e.g. pending __index metamethod call. */
|
2378
2457
|
if (bcmode_a(op) == BCMdst && rc) {
|
2379
2458
|
J->base[ra] = rc;
|
2380
|
-
if (ra >= J->maxslot)
|
2459
|
+
if (ra >= J->maxslot) {
|
2460
|
+
#if LJ_FR2
|
2461
|
+
if (ra > J->maxslot) J->base[ra-1] = 0;
|
2462
|
+
#endif
|
2463
|
+
J->maxslot = ra+1;
|
2464
|
+
}
|
2381
2465
|
}
|
2382
2466
|
|
2383
2467
|
#undef rav
|
@@ -2462,7 +2546,7 @@ void lj_record_setup(jit_State *J)
|
|
2462
2546
|
J->scev.idx = REF_NIL;
|
2463
2547
|
setmref(J->scev.pc, NULL);
|
2464
2548
|
|
2465
|
-
J->baseslot = 1; /* Invoking function is at base[-1]. */
|
2549
|
+
J->baseslot = 1+LJ_FR2; /* Invoking function is at base[-1-LJ_FR2]. */
|
2466
2550
|
J->base = J->slot + J->baseslot;
|
2467
2551
|
J->maxslot = 0;
|
2468
2552
|
J->framedepth = 0;
|
@@ -2477,7 +2561,7 @@ void lj_record_setup(jit_State *J)
|
|
2477
2561
|
J->bc_extent = ~(MSize)0;
|
2478
2562
|
|
2479
2563
|
/* Emit instructions for fixed references. Also triggers initial IR alloc. */
|
2480
|
-
emitir_raw(IRT(IR_BASE,
|
2564
|
+
emitir_raw(IRT(IR_BASE, IRT_PGC), J->parent, J->exitno);
|
2481
2565
|
for (i = 0; i <= 2; i++) {
|
2482
2566
|
IRIns *ir = IR(REF_NIL-i);
|
2483
2567
|
ir->i = 0;
|