diff -r lua-5.3.3/Makefile lua-5.3.4/Makefile
49c49
< R= $V.3
---
> R= $V.4
diff -r lua-5.3.3/README lua-5.3.4/README
2c2
< This is Lua 5.3.3, released on 30 May 2016.
---
> This is Lua 5.3.4, released on 12 Jan 2017.
diff -r lua-5.3.3/doc/contents.html lua-5.3.4/doc/contents.html
35c35
< Copyright © 2015–2016 Lua.org, PUC-Rio.
---
> Copyright © 2015–2017 Lua.org, PUC-Rio.
514a515
> luaL_opt
611c612
< Thu Jan 14 10:14:28 BRST 2016
---
> Thu Dec 22 18:29:39 BRST 2016
614c615
< Last change: revised for Lua 5.3.3
---
> Last change: revised for Lua 5.3.4
Binary files lua-5.3.3/doc/logo.gif and lua-5.3.4/doc/logo.gif differ
diff -r lua-5.3.3/doc/lua.1 lua-5.3.4/doc/lua.1
1c1,2
< .TH LUA 1 "$Date: 2014/12/10 15:55:45 $"
---
> .\" $Id: lua.man,v 1.14 2016/10/17 15:43:50 lhf Exp $
> .TH LUA 1 "$Date: 2016/10/17 15:43:50 $"
diff -r lua-5.3.3/doc/manual.html lua-5.3.4/doc/manual.html
22c22
< Copyright © 2015–2016 Lua.org, PUC-Rio.
---
> Copyright © 2015–2017 Lua.org, PUC-Rio.
38c38
<
---
>
219c219
< they can be used to represent ordinary arrays, sequences,
---
> they can be used to represent ordinary arrays, lists,
229,235d228
< We use the term sequence to denote a table where
< the set of all positive numeric keys is equal to {1..n}
< for some non-negative integer n,
< which is called the length of the sequence (see §3.4.7).
<
<
<
380a374,376
> (The message handler is called only for regular runtime errors.
> It is not called for memory-allocation errors
> nor for errors while running finalizers.)
876c872
< Values, such as numbers and light C functions,
---
> Values, such as numbers and light C functions,
1087c1083
< programs should avoid creating
---
> programs should avoid creating
1104c1100
< Literal strings
---
> A short literal string
1117c1113
< A backslash followed by a real newline
---
> A backslash followed by a line break
1124a1121,1122
> A short literal string cannot contain unescaped line breaks
> nor escapes not forming a valid escape sequence.
1128,1131c1126,1127
< Strings in Lua can contain any 8-bit value, including embedded zeros,
< which can be specified as '\0
'.
< More generally,
< we can specify any byte in a literal string by its numeric value.
---
> We can specify any byte in a short literal string by its numeric value
> (including embedded zeros).
1175,1185d1170
< Any byte in a literal string not
< explicitly affected by the previous rules represents itself.
< However, Lua opens files for parsing in text mode,
< and the system file functions may have problems with
< some control characters.
< So, it is safer to represent
< non-text data as a quoted literal with
< explicit escape sequences for the non-text characters.
<
<
<
1205a1191,1201 > Any byte in a literal string not > explicitly affected by the previous rules represents itself. > However, Lua opens files for parsing in text mode, > and the system file functions may have problems with > some control characters. > So, it is safer to represent > non-text data as a quoted literal with > explicit escape sequences for the non-text characters. > > >
1215c1211
< A numeric constant with a radix point or an exponent
---
> A numeric constant with a radix point or an exponent
1900c1896
< Floor division (//
) is a division
---
> Floor division (//
) is a division
1962c1958
< besides strings.
---
> besides strings.
2000c1996
< All conversions from strings to numbers
---
> All conversions from strings to numbers
2142a2139,2141
>
>
>
2149,2150c2148,2159
< A program can modify the behavior of the length operator for
< any value but strings through the __len
metamethod (see §2.4).
---
> The length operator applied on a table
> returns a border in that table.
> A border in a table t
is any natural number
> that satisfies the following condition:
>
>
> (border == 0 or t[border] ~= nil) and t[border + 1] == nil >
> In words,
> a border is any (natural) index in a table
> where a non-nil value is followed by a nil value
> (or zero, when index 1 is nil).
2154,2170c2163,2172
< Unless a __len
metamethod is given,
< the length of a table t
is only defined if the
< table is a sequence,
< that is,
< the set of its positive numeric keys is equal to {1..n}
< for some non-negative integer n.
< In that case, n is its length.
< Note that a table like
<
<
< {10, 20, nil, 40} <
< is not a sequence, because it has the key 4
< but does not have the key 3
.
< (So, there is no n such that the set {1..n} is equal
< to the set of positive numeric keys of that table.)
< Note, however, that non-numeric keys do not interfere
---
> A table with exactly one border is called a sequence.
> For instance, the table {10, 20, 30, 40, 50}
is a sequence,
> as it has only one border (5).
> The table {10, 20, 30, nil, 50}
has two borders (3 and 5),
> and therefore it is not a sequence.
> The table {nil, 20, 30, nil, nil, 60, nil}
> has three borders (0, 3, and 6),
> so it is not a sequence, too.
> The table {}
is a sequence with border 0.
> Note that non-natural keys do not interfere
2173a2176,2198
>
> When t
is a sequence,
> #t
returns its only border,
> which corresponds to the intuitive notion of the length of the sequence.
> When t
is not a sequence,
> #t
can return any of its borders.
> (The exact one depends on details of
> the internal representation of the table,
> which in turn can depend on how the table was populated and
> the memory addresses of its non-numeric keys.)
>
>
>
> The computation of the length of a table > has a guaranteed worst time of O(log n), > where n is the largest natural key in the table. > > >
> A program can modify the behavior of the length operator for
> any value but strings through the __len
metamethod (see §2.4).
>
>
2587a2613,2634
>
> The Lua library is fully reentrant: > it has no global variables. > It keeps all information it needs in a dynamic structure, > called the Lua state. > > >
> Each Lua state has one or more threads,
> which correspond to independent, cooperative lines of execution.
> The type lua_State
(despite its name) refers to a thread.
> (Indirectly, through the thread, it also refers to the
> Lua state associated to the thread.)
>
>
>
> A pointer to a thread must be passed as the first argument to
> every function in the library, except to lua_newstate
,
> which creates a Lua state from scratch and returns a pointer
> to the main thread in the new state.
>
>
2594a2642,2643
> Functions in the API can access this stack through the
> Lua state parameter that they receive.
2602c2651,2652
< and it is where the C function pushes its results
---
> and it is where the C function can store temporary
> Lua values and must push its results
2794,2795c2844
< (such as a memory allocation error, type errors, syntax errors,
< and runtime errors)
---
> (such as a memory allocation error or a type error)
2803a2853,2863
> Inside a C function you can raise an error by calling lua_error
.
>
>
>
> Most functions in the API can raise an error, > for instance due to a memory allocation error. > The documentation for each function indicates whether > it can raise errors. > > >
2813a2874,2890
> The panic function,
> as its name implies,
> is a mechanism of last resort.
> Programs should avoid it.
> As a general rule,
> when a C function is called by Lua with a Lua state,
> it can do whatever it wants on that Lua state,
> as it should be already protected.
> However,
> when C code operates on other Lua states
> (e.g., a Lua parameter to the function,
> a Lua state stored in the registry, or
> the result of lua_newthread
),
> it should use them only in API calls that cannot raise errors.
>
>
>
2821,2831d2897 <
< Most functions in the API can raise an error, < for instance due to a memory allocation error. < The documentation for each function indicates whether < it can raise errors. < < <
< Inside a C function you can raise an error by calling lua_error
.
<
<
2839c2905
< Therefore, if a C function foo
calls an API function
---
> Therefore, if a C function foo
calls an API function
2857c2923
< We have a C function called from Lua which we will call
---
> We have a C function called from Lua which we will call
3172c3238
< In this case, all results from the function are pushed.
---
> In this case, all results from the function are pushed;
3658c3724
< Pushes onto the stack the Lua value associated with the userdata
---
> Pushes onto the stack the Lua value associated with the full userdata
4001c4067,4068
< Lua does all memory allocation for this state through this function.
---
> Lua does all memory allocation for this state
> through this function (see lua_Alloc
).
4205c4272,4274
< (This error typically has no relation with the function being called.)
---
> For such errors, Lua does not call the message handler
> (as this kind of error typically has no relation
> with the function being called).
4281c4350
< this function creates a light C function,
---
> this function creates a light C function,
4295c4364
< This function receives a pointer to a C function
---
> This function receives a pointer to a C function
4670c4739
< Sets the C function f
as the new value of global name
.
---
> Sets the C function f
as the new value of global name
.
4891c4960
< the new value associated to the userdata at the given index.
---
> the new value associated to the full userdata at the given index.
5305c5374
< the execution of the C function that yielded (see §4.7).
---
> the execution of the C function that yielded (see §4.7).
6016c6085
< of the C function that called it,
---
> of the C function that called it,
6537c6606,6607
< if it cannot open/read the file or the file has a wrong mode.
---
> for file-related errors
> (e.g., it cannot open or read the file).
6729a6800,6804
>
> This function uses lua_tolstring
to get its result,
> so all conversions and caveats of that function apply here.
>
>
7677c7752
< it is not inside a non-yieldable C function.
---
> it is not inside a non-yieldable C function.
7879,7880c7954,7955
< using the environment variable LUA_CPATH_5_3
< or the environment variable LUA_CPATH
---
> using the environment variable LUA_CPATH_5_3
,
> or the environment variable LUA_CPATH
,
8437c8512
< according to the format string fmt
(see §6.4.2).
---
> according to the format string fmt
(see §6.4.2).
8488c8563,8564
< and string.sub(s, -i)
returns a suffix of s
---
> and string.sub(s, -i)
(for a positive i
)
> returns a suffix of s
8905c8981
< returns a false value plus the position of the first invalid byte.
---
> returns a false value plus the position of the first invalid byte.
8949,8950c9025
< the table must be a proper sequence
< or have a __len
metamethod (see §3.4.7).
---
> all caveats about the length operator apply (see §3.4.7).
9066,9068c9141,9142
< The sort algorithm is not stable;
< that is, elements not comparable by the given order
< (e.g., equal elements)
---
> The sort algorithm is not stable:
> elements considered equal by the given order
9404c9478
< true if integer m
is below integer n
when
---
> true if and only if integer m
is below integer n
when
9989a10064
> Otherwise, it returns true.
9999c10074
< Renames file or directory named oldname
to newname
.
---
> Renames the file or directory named oldname
to newname
.
10001a10077
> Otherwise, it returns true.
10294c10370
< If u
is not a userdata,
---
> If u
is not a full userdata,
10493c10569
< When called without option -E
,
---
> When called without option -E
,
10585c10661
< If the error object is not a string but
---
> If the error object is not a string but
10900d10975
<
10903c10978
< Mon May 30 13:11:08 BRT 2016
---
> Mon Jan 9 13:30:53 BRST 2017
10906c10981
< Last change: revised for Lua 5.3.3
---
> Last change: revised for Lua 5.3.4
diff -r lua-5.3.3/doc/readme.html lua-5.3.4/doc/readme.html
331c331
< Copyright © 1994–2016 Lua.org, PUC-Rio.
---
> Copyright © 1994–2017 Lua.org, PUC-Rio.
358c358
< Tue Feb 2 22:25:27 BRST 2016
---
> Thu Dec 22 18:22:57 BRST 2016
361c361
< Last change: revised for Lua 5.3.3
---
> Last change: revised for Lua 5.3.4
diff -r lua-5.3.3/src/lauxlib.c lua-5.3.4/src/lauxlib.c
2c2
< ** $Id: lauxlib.c,v 1.286 2016/01/08 15:33:09 roberto Exp $
---
> ** $Id: lauxlib.c,v 1.289 2016/12/20 18:37:00 roberto Exp $
72d71
< ** (registry._LOADED).
77c76
< lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
---
> lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE);
812c811,815
< if (!luaL_callmeta(L, idx, "__tostring")) { /* no metafield? */
---
> if (luaL_callmeta(L, idx, "__tostring")) { /* metafield? */
> if (!lua_isstring(L, -1))
> luaL_error(L, "'__tostring' must return a string");
> }
> else {
816c819
< lua_pushfstring(L, "%I", lua_tointeger(L, idx));
---
> lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx));
818c821
< lua_pushfstring(L, "%f", lua_tonumber(L, idx));
---
> lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx));
830,832c833,839
< default:
< lua_pushfstring(L, "%s: %p", luaL_typename(L, idx),
< lua_topointer(L, idx));
---
> default: {
> int tt = luaL_getmetafield(L, idx, "__name"); /* try name */
> const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) :
> luaL_typename(L, idx);
> lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx));
> if (tt != LUA_TNIL)
> lua_remove(L, -2); /* remove '__name' */
833a841
> }
885c893
< ** first looks at the _LOADED table and, if that fails, try a
---
> ** first looks at the LOADED table and, if that fails, try a
891,892c899,900
< luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); /* get _LOADED table */
< if (lua_getfield(L, -1, modname) != LUA_TTABLE) { /* no _LOADED[modname]? */
---
> luaL_findtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE, 1);
> if (lua_getfield(L, -1, modname) != LUA_TTABLE) { /* no LOADED[modname]? */
899c907
< lua_setfield(L, -3, modname); /* _LOADED[modname] = new table */
---
> lua_setfield(L, -3, modname); /* LOADED[modname] = new table */
901c909
< lua_remove(L, -2); /* remove _LOADED table */
---
> lua_remove(L, -2); /* remove LOADED table */
965,966c973,974
< luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED");
< lua_getfield(L, -1, modname); /* _LOADED[modname] */
---
> luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE);
> lua_getfield(L, -1, modname); /* LOADED[modname] */
973c981
< lua_setfield(L, -3, modname); /* _LOADED[modname] = module */
---
> lua_setfield(L, -3, modname); /* LOADED[modname] = module */
975c983
< lua_remove(L, -2); /* remove _LOADED table */
---
> lua_remove(L, -2); /* remove LOADED table */
1033c1041
< ver, *v);
---
> (LUAI_UACNUMBER)ver, (LUAI_UACNUMBER)*v);
diff -r lua-5.3.3/src/lauxlib.h lua-5.3.4/src/lauxlib.h
2c2
< ** $Id: lauxlib.h,v 1.129 2015/11/23 11:29:43 roberto Exp $
---
> ** $Id: lauxlib.h,v 1.131 2016/12/06 14:54:31 roberto Exp $
19c19
< /* extra error code for 'luaL_load' */
---
> /* extra error code for 'luaL_loadfilex' */
22a23,30
> /* key, in the registry, for table of loaded modules */
> #define LUA_LOADED_TABLE "_LOADED"
>
>
> /* key, in the registry, for table of preloaded loaders */
> #define LUA_PRELOAD_TABLE "_PRELOAD"
>
>
diff -r lua-5.3.3/src/lbaselib.c lua-5.3.4/src/lbaselib.c
2c2
< ** $Id: lbaselib.c,v 1.313 2016/04/11 19:18:40 roberto Exp $
---
> ** $Id: lbaselib.c,v 1.314 2016/09/05 19:06:34 roberto Exp $
210a211
> luaL_checkany(L, 1);
212d212
< luaL_checktype(L, 1, LUA_TTABLE); /* argument must be a table */
diff -r lua-5.3.3/src/lcode.c lua-5.3.4/src/lcode.c
2c2
< ** $Id: lcode.c,v 2.109 2016/05/13 19:09:21 roberto Exp $
---
> ** $Id: lcode.c,v 2.112 2016/12/22 13:08:50 roberto Exp $
43c43
< static int tonumeral(expdesc *e, TValue *v) {
---
> static int tonumeral(const expdesc *e, TValue *v) {
89c89
< */
---
> */
757c757
< */
---
> */
978c978,979
< static int constfolding (FuncState *fs, int op, expdesc *e1, expdesc *e2) {
---
> static int constfolding (FuncState *fs, int op, expdesc *e1,
> const expdesc *e2) {
1016a1018,1020
> ** Because 'luaK_exp2RK' can free registers, its calls must be
> ** in "stack order" (that is, first on 'e2', which may have more
> ** recent registers to be released).
1020,1021c1024,1025
< int rk1 = luaK_exp2RK(fs, e1); /* both operands are "RK" */
< int rk2 = luaK_exp2RK(fs, e2);
---
> int rk2 = luaK_exp2RK(fs, e2); /* both operands are "RK" */
> int rk1 = luaK_exp2RK(fs, e1);
1063c1067
< static expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP}; /* fake 2nd operand */
---
> static const expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP};
1065c1069
< case OPR_MINUS: case OPR_BNOT:
---
> case OPR_MINUS: case OPR_BNOT: /* use 'ef' as fake 2nd operand */
diff -r lua-5.3.3/src/ldebug.c lua-5.3.4/src/ldebug.c
2c2
< ** $Id: ldebug.c,v 2.120 2016/03/31 19:01:21 roberto Exp $
---
> ** $Id: ldebug.c,v 2.121 2016/10/19 12:32:10 roberto Exp $
41c41,42
< static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name);
---
> static const char *funcnamefromcode (lua_State *L, CallInfo *ci,
> const char **name);
246a248,261
> static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
> if (ci == NULL) /* no 'ci'? */
> return NULL; /* no info */
> else if (ci->callstatus & CIST_FIN) { /* is this a finalizer? */
> *name = "__gc";
> return "metamethod"; /* report it as such */
> }
> /* calling function is a known Lua function? */
> else if (!(ci->callstatus & CIST_TAIL) && isLua(ci->previous))
> return funcnamefromcode(L, ci->previous, name);
> else return NULL; /* no way to find a name */
> }
>
>
277,281c292
< /* calling function is a known Lua function? */
< if (ci && !(ci->callstatus & CIST_TAIL) && isLua(ci->previous))
< ar->namewhat = getfuncname(L, ci->previous, &ar->name);
< else
< ar->namewhat = NULL;
---
> ar->namewhat = getfuncname(L, ci, &ar->name);
474,475c485,493
< static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
< TMS tm = (TMS)0; /* to avoid warnings */
---
> /*
> ** Try to find a name for a function based on the code that called it.
> ** (Only works when function was called by a Lua function.)
> ** Returns what the name is (e.g., "for iterator", "method",
> ** "metamethod") and sets '*name' to point to the name.
> */
> static const char *funcnamefromcode (lua_State *L, CallInfo *ci,
> const char **name) {
> TMS tm = (TMS)0; /* (initial value avoids warnings) */
485,486c503,504
< case OP_TAILCALL: /* get function name */
< return getobjname(p, pc, GETARG_A(i), name);
---
> case OP_TAILCALL:
> return getobjname(p, pc, GETARG_A(i), name); /* get function name */
491c509
< /* all other instructions can call only through metamethods */
---
> /* other instructions can do calls through metamethods */
512c530,531
< default: lua_assert(0); /* other instructions cannot call a function */
---
> default:
> return NULL; /* cannot find a reasonable name */
diff -r lua-5.3.3/src/ldo.c lua-5.3.4/src/ldo.c
2c2
< ** $Id: ldo.c,v 2.151 2015/12/16 16:40:07 roberto Exp $
---
> ** $Id: ldo.c,v 2.157 2016/12/13 15:52:21 roberto Exp $
214d213
< lua_assert(ci->top <= L->stack_last);
216a216
> lua_assert(lim <= L->stack_last);
224,225c224,226
< if (goodsize > LUAI_MAXSTACK) goodsize = LUAI_MAXSTACK;
< if (L->stacksize > LUAI_MAXSTACK) /* was handling stack overflow? */
---
> if (goodsize > LUAI_MAXSTACK)
> goodsize = LUAI_MAXSTACK; /* respect stack limit */
> if (L->stacksize > LUAI_MAXSTACK) /* had been handling stack overflow? */
229,233c230,236
< if (inuse <= LUAI_MAXSTACK && /* not handling stack overflow? */
< goodsize < L->stacksize) /* trying to shrink? */
< luaD_reallocstack(L, goodsize); /* shrink it */
< else
< condmovestack(L,,); /* don't change stack (change only for debugging) */
---
> /* if thread is currently not handling a stack overflow and its
> good size is smaller than current size, shrink its stack */
> if (inuse <= (LUAI_MAXSTACK - EXTRA_STACK) &&
> goodsize < L->stacksize)
> luaD_reallocstack(L, goodsize);
> else /* don't change stack */
> condmovestack(L,{},{}); /* (change only for debugging) */
324a328,393
> /*
> ** Given 'nres' results at 'firstResult', move 'wanted' of them to 'res'.
> ** Handle most typical cases (zero results for commands, one result for
> ** expressions, multiple results for tail calls/single parameters)
> ** separated.
> */
> static int moveresults (lua_State *L, const TValue *firstResult, StkId res,
> int nres, int wanted) {
> switch (wanted) { /* handle typical cases separately */
> case 0: break; /* nothing to move */
> case 1: { /* one result needed */
> if (nres == 0) /* no results? */
> firstResult = luaO_nilobject; /* adjust with nil */
> setobjs2s(L, res, firstResult); /* move it to proper place */
> break;
> }
> case LUA_MULTRET: {
> int i;
> for (i = 0; i < nres; i++) /* move all results to correct place */
> setobjs2s(L, res + i, firstResult + i);
> L->top = res + nres;
> return 0; /* wanted == LUA_MULTRET */
> }
> default: {
> int i;
> if (wanted <= nres) { /* enough results? */
> for (i = 0; i < wanted; i++) /* move wanted results to correct place */
> setobjs2s(L, res + i, firstResult + i);
> }
> else { /* not enough results; use all of them plus nils */
> for (i = 0; i < nres; i++) /* move all results to correct place */
> setobjs2s(L, res + i, firstResult + i);
> for (; i < wanted; i++) /* complete wanted number of results */
> setnilvalue(res + i);
> }
> break;
> }
> }
> L->top = res + wanted; /* top points after the last result */
> return 1;
> }
>
>
> /*
> ** Finishes a function call: calls hook if necessary, removes CallInfo,
> ** moves current number of results to proper place; returns 0 iff call
> ** wanted multiple (variable number of) results.
> */
> int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) {
> StkId res;
> int wanted = ci->nresults;
> if (L->hookmask & (LUA_MASKRET | LUA_MASKLINE)) {
> if (L->hookmask & LUA_MASKRET) {
> ptrdiff_t fr = savestack(L, firstResult); /* hook may change stack */
> luaD_hook(L, LUA_HOOKRET, -1);
> firstResult = restorestack(L, fr);
> }
> L->oldpc = ci->previous->u.l.savedpc; /* 'oldpc' for caller function */
> }
> res = ci->func; /* res == final position of 1st result */
> L->ci = ci->previous; /* back to caller */
> /* move results to proper place */
> return moveresults(L, firstResult, res, nres, wanted);
> }
>
>
377c446,448
< if (p->is_vararg != 1) { /* do not use vararg? */
---
> if (p->is_vararg)
> base = adjust_varargs(L, p, n);
> else { /* non vararg function */
382,383d452
< else
< base = adjust_varargs(L, p, n);
406,471d474
< ** Given 'nres' results at 'firstResult', move 'wanted' of them to 'res'.
< ** Handle most typical cases (zero results for commands, one result for
< ** expressions, multiple results for tail calls/single parameters)
< ** separated.
< */
< static int moveresults (lua_State *L, const TValue *firstResult, StkId res,
< int nres, int wanted) {
< switch (wanted) { /* handle typical cases separately */
< case 0: break; /* nothing to move */
< case 1: { /* one result needed */
< if (nres == 0) /* no results? */
< firstResult = luaO_nilobject; /* adjust with nil */
< setobjs2s(L, res, firstResult); /* move it to proper place */
< break;
< }
< case LUA_MULTRET: {
< int i;
< for (i = 0; i < nres; i++) /* move all results to correct place */
< setobjs2s(L, res + i, firstResult + i);
< L->top = res + nres;
< return 0; /* wanted == LUA_MULTRET */
< }
< default: {
< int i;
< if (wanted <= nres) { /* enough results? */
< for (i = 0; i < wanted; i++) /* move wanted results to correct place */
< setobjs2s(L, res + i, firstResult + i);
< }
< else { /* not enough results; use all of them plus nils */
< for (i = 0; i < nres; i++) /* move all results to correct place */
< setobjs2s(L, res + i, firstResult + i);
< for (; i < wanted; i++) /* complete wanted number of results */
< setnilvalue(res + i);
< }
< break;
< }
< }
< L->top = res + wanted; /* top points after the last result */
< return 1;
< }
<
<
< /*
< ** Finishes a function call: calls hook if necessary, removes CallInfo,
< ** moves current number of results to proper place; returns 0 iff call
< ** wanted multiple (variable number of) results.
< */
< int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) {
< StkId res;
< int wanted = ci->nresults;
< if (L->hookmask & (LUA_MASKRET | LUA_MASKLINE)) {
< if (L->hookmask & LUA_MASKRET) {
< ptrdiff_t fr = savestack(L, firstResult); /* hook may change stack */
< luaD_hook(L, LUA_HOOKRET, -1);
< firstResult = restorestack(L, fr);
< }
< L->oldpc = ci->previous->u.l.savedpc; /* 'oldpc' for caller function */
< }
< res = ci->func; /* res == final position of 1st result */
< L->ci = ci->previous; /* back to caller */
< /* move results to proper place */
< return moveresults(L, firstResult, res, nres, wanted);
< }
<
<
< /*
523,524c526,527
< ci->callstatus &= ~CIST_YPCALL; /* finish 'lua_pcall' */
< L->errfunc = ci->u.c.old_errfunc;
---
> ci->callstatus &= ~CIST_YPCALL; /* continuation is also inside it */
> L->errfunc = ci->u.c.old_errfunc; /* with the same error function */
529d531
< /* call continuation function */
531c533
< n = (*ci->u.c.k)(L, status, ci->u.c.ctx);
---
> n = (*ci->u.c.k)(L, status, ci->u.c.ctx); /* call continuation function */
534,535c536
< /* finish 'luaD_precall' */
< luaD_poscall(L, ci, L->top - n, n);
---
> luaD_poscall(L, ci, L->top - n, n); /* finish 'luaD_precall' */
598,600c599,601
< ** signal an error in the call to 'resume', not in the execution of the
< ** coroutine itself. (Such errors should not be handled by any coroutine
< ** error handler and should not kill the coroutine.)
---
> ** Signal an error in the call to 'lua_resume', not in the execution
> ** of the coroutine itself. (Such errors should not be handled by any
> ** coroutine error handler and should not kill the coroutine.)
602,603c603,604
< static l_noret resume_error (lua_State *L, const char *msg, StkId firstArg) {
< L->top = firstArg; /* remove args from the stack */
---
> static int resume_error (lua_State *L, const char *msg, int narg) {
> L->top -= narg; /* remove args from the stack */
606c607,608
< luaD_throw(L, -1); /* jump back to 'lua_resume' */
---
> lua_unlock(L);
> return LUA_ERRRUN;
618d619
< int nCcalls = L->nCcalls;
622,627c623
< if (nCcalls >= LUAI_MAXCCALLS)
< resume_error(L, "C stack overflow", firstArg);
< if (L->status == LUA_OK) { /* may be starting a coroutine */
< if (ci != &L->base_ci) /* not in base level? */
< resume_error(L, "cannot resume non-suspended coroutine", firstArg);
< /* coroutine is in base level; start running it */
---
> if (L->status == LUA_OK) { /* starting a coroutine? */
631,632d626
< else if (L->status != LUA_YIELD)
< resume_error(L, "cannot resume dead coroutine", firstArg);
633a628
> lua_assert(L->status == LUA_YIELD);
650d644
< lua_assert(nCcalls == L->nCcalls);
658c652,657
< luai_userstateresume(L, nargs);
---
> if (L->status == LUA_OK) { /* may be starting a coroutine */
> if (L->ci != &L->base_ci) /* not in base level? */
> return resume_error(L, "cannot resume non-suspended coroutine", nargs);
> }
> else if (L->status != LUA_YIELD)
> return resume_error(L, "cannot resume dead coroutine", nargs);
659a659,661
> if (L->nCcalls >= LUAI_MAXCCALLS)
> return resume_error(L, "C stack overflow", nargs);
> luai_userstateresume(L, nargs);
diff -r lua-5.3.3/src/lgc.c lua-5.3.4/src/lgc.c
2c2
< ** $Id: lgc.c,v 2.212 2016/03/31 19:02:03 roberto Exp $
---
> ** $Id: lgc.c,v 2.215 2016/12/22 13:08:50 roberto Exp $
470c470
< sizeof(Node) * cast(size_t, sizenode(h));
---
> sizeof(Node) * cast(size_t, allocsizenode(h));
542c542
< /* 'remarkupvals' may have removed thread from 'twups' list */
---
> /* 'remarkupvals' may have removed thread from 'twups' list */
820a821
> L->ci->callstatus |= CIST_FIN; /* will run a finalizer */
821a823
> L->ci->callstatus &= ~CIST_FIN; /* not running a finalizer anymore */
diff -r lua-5.3.3/src/linit.c lua-5.3.4/src/linit.c
2c2
< ** $Id: linit.c,v 1.38 2015/01/05 13:48:33 roberto Exp $
---
> ** $Id: linit.c,v 1.39 2016/12/04 20:17:24 roberto Exp $
21c21
< ** luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
---
> ** luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE);
24c24
< ** lua_pop(L, 1); // remove _PRELOAD table
---
> ** lua_pop(L, 1); // remove PRELOAD table
diff -r lua-5.3.3/src/liolib.c lua-5.3.4/src/liolib.c
2c2
< ** $Id: liolib.c,v 2.149 2016/05/02 14:03:19 roberto Exp $
---
> ** $Id: liolib.c,v 2.151 2016/12/20 18:37:00 roberto Exp $
40,43c40,44
< #define l_checkmode(mode) \
< (*mode != '\0' && strchr("rwa", *(mode++)) != NULL && \
< (*mode != '+' || (++mode, 1)) && /* skip if char is '+' */ \
< (strspn(mode, L_MODEEXT) == strlen(mode)))
---
> static int l_checkmode (const char *mode) {
> return (*mode != '\0' && strchr("rwa", *(mode++)) != NULL &&
> (*mode != '+' || (++mode, 1)) && /* skip if char is '+' */
> (strspn(mode, L_MODEEXT) == strlen(mode))); /* check extensions */
> }
621,622c622,625
< ? fprintf(f, LUA_INTEGER_FMT, lua_tointeger(L, arg))
< : fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg));
---
> ? fprintf(f, LUA_INTEGER_FMT,
> (LUAI_UACINT)lua_tointeger(L, arg))
> : fprintf(f, LUA_NUMBER_FMT,
> (LUAI_UACNUMBER)lua_tonumber(L, arg));
diff -r lua-5.3.3/src/lmathlib.c lua-5.3.4/src/lmathlib.c
2c2
< ** $Id: lmathlib.c,v 1.117 2015/10/02 15:39:23 roberto Exp $
---
> ** $Id: lmathlib.c,v 1.119 2016/12/22 13:08:50 roberto Exp $
187c187,188
< if (base == 2.0) res = l_mathop(log2)(x); else
---
> if (base == l_mathop(2.0))
> res = l_mathop(log2)(x); else
189,190c190,193
< if (base == 10.0) res = l_mathop(log10)(x);
< else res = l_mathop(log)(x)/l_mathop(log)(base);
---
> if (base == l_mathop(10.0))
> res = l_mathop(log10)(x);
> else
> res = l_mathop(log)(x)/l_mathop(log)(base);
265c268
< luaL_argcheck(L, low <= up, 1, "interval is empty");
---
> luaL_argcheck(L, low <= up, 1, "interval is empty");
284c287
< lua_pushliteral(L, "integer");
---
> lua_pushliteral(L, "integer");
286c289
< lua_pushliteral(L, "float");
---
> lua_pushliteral(L, "float");
diff -r lua-5.3.3/src/loadlib.c lua-5.3.4/src/loadlib.c
2c2
< ** $Id: loadlib.c,v 1.127 2015/11/23 11:30:45 roberto Exp $
---
> ** $Id: loadlib.c,v 1.130 2017/01/12 17:14:26 roberto Exp $
28,49d27
< ** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment
< ** variables that Lua check to set its paths.
< */
< #if !defined(LUA_PATH_VAR)
< #define LUA_PATH_VAR "LUA_PATH"
< #endif
<
< #if !defined(LUA_CPATH_VAR)
< #define LUA_CPATH_VAR "LUA_CPATH"
< #endif
<
< #define LUA_PATHSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
<
< #define LUA_PATHVARVERSION LUA_PATH_VAR LUA_PATHSUFFIX
< #define LUA_CPATHVARVERSION LUA_CPATH_VAR LUA_PATHSUFFIX
<
< /*
< ** LUA_PATH_SEP is the character that separates templates in a path.
< ** LUA_PATH_MARK is the string that marks the substitution points in a
< ** template.
< ** LUA_EXEC_DIR in a Windows path is replaced by the executable's
< ** directory.
53,61d30
< #if !defined (LUA_PATH_SEP)
< #define LUA_PATH_SEP ";"
< #endif
< #if !defined (LUA_PATH_MARK)
< #define LUA_PATH_MARK "?"
< #endif
< #if !defined (LUA_EXEC_DIR)
< #define LUA_EXEC_DIR "!"
< #endif
97c66,67
< #define setprogdir(L) ((void)0)
---
>
> #define setprogdir(L) ((void)0)
182d151
< #undef setprogdir
191a161,167
> #undef setprogdir
>
>
> /*
> ** Replace in the path (on the top of the stack) any occurrence
> ** of LUA_EXEC_DIR with the executable's path.
> */
196c172
< DWORD n = GetModuleFileNameA(NULL, buff, nsize);
---
> DWORD n = GetModuleFileNameA(NULL, buff, nsize); /* get exec. name */
200c176
< *lb = '\0';
---
> *lb = '\0'; /* cut name on the last '\\' to get the path */
206a183,184
>
>
275a254,314
> ** {==================================================================
> ** Set Paths
> ** ===================================================================
> */
>
> /*
> ** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment
> ** variables that Lua check to set its paths.
> */
> #if !defined(LUA_PATH_VAR)
> #define LUA_PATH_VAR "LUA_PATH"
> #endif
>
> #if !defined(LUA_CPATH_VAR)
> #define LUA_CPATH_VAR "LUA_CPATH"
> #endif
>
>
> #define AUXMARK "\1" /* auxiliary mark */
>
>
> /*
> ** return registry.LUA_NOENV as a boolean
> */
> static int noenv (lua_State *L) {
> int b;
> lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
> b = lua_toboolean(L, -1);
> lua_pop(L, 1); /* remove value */
> return b;
> }
>
>
> /*
> ** Set a path
> */
> static void setpath (lua_State *L, const char *fieldname,
> const char *envname,
> const char *dft) {
> const char *nver = lua_pushfstring(L, "%s%s", envname, LUA_VERSUFFIX);
> const char *path = getenv(nver); /* use versioned name */
> if (path == NULL) /* no environment variable? */
> path = getenv(envname); /* try unversioned name */
> if (path == NULL || noenv(L)) /* no environment variable? */
> lua_pushstring(L, dft); /* use default */
> else {
> /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */
> path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,
> LUA_PATH_SEP AUXMARK LUA_PATH_SEP);
> luaL_gsub(L, path, AUXMARK, dft);
> lua_remove(L, -2); /* remove result from 1st 'gsub' */
> }
> setprogdir(L);
> lua_setfield(L, -3, fieldname); /* package[fieldname] = path value */
> lua_pop(L, 1); /* pop versioned variable name */
> }
>
> /* }================================================================== */
>
>
> /*
523c562
< lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD");
---
> lua_getfield(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE);
560,562c599,601
< lua_settop(L, 1); /* _LOADED table will be at index 2 */
< lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
< lua_getfield(L, 2, name); /* _LOADED[name] */
---
> lua_settop(L, 1); /* LOADED table will be at index 2 */
> lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE);
> lua_getfield(L, 2, name); /* LOADED[name] */
572c611
< lua_setfield(L, 2, name); /* _LOADED[name] = returned value */
---
> lua_setfield(L, 2, name); /* LOADED[name] = returned value */
576c615
< lua_setfield(L, 2, name); /* _LOADED[name] = true */
---
> lua_setfield(L, 2, name); /* LOADED[name] = true */
669,703d707
< /* auxiliary mark (for internal use) */
< #define AUXMARK "\1"
<
<
< /*
< ** return registry.LUA_NOENV as a boolean
< */
< static int noenv (lua_State *L) {
< int b;
< lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
< b = lua_toboolean(L, -1);
< lua_pop(L, 1); /* remove value */
< return b;
< }
<
<
< static void setpath (lua_State *L, const char *fieldname, const char *envname1,
< const char *envname2, const char *def) {
< const char *path = getenv(envname1);
< if (path == NULL) /* no environment variable? */
< path = getenv(envname2); /* try alternative name */
< if (path == NULL || noenv(L)) /* no environment variable? */
< lua_pushstring(L, def); /* use default */
< else {
< /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */
< path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,
< LUA_PATH_SEP AUXMARK LUA_PATH_SEP);
< luaL_gsub(L, path, AUXMARK, def);
< lua_remove(L, -2);
< }
< setprogdir(L);
< lua_setfield(L, -2, fieldname);
< }
<
<
767,770c771,773
< /* set field 'path' */
< setpath(L, "path", LUA_PATHVARVERSION, LUA_PATH_VAR, LUA_PATH_DEFAULT);
< /* set field 'cpath' */
< setpath(L, "cpath", LUA_CPATHVARVERSION, LUA_CPATH_VAR, LUA_CPATH_DEFAULT);
---
> /* set paths */
> setpath(L, "path", LUA_PATH_VAR, LUA_PATH_DEFAULT);
> setpath(L, "cpath", LUA_CPATH_VAR, LUA_CPATH_DEFAULT);
776c779
< luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED");
---
> luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE);
779c782
< luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
---
> luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE);
diff -r lua-5.3.3/src/lobject.c lua-5.3.4/src/lobject.c
2c2
< ** $Id: lobject.c,v 2.111 2016/05/20 14:07:48 roberto Exp $
---
> ** $Id: lobject.c,v 2.113 2016/12/22 13:08:50 roberto Exp $
283c283
< char *pdot = strchr(s, '.');
---
> const char *pdot = strchr(s, '.');
397c397
< ** this function handles only '%d', '%c', '%f', '%p', and '%s'
---
> ** this function handles only '%d', '%c', '%f', '%p', and '%s'
diff -r lua-5.3.3/src/lobject.h lua-5.3.4/src/lobject.h
2c2
< ** $Id: lobject.h,v 2.116 2015/11/03 18:33:10 roberto Exp $
---
> ** $Id: lobject.h,v 2.117 2016/08/01 19:51:24 roberto Exp $
410c410
< lu_byte is_vararg; /* 2: declared vararg; 1: uses vararg */
---
> lu_byte is_vararg;
diff -r lua-5.3.3/src/lopcodes.h lua-5.3.4/src/lopcodes.h
2c2
< ** $Id: lopcodes.h,v 1.148 2014/10/25 11:50:46 roberto Exp $
---
> ** $Id: lopcodes.h,v 1.149 2016/07/19 17:12:21 roberto Exp $
141a142
> #if !defined(MAXINDEXRK) /* (for debugging only) */
142a144
> #endif
diff -r lua-5.3.3/src/loslib.c lua-5.3.4/src/loslib.c
2c2
< ** $Id: loslib.c,v 1.64 2016/04/18 13:06:55 roberto Exp $
---
> ** $Id: loslib.c,v 1.65 2016/07/18 17:58:58 roberto Exp $
33c33
< /* options for ANSI C 89 */
---
> /* options for ANSI C 89 (only 1-char options) */
38c38
< "||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy"
---
> "||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy" /* two-char options */
42c42
< "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y"
---
> "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */
260,263c260,264
< static const char *checkoption (lua_State *L, const char *conv, char *buff) {
< const char *option;
< int oplen = 1;
< for (option = LUA_STRFTIMEOPTIONS; *option != '\0'; option += oplen) {
---
> static const char *checkoption (lua_State *L, const char *conv,
> ptrdiff_t convlen, char *buff) {
> const char *option = LUA_STRFTIMEOPTIONS;
> int oplen = 1; /* length of options being checked */
> for (; *option != '\0' && oplen <= convlen; option += oplen) {
265c266
< oplen++; /* next length */
---
> oplen++; /* will check options with next length (+1) */
283c284,285
< const char *s = luaL_optstring(L, 1, "%c");
---
> size_t slen;
> const char *s = luaL_optlstring(L, 1, "%c", &slen);
284a287
> const char *se = s + slen; /* 's' end */
303c306
< while (*s) {
---
> while (s < se) {
309c312,313
< s = checkoption(L, s + 1, cc + 1); /* copy specifier to 'cc' */
---
> s++; /* skip '%' */
> s = checkoption(L, s, se - s, cc + 1); /* copy specifier to 'cc' */
diff -r lua-5.3.3/src/lparser.c lua-5.3.4/src/lparser.c
2c2
< ** $Id: lparser.c,v 2.153 2016/05/13 19:10:16 roberto Exp $
---
> ** $Id: lparser.c,v 2.155 2016/08/01 19:51:24 roberto Exp $
325a326,327
> if (nexps > nvars)
> ls->fs->freereg -= nexps - nvars; /* remove extra values */
767c769
< f->is_vararg = 2; /* declared vararg */
---
> f->is_vararg = 1; /* declared vararg */
963d964
< fs->f->is_vararg = 1; /* function actually uses vararg */
1163c1164
< if (nexps != nvars) {
---
> if (nexps != nvars)
1165,1167d1165
< if (nexps > nvars)
< ls->fs->freereg -= nexps - nvars; /* remove extra values */
< }
1618c1616
< fs->f->is_vararg = 2; /* main function is always declared vararg */
---
> fs->f->is_vararg = 1; /* main function is always declared vararg */
diff -r lua-5.3.3/src/lstate.h lua-5.3.4/src/lstate.h
2c2
< ** $Id: lstate.h,v 2.130 2015/12/16 16:39:38 roberto Exp $
---
> ** $Id: lstate.h,v 2.133 2016/12/22 13:08:50 roberto Exp $
26c26
< ** 'tobefnz': all objects ready to be finalized;
---
> ** 'tobefnz': all objects ready to be finalized;
37c37
< ** Atomic type (relative to signals) to better ensure that 'lua_sethook'
---
> ** Atomic type (relative to signals) to better ensure that 'lua_sethook'
69c69
< ** case, the actual 'func' value is saved in field 'extra'.
---
> ** case, the actual 'func' value is saved in field 'extra'.
91c91
< lu_byte callstatus;
---
> unsigned short callstatus;
106a107
> #define CIST_FIN (1<<8) /* call is running a finalizer */
diff -r lua-5.3.3/src/lstrlib.c lua-5.3.4/src/lstrlib.c
2c2
< ** $Id: lstrlib.c,v 1.251 2016/05/20 14:13:21 roberto Exp $
---
> ** $Id: lstrlib.c,v 1.254 2016/12/22 13:08:50 roberto Exp $
842,843c842,844
< if (x != x || x == HUGE_VAL || x == -HUGE_VAL) /* inf or NaN? */
< return l_sprintf(buff, sz, LUA_NUMBER_FMT, x); /* equal to '%g' */
---
> /* if 'inf' or 'NaN', format it like '%g' */
> if (x != x || x == (lua_Number)HUGE_VAL || x == -(lua_Number)HUGE_VAL)
> return l_sprintf(buff, sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)x);
846c847
< return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", x);
---
> return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", (LUAI_UACNUMBER)x);
936c937
< char *ppoint = memchr(buff, point, nb);
---
> char *ppoint = (char *)memchr(buff, point, nb);
963c964
< nb = l_sprintf(buff, MAX_ITEM, format, n);
---
> nb = l_sprintf(buff, MAX_ITEM, format, (LUAI_UACINT)n);
1044c1045
< nb = l_sprintf(buff, MAX_ITEM, form, n);
---
> nb = l_sprintf(buff, MAX_ITEM, form, (LUAI_UACINT)n);
1053a1055
> lua_Number n = luaL_checknumber(L, arg);
1055c1057
< nb = l_sprintf(buff, MAX_ITEM, form, luaL_checknumber(L, arg));
---
> nb = l_sprintf(buff, MAX_ITEM, form, (LUAI_UACNUMBER)n);
1262c1264
< ** always gets its full alignment, other options are limited by
---
> ** always gets its full alignment, other options are limited by
diff -r lua-5.3.3/src/ltable.c lua-5.3.4/src/ltable.c
2c2
< ** $Id: ltable.c,v 2.117 2015/11/19 19:16:22 roberto Exp $
---
> ** $Id: ltable.c,v 2.118 2016/11/07 12:38:35 roberto Exp $
77,78d76
< #define isdummy(n) ((n) == dummynode)
<
311d308
< int lsize;
314c311,312
< lsize = 0;
---
> t->lsizenode = 0;
> t->lastfree = NULL; /* signal that it is using dummy node */
318c316
< lsize = luaO_ceillog2(size);
---
> int lsize = luaO_ceillog2(size);
328a327,328
> t->lsizenode = cast_byte(lsize);
> t->lastfree = gnode(t, size); /* all positions are free */
330,331d329
< t->lsizenode = cast_byte(lsize);
< t->lastfree = gnode(t, size); /* all positions are free */
340c338
< int oldhsize = t->lsizenode;
---
> int oldhsize = allocsizenode(t);
357c355
< for (j = twoto(oldhsize) - 1; j >= 0; j--) {
---
> for (j = oldhsize - 1; j >= 0; j--) {
365,366c363,364
< if (!isdummy(nold))
< luaM_freearray(L, nold, cast(size_t, twoto(oldhsize))); /* free old hash */
---
> if (oldhsize > 0) /* not the dummy node? */
> luaM_freearray(L, nold, cast(size_t, oldhsize)); /* free old hash */
371c369
< int nsize = isdummy(t->node) ? 0 : sizenode(t);
---
> int nsize = allocsizenode(t);
417c415
< if (!isdummy(t->node))
---
> if (!isdummy(t))
425,428c423,428
< while (t->lastfree > t->node) {
< t->lastfree--;
< if (ttisnil(gkey(t->lastfree)))
< return t->lastfree;
---
> if (!isdummy(t)) {
> while (t->lastfree > t->node) {
> t->lastfree--;
> if (ttisnil(gkey(t->lastfree)))
> return t->lastfree;
> }
448c448
< if (luaV_tointeger(key, &k, 0)) { /* index is int? */
---
> if (luaV_tointeger(key, &k, 0)) { /* does index fit in an integer? */
456c456
< if (!ttisnil(gval(mp)) || isdummy(mp)) { /* main position is taken? */
---
> if (!ttisnil(gval(mp)) || isdummy(t)) { /* main position is taken? */
464c464
< lua_assert(!isdummy(f));
---
> lua_assert(!isdummy(t));
654c654
< else if (isdummy(t->node)) /* hash part is empty? */
---
> else if (isdummy(t)) /* hash part is empty? */
667c667
< int luaH_isdummy (Node *n) { return isdummy(n); }
---
> int luaH_isdummy (const Table *t) { return isdummy(t); }
diff -r lua-5.3.3/src/ltable.h lua-5.3.4/src/ltable.h
2c2
< ** $Id: ltable.h,v 2.21 2015/11/03 15:47:30 roberto Exp $
---
> ** $Id: ltable.h,v 2.23 2016/12/22 13:08:50 roberto Exp $
18c18
< /* 'const' to avoid wrong writings that can mess up field 'next' */
---
> /* 'const' to avoid wrong writings that can mess up field 'next' */
29a30,37
> /* true when 't' is using 'dummynode' as its hash part */
> #define isdummy(t) ((t)->lastfree == NULL)
>
>
> /* allocated size for hash nodes */
> #define allocsizenode(t) (isdummy(t) ? 0 : sizenode(t))
>
>
54c62
< LUAI_FUNC int luaH_isdummy (Node *n);
---
> LUAI_FUNC int luaH_isdummy (const Table *t);
diff -r lua-5.3.3/src/ltm.c lua-5.3.4/src/ltm.c
2c2
< ** $Id: ltm.c,v 2.37 2016/02/26 19:20:15 roberto Exp $
---
> ** $Id: ltm.c,v 2.38 2016/12/22 13:08:50 roberto Exp $
18c18
< #include "ldo.h"
---
> #include "ldo.h"
diff -r lua-5.3.3/src/lua.c lua-5.3.4/src/lua.c
2c2
< ** $Id: lua.c,v 1.226 2015/08/14 19:11:20 roberto Exp $
---
> ** $Id: lua.c,v 1.230 2017/01/12 17:14:26 roberto Exp $
22a23
>
40,41c41
< #define LUA_INITVARVERSION \
< LUA_INIT_VAR "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
---
> #define LUA_INITVARVERSION LUA_INIT_VAR LUA_VERSUFFIX
57a58,59
> #include