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
|
** String library.
|
|
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
|
|
@@ -737,10 +737,6 @@ LUALIB_API int luaopen_string(lua_State *L)
|
|
|
737
737
|
GCtab *mt;
|
|
738
738
|
global_State *g;
|
|
739
739
|
LJ_LIB_REG(L, LUA_STRLIBNAME, string);
|
|
740
|
-
#if defined(LUA_COMPAT_GFIND) && !LJ_52
|
|
741
|
-
lua_getfield(L, -1, "gmatch");
|
|
742
|
-
lua_setfield(L, -2, "gfind");
|
|
743
|
-
#endif
|
|
744
740
|
mt = lj_tab_new(L, 0, 1);
|
|
745
741
|
/* NOBARRIER: basemt is a GC root. */
|
|
746
742
|
g = G(L);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
** Table library.
|
|
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
|
|
@@ -129,6 +129,26 @@ LJLIB_LUA(table_remove) /*
|
|
|
129
129
|
end
|
|
130
130
|
*/
|
|
131
131
|
|
|
132
|
+
LJLIB_LUA(table_move) /*
|
|
133
|
+
function(a1, f, e, t, a2)
|
|
134
|
+
CHECK_tab(a1)
|
|
135
|
+
CHECK_int(f)
|
|
136
|
+
CHECK_int(e)
|
|
137
|
+
CHECK_int(t)
|
|
138
|
+
if a2 == nil then a2 = a1 end
|
|
139
|
+
CHECK_tab(a2)
|
|
140
|
+
if e >= f then
|
|
141
|
+
local d = t - f
|
|
142
|
+
if t > e or t <= f or a2 ~= a1 then
|
|
143
|
+
for i=f,e do a2[i+d] = a1[i] end
|
|
144
|
+
else
|
|
145
|
+
for i=e,f,-1 do a2[i+d] = a1[i] end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
return a2
|
|
149
|
+
end
|
|
150
|
+
*/
|
|
151
|
+
|
|
132
152
|
LJLIB_CF(table_concat) LJLIB_REC(.)
|
|
133
153
|
{
|
|
134
154
|
GCtab *t = lj_lib_checktab(L, 1);
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
{
|
|
28
28
|
Optimized string compare
|
|
29
29
|
Memcheck:Addr4
|
|
30
|
-
fun:
|
|
30
|
+
fun:str_fastcmp
|
|
31
31
|
}
|
|
32
32
|
{
|
|
33
33
|
Optimized string compare
|
|
34
34
|
Memcheck:Addr1
|
|
35
|
-
fun:
|
|
35
|
+
fun:str_fastcmp
|
|
36
36
|
}
|
|
37
37
|
{
|
|
38
38
|
Optimized string compare
|
|
39
39
|
Memcheck:Cond
|
|
40
|
-
fun:
|
|
40
|
+
fun:str_fastcmp
|
|
41
41
|
}
|
|
@@ -72,13 +72,56 @@
|
|
|
72
72
|
|
|
73
73
|
#define IS_DIRECT_BIT (SIZE_T_ONE)
|
|
74
74
|
|
|
75
|
+
|
|
76
|
+
/* Determine system-specific block allocation method. */
|
|
75
77
|
#if LJ_TARGET_WINDOWS
|
|
76
78
|
|
|
77
79
|
#define WIN32_LEAN_AND_MEAN
|
|
78
80
|
#include <windows.h>
|
|
79
81
|
|
|
82
|
+
#define LJ_ALLOC_VIRTUALALLOC 1
|
|
83
|
+
|
|
80
84
|
#if LJ_64 && !LJ_GC64
|
|
85
|
+
#define LJ_ALLOC_NTAVM 1
|
|
86
|
+
#endif
|
|
87
|
+
|
|
88
|
+
#else
|
|
89
|
+
|
|
90
|
+
#include <errno.h>
|
|
91
|
+
/* If this include fails, then rebuild with: -DLUAJIT_USE_SYSMALLOC */
|
|
92
|
+
#include <sys/mman.h>
|
|
93
|
+
|
|
94
|
+
#define LJ_ALLOC_MMAP 1
|
|
95
|
+
|
|
96
|
+
#if LJ_64
|
|
97
|
+
|
|
98
|
+
#define LJ_ALLOC_MMAP_PROBE 1
|
|
99
|
+
|
|
100
|
+
#if LJ_GC64
|
|
101
|
+
#define LJ_ALLOC_MBITS 47 /* 128 TB in LJ_GC64 mode. */
|
|
102
|
+
#elif LJ_TARGET_X64 && LJ_HASJIT
|
|
103
|
+
/* Due to limitations in the x64 compiler backend. */
|
|
104
|
+
#define LJ_ALLOC_MBITS 31 /* 2 GB on x64 with !LJ_GC64. */
|
|
105
|
+
#else
|
|
106
|
+
#define LJ_ALLOC_MBITS 32 /* 4 GB on other archs with !LJ_GC64. */
|
|
107
|
+
#endif
|
|
108
|
+
|
|
109
|
+
#endif
|
|
110
|
+
|
|
111
|
+
#if LJ_64 && !LJ_GC64 && defined(MAP_32BIT)
|
|
112
|
+
#define LJ_ALLOC_MMAP32 1
|
|
113
|
+
#endif
|
|
114
|
+
|
|
115
|
+
#if LJ_TARGET_LINUX
|
|
116
|
+
#define LJ_ALLOC_MREMAP 1
|
|
117
|
+
#endif
|
|
118
|
+
|
|
119
|
+
#endif
|
|
81
120
|
|
|
121
|
+
|
|
122
|
+
#if LJ_ALLOC_VIRTUALALLOC
|
|
123
|
+
|
|
124
|
+
#if LJ_ALLOC_NTAVM
|
|
82
125
|
/* Undocumented, but hey, that's what we all love so much about Windows. */
|
|
83
126
|
typedef long (*PNTAVM)(HANDLE handle, void **addr, ULONG zbits,
|
|
84
127
|
size_t *size, ULONG alloctype, ULONG prot);
|
|
@@ -89,14 +132,15 @@ static PNTAVM ntavm;
|
|
|
89
132
|
*/
|
|
90
133
|
#define NTAVM_ZEROBITS 1
|
|
91
134
|
|
|
92
|
-
static void
|
|
135
|
+
static void init_mmap(void)
|
|
93
136
|
{
|
|
94
137
|
ntavm = (PNTAVM)GetProcAddress(GetModuleHandleA("ntdll.dll"),
|
|
95
138
|
"NtAllocateVirtualMemory");
|
|
96
139
|
}
|
|
140
|
+
#define INIT_MMAP() init_mmap()
|
|
97
141
|
|
|
98
142
|
/* Win64 32 bit MMAP via NtAllocateVirtualMemory. */
|
|
99
|
-
static
|
|
143
|
+
static void *CALL_MMAP(size_t size)
|
|
100
144
|
{
|
|
101
145
|
DWORD olderr = GetLastError();
|
|
102
146
|
void *ptr = NULL;
|
|
@@ -107,7 +151,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
|
|
|
107
151
|
}
|
|
108
152
|
|
|
109
153
|
/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
|
|
110
|
-
static
|
|
154
|
+
static void *DIRECT_MMAP(size_t size)
|
|
111
155
|
{
|
|
112
156
|
DWORD olderr = GetLastError();
|
|
113
157
|
void *ptr = NULL;
|
|
@@ -119,10 +163,8 @@ static LJ_AINLINE void *DIRECT_MMAP(size_t size)
|
|
|
119
163
|
|
|
120
164
|
#else
|
|
121
165
|
|
|
122
|
-
#define INIT_MMAP() ((void)0)
|
|
123
|
-
|
|
124
166
|
/* Win32 MMAP via VirtualAlloc */
|
|
125
|
-
static
|
|
167
|
+
static void *CALL_MMAP(size_t size)
|
|
126
168
|
{
|
|
127
169
|
DWORD olderr = GetLastError();
|
|
128
170
|
void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
|
|
@@ -131,7 +173,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
|
|
|
131
173
|
}
|
|
132
174
|
|
|
133
175
|
/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
|
|
134
|
-
static
|
|
176
|
+
static void *DIRECT_MMAP(size_t size)
|
|
135
177
|
{
|
|
136
178
|
DWORD olderr = GetLastError();
|
|
137
179
|
void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
|
|
@@ -143,7 +185,7 @@ static LJ_AINLINE void *DIRECT_MMAP(size_t size)
|
|
|
143
185
|
#endif
|
|
144
186
|
|
|
145
187
|
/* This function supports releasing coalesed segments */
|
|
146
|
-
static
|
|
188
|
+
static int CALL_MUNMAP(void *ptr, size_t size)
|
|
147
189
|
{
|
|
148
190
|
DWORD olderr = GetLastError();
|
|
149
191
|
MEMORY_BASIC_INFORMATION minfo;
|
|
@@ -163,10 +205,7 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
|
|
|
163
205
|
return 0;
|
|
164
206
|
}
|
|
165
207
|
|
|
166
|
-
#
|
|
167
|
-
|
|
168
|
-
#include <errno.h>
|
|
169
|
-
#include <sys/mman.h>
|
|
208
|
+
#elif LJ_ALLOC_MMAP
|
|
170
209
|
|
|
171
210
|
#define MMAP_PROT (PROT_READ|PROT_WRITE)
|
|
172
211
|
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
|
|
@@ -174,107 +213,151 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
|
|
|
174
213
|
#endif
|
|
175
214
|
#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS)
|
|
176
215
|
|
|
177
|
-
#if
|
|
178
|
-
/* 64 bit mode with 32 bit pointers needs special support for allocating
|
|
179
|
-
** memory in the lower 2GB.
|
|
180
|
-
*/
|
|
181
|
-
|
|
182
|
-
#if defined(MAP_32BIT)
|
|
216
|
+
#if LJ_ALLOC_MMAP_PROBE
|
|
183
217
|
|
|
184
|
-
#
|
|
185
|
-
#define
|
|
218
|
+
#ifdef MAP_TRYFIXED
|
|
219
|
+
#define MMAP_FLAGS_PROBE (MMAP_FLAGS|MAP_TRYFIXED)
|
|
186
220
|
#else
|
|
187
|
-
|
|
188
|
-
#define MMAP_REGION_START ((uintptr_t)0)
|
|
221
|
+
#define MMAP_FLAGS_PROBE MMAP_FLAGS
|
|
189
222
|
#endif
|
|
190
223
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
int olderr = errno;
|
|
194
|
-
void *ptr = mmap((void *)MMAP_REGION_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
|
|
195
|
-
errno = olderr;
|
|
196
|
-
return ptr;
|
|
197
|
-
}
|
|
224
|
+
#define LJ_ALLOC_MMAP_PROBE_MAX 30
|
|
225
|
+
#define LJ_ALLOC_MMAP_PROBE_LINEAR 5
|
|
198
226
|
|
|
199
|
-
#
|
|
227
|
+
#define LJ_ALLOC_MMAP_PROBE_LOWER ((uintptr_t)0x4000)
|
|
200
228
|
|
|
201
|
-
/*
|
|
202
|
-
**
|
|
203
|
-
**
|
|
204
|
-
** to be reduced to 250MB on FreeBSD.
|
|
229
|
+
/* No point in a giant ifdef mess. Just try to open /dev/urandom.
|
|
230
|
+
** It doesn't really matter if this fails, since we get some ASLR bits from
|
|
231
|
+
** every unsuitable allocation, too. And we prefer linear allocation, anyway.
|
|
205
232
|
*/
|
|
206
|
-
#
|
|
207
|
-
#
|
|
208
|
-
#elif LJ_TARGET_PS4
|
|
209
|
-
#define MMAP_REGION_START ((uintptr_t)0x4000)
|
|
210
|
-
#else
|
|
211
|
-
#define MMAP_REGION_START ((uintptr_t)0x10000000)
|
|
212
|
-
#endif
|
|
213
|
-
#define MMAP_REGION_END ((uintptr_t)0x80000000)
|
|
233
|
+
#include <fcntl.h>
|
|
234
|
+
#include <unistd.h>
|
|
214
235
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
236
|
+
static uintptr_t mmap_probe_seed(void)
|
|
237
|
+
{
|
|
238
|
+
uintptr_t val;
|
|
239
|
+
int fd = open("/dev/urandom", O_RDONLY);
|
|
240
|
+
if (fd != -1) {
|
|
241
|
+
int ok = ((size_t)read(fd, &val, sizeof(val)) == sizeof(val));
|
|
242
|
+
(void)close(fd);
|
|
243
|
+
if (ok) return val;
|
|
244
|
+
}
|
|
245
|
+
return 1; /* Punt. */
|
|
246
|
+
}
|
|
218
247
|
|
|
219
|
-
static
|
|
248
|
+
static void *mmap_probe(size_t size)
|
|
220
249
|
{
|
|
221
|
-
int olderr = errno;
|
|
222
250
|
/* Hint for next allocation. Doesn't need to be thread-safe. */
|
|
223
|
-
static uintptr_t
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
#endif
|
|
234
|
-
for (;;) {
|
|
235
|
-
void *p = mmap((void *)alloc_hint, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
|
|
236
|
-
if ((uintptr_t)p >= MMAP_REGION_START &&
|
|
237
|
-
(uintptr_t)p + size < MMAP_REGION_END) {
|
|
238
|
-
alloc_hint = (uintptr_t)p + size;
|
|
251
|
+
static uintptr_t hint_addr = 0;
|
|
252
|
+
static uintptr_t hint_prng = 0;
|
|
253
|
+
int olderr = errno;
|
|
254
|
+
int retry;
|
|
255
|
+
for (retry = 0; retry < LJ_ALLOC_MMAP_PROBE_MAX; retry++) {
|
|
256
|
+
void *p = mmap((void *)hint_addr, size, MMAP_PROT, MMAP_FLAGS_PROBE, -1, 0);
|
|
257
|
+
uintptr_t addr = (uintptr_t)p;
|
|
258
|
+
if ((addr >> LJ_ALLOC_MBITS) == 0 && addr >= LJ_ALLOC_MMAP_PROBE_LOWER) {
|
|
259
|
+
/* We got a suitable address. Bump the hint address. */
|
|
260
|
+
hint_addr = addr + size;
|
|
239
261
|
errno = olderr;
|
|
240
262
|
return p;
|
|
241
263
|
}
|
|
242
|
-
if (p !=
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
if (
|
|
248
|
-
|
|
249
|
-
|
|
264
|
+
if (p != MFAIL) {
|
|
265
|
+
munmap(p, size);
|
|
266
|
+
} else if (errno == ENOMEM) {
|
|
267
|
+
return MFAIL;
|
|
268
|
+
}
|
|
269
|
+
if (hint_addr) {
|
|
270
|
+
/* First, try linear probing. */
|
|
271
|
+
if (retry < LJ_ALLOC_MMAP_PROBE_LINEAR) {
|
|
272
|
+
hint_addr += 0x1000000;
|
|
273
|
+
if (((hint_addr + size) >> LJ_ALLOC_MBITS) != 0)
|
|
274
|
+
hint_addr = 0;
|
|
275
|
+
continue;
|
|
276
|
+
} else if (retry == LJ_ALLOC_MMAP_PROBE_LINEAR) {
|
|
277
|
+
/* Next, try a no-hint probe to get back an ASLR address. */
|
|
278
|
+
hint_addr = 0;
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/* Finally, try pseudo-random probing. */
|
|
283
|
+
if (LJ_UNLIKELY(hint_prng == 0)) {
|
|
284
|
+
hint_prng = mmap_probe_seed();
|
|
285
|
+
}
|
|
286
|
+
/* The unsuitable address we got has some ASLR PRNG bits. */
|
|
287
|
+
hint_addr ^= addr & ~((uintptr_t)(LJ_PAGESIZE-1));
|
|
288
|
+
do { /* The PRNG itself is very weak, but see above. */
|
|
289
|
+
hint_prng = hint_prng * 1103515245 + 12345;
|
|
290
|
+
hint_addr ^= hint_prng * (uintptr_t)LJ_PAGESIZE;
|
|
291
|
+
hint_addr &= (((uintptr_t)1 << LJ_ALLOC_MBITS)-1);
|
|
292
|
+
} while (hint_addr < LJ_ALLOC_MMAP_PROBE_LOWER);
|
|
250
293
|
}
|
|
251
294
|
errno = olderr;
|
|
252
|
-
return
|
|
295
|
+
return MFAIL;
|
|
253
296
|
}
|
|
254
297
|
|
|
298
|
+
#endif
|
|
299
|
+
|
|
300
|
+
#if LJ_ALLOC_MMAP32
|
|
301
|
+
|
|
302
|
+
#if defined(__sun__)
|
|
303
|
+
#define LJ_ALLOC_MMAP32_START ((uintptr_t)0x1000)
|
|
255
304
|
#else
|
|
305
|
+
#define LJ_ALLOC_MMAP32_START ((uintptr_t)0)
|
|
306
|
+
#endif
|
|
256
307
|
|
|
257
|
-
|
|
308
|
+
static void *mmap_map32(size_t size)
|
|
309
|
+
{
|
|
310
|
+
#if LJ_ALLOC_MMAP_PROBE
|
|
311
|
+
static int fallback = 0;
|
|
312
|
+
if (fallback)
|
|
313
|
+
return mmap_probe(size);
|
|
314
|
+
#endif
|
|
315
|
+
{
|
|
316
|
+
int olderr = errno;
|
|
317
|
+
void *ptr = mmap((void *)LJ_ALLOC_MMAP32_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
|
|
318
|
+
errno = olderr;
|
|
319
|
+
/* This only allows 1GB on Linux. So fallback to probing to get 2GB. */
|
|
320
|
+
#if LJ_ALLOC_MMAP_PROBE
|
|
321
|
+
if (ptr == MFAIL) {
|
|
322
|
+
fallback = 1;
|
|
323
|
+
return mmap_probe(size);
|
|
324
|
+
}
|
|
325
|
+
#endif
|
|
326
|
+
return ptr;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
258
329
|
|
|
259
330
|
#endif
|
|
260
331
|
|
|
332
|
+
#if LJ_ALLOC_MMAP32
|
|
333
|
+
#define CALL_MMAP(size) mmap_map32(size)
|
|
334
|
+
#elif LJ_ALLOC_MMAP_PROBE
|
|
335
|
+
#define CALL_MMAP(size) mmap_probe(size)
|
|
261
336
|
#else
|
|
262
|
-
|
|
263
|
-
/* 32 bit mode and GC64 mode is easy. */
|
|
264
|
-
static LJ_AINLINE void *CALL_MMAP(size_t size)
|
|
337
|
+
static void *CALL_MMAP(size_t size)
|
|
265
338
|
{
|
|
266
339
|
int olderr = errno;
|
|
267
340
|
void *ptr = mmap(NULL, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
|
|
268
341
|
errno = olderr;
|
|
269
342
|
return ptr;
|
|
270
343
|
}
|
|
271
|
-
|
|
272
344
|
#endif
|
|
273
345
|
|
|
274
|
-
#
|
|
275
|
-
|
|
346
|
+
#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
|
|
347
|
+
|
|
348
|
+
#include <sys/resource.h>
|
|
349
|
+
|
|
350
|
+
static void init_mmap(void)
|
|
351
|
+
{
|
|
352
|
+
struct rlimit rlim;
|
|
353
|
+
rlim.rlim_cur = rlim.rlim_max = 0x10000;
|
|
354
|
+
setrlimit(RLIMIT_DATA, &rlim); /* Ignore result. May fail later. */
|
|
355
|
+
}
|
|
356
|
+
#define INIT_MMAP() init_mmap()
|
|
357
|
+
|
|
358
|
+
#endif
|
|
276
359
|
|
|
277
|
-
static
|
|
360
|
+
static int CALL_MUNMAP(void *ptr, size_t size)
|
|
278
361
|
{
|
|
279
362
|
int olderr = errno;
|
|
280
363
|
int ret = munmap(ptr, size);
|
|
@@ -282,10 +365,9 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
|
|
|
282
365
|
return ret;
|
|
283
366
|
}
|
|
284
367
|
|
|
285
|
-
#if
|
|
368
|
+
#if LJ_ALLOC_MREMAP
|
|
286
369
|
/* Need to define _GNU_SOURCE to get the mremap prototype. */
|
|
287
|
-
static
|
|
288
|
-
int flags)
|
|
370
|
+
static void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz, int flags)
|
|
289
371
|
{
|
|
290
372
|
int olderr = errno;
|
|
291
373
|
ptr = mremap(ptr, osz, nsz, flags);
|
|
@@ -305,6 +387,15 @@ static LJ_AINLINE void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz,
|
|
|
305
387
|
|
|
306
388
|
#endif
|
|
307
389
|
|
|
390
|
+
|
|
391
|
+
#ifndef INIT_MMAP
|
|
392
|
+
#define INIT_MMAP() ((void)0)
|
|
393
|
+
#endif
|
|
394
|
+
|
|
395
|
+
#ifndef DIRECT_MMAP
|
|
396
|
+
#define DIRECT_MMAP(s) CALL_MMAP(s)
|
|
397
|
+
#endif
|
|
398
|
+
|
|
308
399
|
#ifndef CALL_MREMAP
|
|
309
400
|
#define CALL_MREMAP(addr, osz, nsz, mv) ((void)osz, MFAIL)
|
|
310
401
|
#endif
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
** Public Lua/C API.
|
|
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
|
|
@@ -112,6 +112,13 @@ LUA_API void lua_xmove(lua_State *from, lua_State *to, int n)
|
|
|
112
112
|
from->top = f;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
LUA_API const lua_Number *lua_version(lua_State *L)
|
|
116
|
+
{
|
|
117
|
+
static const lua_Number version = LUA_VERSION_NUM;
|
|
118
|
+
UNUSED(L);
|
|
119
|
+
return &version;
|
|
120
|
+
}
|
|
121
|
+
|
|
115
122
|
/* -- Stack manipulation -------------------------------------------------- */
|
|
116
123
|
|
|
117
124
|
LUA_API int lua_gettop(lua_State *L)
|
|
@@ -152,30 +159,40 @@ LUA_API void lua_insert(lua_State *L, int idx)
|
|
|
152
159
|
copyTV(L, p, L->top);
|
|
153
160
|
}
|
|
154
161
|
|
|
155
|
-
|
|
162
|
+
static void copy_slot(lua_State *L, TValue *f, int idx)
|
|
156
163
|
{
|
|
157
|
-
api_checknelems(L, 1);
|
|
158
164
|
if (idx == LUA_GLOBALSINDEX) {
|
|
159
|
-
api_check(L, tvistab(
|
|
165
|
+
api_check(L, tvistab(f));
|
|
160
166
|
/* NOBARRIER: A thread (i.e. L) is never black. */
|
|
161
|
-
setgcref(L->env, obj2gco(tabV(
|
|
167
|
+
setgcref(L->env, obj2gco(tabV(f)));
|
|
162
168
|
} else if (idx == LUA_ENVIRONINDEX) {
|
|
163
169
|
GCfunc *fn = curr_func(L);
|
|
164
170
|
if (fn->c.gct != ~LJ_TFUNC)
|
|
165
171
|
lj_err_msg(L, LJ_ERR_NOENV);
|
|
166
|
-
api_check(L, tvistab(
|
|
167
|
-
setgcref(fn->c.env, obj2gco(tabV(
|
|
168
|
-
lj_gc_barrier(L, fn,
|
|
172
|
+
api_check(L, tvistab(f));
|
|
173
|
+
setgcref(fn->c.env, obj2gco(tabV(f)));
|
|
174
|
+
lj_gc_barrier(L, fn, f);
|
|
169
175
|
} else {
|
|
170
176
|
TValue *o = index2adr(L, idx);
|
|
171
177
|
api_checkvalidindex(L, o);
|
|
172
|
-
copyTV(L, o,
|
|
178
|
+
copyTV(L, o, f);
|
|
173
179
|
if (idx < LUA_GLOBALSINDEX) /* Need a barrier for upvalues. */
|
|
174
|
-
lj_gc_barrier(L, curr_func(L),
|
|
180
|
+
lj_gc_barrier(L, curr_func(L), f);
|
|
175
181
|
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
LUA_API void lua_replace(lua_State *L, int idx)
|
|
185
|
+
{
|
|
186
|
+
api_checknelems(L, 1);
|
|
187
|
+
copy_slot(L, L->top - 1, idx);
|
|
176
188
|
L->top--;
|
|
177
189
|
}
|
|
178
190
|
|
|
191
|
+
LUA_API void lua_copy(lua_State *L, int fromidx, int toidx)
|
|
192
|
+
{
|
|
193
|
+
copy_slot(L, index2adr(L, fromidx), toidx);
|
|
194
|
+
}
|
|
195
|
+
|
|
179
196
|
LUA_API void lua_pushvalue(lua_State *L, int idx)
|
|
180
197
|
{
|
|
181
198
|
copyTV(L, L->top, index2adr(L, idx));
|
|
@@ -325,6 +342,22 @@ LUA_API lua_Number lua_tonumber(lua_State *L, int idx)
|
|
|
325
342
|
return 0;
|
|
326
343
|
}
|
|
327
344
|
|
|
345
|
+
LUA_API lua_Number lua_tonumberx(lua_State *L, int idx, int *ok)
|
|
346
|
+
{
|
|
347
|
+
cTValue *o = index2adr(L, idx);
|
|
348
|
+
TValue tmp;
|
|
349
|
+
if (LJ_LIKELY(tvisnumber(o))) {
|
|
350
|
+
if (ok) *ok = 1;
|
|
351
|
+
return numberVnum(o);
|
|
352
|
+
} else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp)) {
|
|
353
|
+
if (ok) *ok = 1;
|
|
354
|
+
return numV(&tmp);
|
|
355
|
+
} else {
|
|
356
|
+
if (ok) *ok = 0;
|
|
357
|
+
return 0;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
328
361
|
LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)
|
|
329
362
|
{
|
|
330
363
|
cTValue *o = index2adr(L, idx);
|
|
@@ -362,7 +395,7 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
|
|
|
362
395
|
if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))
|
|
363
396
|
return 0;
|
|
364
397
|
if (tvisint(&tmp))
|
|
365
|
-
return
|
|
398
|
+
return intV(&tmp);
|
|
366
399
|
n = numV(&tmp);
|
|
367
400
|
}
|
|
368
401
|
#if LJ_64
|
|
@@ -372,6 +405,35 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
|
|
|
372
405
|
#endif
|
|
373
406
|
}
|
|
374
407
|
|
|
408
|
+
LUA_API lua_Integer lua_tointegerx(lua_State *L, int idx, int *ok)
|
|
409
|
+
{
|
|
410
|
+
cTValue *o = index2adr(L, idx);
|
|
411
|
+
TValue tmp;
|
|
412
|
+
lua_Number n;
|
|
413
|
+
if (LJ_LIKELY(tvisint(o))) {
|
|
414
|
+
if (ok) *ok = 1;
|
|
415
|
+
return intV(o);
|
|
416
|
+
} else if (LJ_LIKELY(tvisnum(o))) {
|
|
417
|
+
n = numV(o);
|
|
418
|
+
} else {
|
|
419
|
+
if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) {
|
|
420
|
+
if (ok) *ok = 0;
|
|
421
|
+
return 0;
|
|
422
|
+
}
|
|
423
|
+
if (tvisint(&tmp)) {
|
|
424
|
+
if (ok) *ok = 1;
|
|
425
|
+
return intV(&tmp);
|
|
426
|
+
}
|
|
427
|
+
n = numV(&tmp);
|
|
428
|
+
}
|
|
429
|
+
if (ok) *ok = 1;
|
|
430
|
+
#if LJ_64
|
|
431
|
+
return (lua_Integer)n;
|
|
432
|
+
#else
|
|
433
|
+
return lj_num2int(n);
|
|
434
|
+
#endif
|
|
435
|
+
}
|
|
436
|
+
|
|
375
437
|
LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx)
|
|
376
438
|
{
|
|
377
439
|
cTValue *o = index2adr(L, idx);
|
|
@@ -858,7 +920,7 @@ LUA_API void lua_upvaluejoin(lua_State *L, int idx1, int n1, int idx2, int n2)
|
|
|
858
920
|
lj_gc_objbarrier(L, fn1, gcref(fn1->l.uvptr[n1]));
|
|
859
921
|
}
|
|
860
922
|
|
|
861
|
-
LUALIB_API void *
|
|
923
|
+
LUALIB_API void *luaL_testudata(lua_State *L, int idx, const char *tname)
|
|
862
924
|
{
|
|
863
925
|
cTValue *o = index2adr(L, idx);
|
|
864
926
|
if (tvisudata(o)) {
|
|
@@ -867,8 +929,14 @@ LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
|
|
|
867
929
|
if (tv && tvistab(tv) && tabV(tv) == tabref(ud->metatable))
|
|
868
930
|
return uddata(ud);
|
|
869
931
|
}
|
|
870
|
-
|
|
871
|
-
|
|
932
|
+
return NULL; /* value is not a userdata with a metatable */
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
|
|
936
|
+
{
|
|
937
|
+
void *p = luaL_testudata(L, idx, tname);
|
|
938
|
+
if (!p) lj_err_argtype(L, idx, tname);
|
|
939
|
+
return p;
|
|
872
940
|
}
|
|
873
941
|
|
|
874
942
|
/* -- Object setters ------------------------------------------------------ */
|
|
@@ -977,6 +1045,12 @@ LUA_API int lua_setmetatable(lua_State *L, int idx)
|
|
|
977
1045
|
return 1;
|
|
978
1046
|
}
|
|
979
1047
|
|
|
1048
|
+
LUALIB_API void luaL_setmetatable(lua_State *L, const char *tname)
|
|
1049
|
+
{
|
|
1050
|
+
lua_getfield(L, LUA_REGISTRYINDEX, tname);
|
|
1051
|
+
lua_setmetatable(L, -2);
|
|
1052
|
+
}
|
|
1053
|
+
|
|
980
1054
|
LUA_API int lua_setfenv(lua_State *L, int idx)
|
|
981
1055
|
{
|
|
982
1056
|
cTValue *o = index2adr(L, idx);
|
|
@@ -1032,7 +1106,7 @@ static TValue *api_call_base(lua_State *L, int nargs)
|
|
|
1032
1106
|
|
|
1033
1107
|
LUA_API void lua_call(lua_State *L, int nargs, int nresults)
|
|
1034
1108
|
{
|
|
1035
|
-
api_check(L, L->status ==
|
|
1109
|
+
api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
|
|
1036
1110
|
api_checknelems(L, nargs+1);
|
|
1037
1111
|
lj_vm_call(L, api_call_base(L, nargs), nresults+1);
|
|
1038
1112
|
}
|
|
@@ -1043,7 +1117,7 @@ LUA_API int lua_pcall(lua_State *L, int nargs, int nresults, int errfunc)
|
|
|
1043
1117
|
uint8_t oldh = hook_save(g);
|
|
1044
1118
|
ptrdiff_t ef;
|
|
1045
1119
|
int status;
|
|
1046
|
-
api_check(L, L->status ==
|
|
1120
|
+
api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
|
|
1047
1121
|
api_checknelems(L, nargs+1);
|
|
1048
1122
|
if (errfunc == 0) {
|
|
1049
1123
|
ef = 0;
|
|
@@ -1075,7 +1149,7 @@ LUA_API int lua_cpcall(lua_State *L, lua_CFunction func, void *ud)
|
|
|
1075
1149
|
global_State *g = G(L);
|
|
1076
1150
|
uint8_t oldh = hook_save(g);
|
|
1077
1151
|
int status;
|
|
1078
|
-
api_check(L, L->status ==
|
|
1152
|
+
api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
|
|
1079
1153
|
status = lj_vm_cpcall(L, func, ud, cpcall);
|
|
1080
1154
|
if (status) hook_restore(g, oldh);
|
|
1081
1155
|
return status;
|
|
@@ -1096,6 +1170,11 @@ LUALIB_API int luaL_callmeta(lua_State *L, int idx, const char *field)
|
|
|
1096
1170
|
|
|
1097
1171
|
/* -- Coroutine yield and resume ------------------------------------------ */
|
|
1098
1172
|
|
|
1173
|
+
LUA_API int lua_isyieldable(lua_State *L)
|
|
1174
|
+
{
|
|
1175
|
+
return cframe_canyield(L->cframe);
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1099
1178
|
LUA_API int lua_yield(lua_State *L, int nresults)
|
|
1100
1179
|
{
|
|
1101
1180
|
void *cf = L->cframe;
|
|
@@ -1140,7 +1219,7 @@ LUA_API int lua_resume(lua_State *L, int nargs)
|
|
|
1140
1219
|
{
|
|
1141
1220
|
if (L->cframe == NULL && L->status <= LUA_YIELD)
|
|
1142
1221
|
return lj_vm_resume(L,
|
|
1143
|
-
L->status ==
|
|
1222
|
+
L->status == LUA_OK ? api_call_base(L, nargs) : L->top - nargs,
|
|
1144
1223
|
0, 0);
|
|
1145
1224
|
L->top = L->base;
|
|
1146
1225
|
setstrV(L, L->top, lj_err_str(L, LJ_ERR_COSUSP));
|