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
|
** 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));
|