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