Lua diffs-lua-5.4.2-lua-5.4.3

raw · simple · unified · work
Makefile
49c49
< R= $V.2
> R= $V.3
README
2c2
< This is Lua 5.4.2, released on 13 Nov 2020.
> This is Lua 5.4.3, released on 15 Mar 2021.
doc/contents.html
35c35
< Copyright &copy; 2020 Lua.org, PUC-Rio.
> Copyright &copy; 2020&ndash;2021 Lua.org, PUC-Rio.
398a399
> <A HREF="manual.html#lua_closeslot">lua_closeslot</A><BR>
666c667
< Tue Nov 10 20:58:52 UTC 2020
> Wed Mar 3 13:04:44 UTC 2021
669c670
< Last change: revised for Lua 5.4.2
> Last change: revised for Lua 5.4.3
doc/manual.html
22c22
< Copyright &copy; 2020 Lua.org, PUC-Rio.
> Copyright &copy; 2020&ndash;2021 Lua.org, PUC-Rio.
145a146,150
> Despite its name,
> <b>false</b> is frequently used as an alternative to <b>nil</b>,
> with the key difference that <b>false</b> behaves
> like a regular value in a table,
> while a <b>nil</b> in a table represents an absent key.
437c442
< Lua checks for a function in the field "<code>__add</code>" of the value's metatable.
> Lua checks for a function in the field <code>__add</code> of the value's metatable.
904c909
< and the metatable has a field indexed by the string "<code>__gc</code>".
> and the metatable has a <code>__gc</code> metamethod.
1995,1998d1999
< However, Lua may call the method one more time.
< 
< 
< <p>
2001,2004d2001
< Errors in these methods
< interrupt the respective method and generate a warning,
< but are otherwise ignored;
< the error reported is only the original one.
3765a3763,3785
> <hr><h3><a name="lua_closeslot"><code>lua_closeslot</code></a></h3><p>
> <span class="apii">[-0, +0, <em>e</em>]</span>
> <pre>void lua_closeslot (lua_State *L, int index);</pre>
> 
> <p>
> Close the to-be-closed slot at the given index and set its value to <b>nil</b>.
> The index must be the last index previously marked to be closed
> (see <a href="#lua_toclose"><code>lua_toclose</code></a>) that is still active (that is, not closed yet).
> 
> 
> <p>
> A <code>__close</code> metamethod cannot yield
> when called through this function.
> 
> 
> <p>
> (Exceptionally, this function was introduced in release 5.4.3.
> It is not present in previous 5.4 releases.)
> 
> 
> 
> 
> 
4660,4664c4680
< 
< 
< <p>
< This function can run arbitrary code when removing an index
< marked as to-be-closed from the stack.
> It is implemented as a macro over <a href="#lua_settop"><code>lua_settop</code></a>.
5143c5159,5161
< <a href="#pdf-LUA_OK"><code>LUA_OK</code></a> for no errors in closing methods,
> <a href="#pdf-LUA_OK"><code>LUA_OK</code></a> for no errors in the thread
> (either the original error that stopped the thread or
> errors in closing methods),
5146c5164
< leaves the error object on the top of the stack,
> leaves the error object on the top of the stack.
5469c5487
< to-be-closed "variable" (see <a href="#3.3.8">&sect;3.3.8</a>).
> to-be-closed slot (see <a href="#3.3.8">&sect;3.3.8</a>).
5471c5489
< the value at that index in the stack will be closed
> the value at that slot in the stack will be closed
5475,5479c5493,5499
< there is an error,
< or the index is removed from the stack through
< <a href="#lua_settop"><code>lua_settop</code></a> or <a href="#lua_pop"><code>lua_pop</code></a>.
< An index marked as to-be-closed should not be removed from the stack
< by any other function in the API except <a href="#lua_settop"><code>lua_settop</code></a> or <a href="#lua_pop"><code>lua_pop</code></a>.
> or there is an error,
> or the slot is removed from the stack through
> <a href="#lua_settop"><code>lua_settop</code></a> or <a href="#lua_pop"><code>lua_pop</code></a>,
> or there is a call to <a href="#lua_closeslot"><code>lua_closeslot</code></a>.
> A slot marked as to-be-closed should not be removed from the stack
> by any other function in the API except <a href="#lua_settop"><code>lua_settop</code></a> or <a href="#lua_pop"><code>lua_pop</code></a>,
> unless previously deactivated by <a href="#lua_closeslot"><code>lua_closeslot</code></a>.
5484,5490c5504
< that is equal to or below an active to-be-closed index.
< 
< 
< <p>
< In the case of an out-of-memory error,
< the value in the given index is immediately closed,
< as if it was already marked.
> that is equal to or below an active to-be-closed slot.
5498c5512
< will be out of scope.
> (e.g., a buffer) will be out of scope.
8401c8415,8417
< In case of error closing some variable,
> In case of error
> (either the original error that stopped the coroutine or
> errors in closing methods),
9963,9965c9979,9981
< before the second in the final order
< (so that, after the sort,
< <code>i &lt; j</code> implies <code>not comp(list[j],list[i])</code>).
> before the second in the final order,
> so that, after the sort,
> <code>i &lt;= j</code> implies <code>not comp(list[j],list[i])</code>.
9971,9974c9987,9990
< Note that the <code>comp</code> function must define
< a strict partial order over the elements in the list;
< that is, it must be asymmetric and transitive.
< Otherwise, no valid sort may be possible.
> The <code>comp</code> function must define a consistent order;
> more formally, the function must define a strict weak order.
> (A weak order is similar to a total order,
> but it can equate different elements for comparison purposes.)
9979c9995
< elements considered equal by the given order
> Different elements considered equal by the given order
11911c11927
< Fri Nov 13 15:35:22 UTC 2020
> Mon Mar 15 13:39:42 UTC 2021
11914c11930
< Last change: revised for Lua 5.4.2
> Last change: revised for Lua 5.4.3
doc/readme.html
113c113
< the top-level directory, which is named <TT>lua-5.4.2</TT>.
> the top-level directory, which is named <TT>lua-5.4.3</TT>.
306c306
< Copyright &copy; 1994&ndash;2020 Lua.org, PUC-Rio.
> Copyright &copy; 1994&ndash;2021 Lua.org, PUC-Rio.
333c333
< Tue Nov 10 20:55:28 UTC 2020
> Wed Mar 3 10:16:26 UTC 2021
336c336
< Last change: revised for Lua 5.4.2
> Last change: revised for Lua 5.4.3
src/Makefile
70c70
< 	./lua -v
> 	./$(LUA_T) -v
110a111,112
> 	@echo '*** Make sure to compile all external Lua libraries'
> 	@echo '*** with LUA_USE_C89 to ensure consistency'
src/lapi.c
42c42
< ** Test for a valid index.
> ** Test for a valid index (one that is not the 'nilvalue').
77c77,78
<  return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : &G(L)->nilvalue;
>  return (idx <= func->nupvalues) ? &func->upvalue[idx-1]
>  : &G(L)->nilvalue;
175c176
<  StkId func;
>  StkId func, newtop;
190,192c191,210
<  if (diff < 0 && hastocloseCfunc(ci->nresults))
<  luaF_close(L, L->top + diff, LUA_OK);
<  L->top += diff; /* correct top only after closing any upvalue */
>  api_check(L, L->tbclist < L->top, "previous pop of an unclosed slot");
>  newtop = L->top + diff;
>  if (diff < 0 && L->tbclist >= newtop) {
>  lua_assert(hastocloseCfunc(ci->nresults));
>  luaF_close(L, newtop, CLOSEKTOP, 0);
>  }
>  L->top = newtop; /* correct top only after closing any upvalue */
>  lua_unlock(L);
> }
> 
> 
> LUA_API void lua_closeslot (lua_State *L, int idx) {
>  StkId level;
>  lua_lock(L);
>  level = index2stack(L, idx);
>  api_check(L, hastocloseCfunc(L->ci->nresults) && L->tbclist == level,
>  "no variable to close at given level");
>  luaF_close(L, level, CLOSEKTOP, 0);
>  level = index2stack(L, idx); /* stack may be moved */
>  setnilvalue(s2v(level));
631a650,659
> /*
> ** Get the global table in the registry. Since all predefined
> ** indices in the registry were inserted right when the registry
> ** was created and never removed, they must always be in the array
> ** part of the registry.
> */
> #define getGtable(L) \
> 	(&hvalue(&G(L)->l_registry)->array[LUA_RIDX_GLOBALS - 1])
> 
> 
633c661
<  Table *reg;
>  const TValue *G;
635,636c663,664
<  reg = hvalue(&G(L)->l_registry);
<  return auxgetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name);
>  G = getGtable(L);
>  return auxgetstr(L, G, name);
814c842
<  Table *reg;
>  const TValue *G;
816,817c844,845
<  reg = hvalue(&G(L)->l_registry);
<  auxsetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name);
>  G = getGtable(L);
>  auxsetstr(L, G, name);
864d891
<  TValue *slot;
868,869c895
<  slot = luaH_set(L, t, key);
<  setobj2t(L, slot, s2v(L->top - 1));
>  luaH_set(L, t, key, s2v(L->top - 1));
1066,1067c1092
<  Table *reg = hvalue(&G(L)->l_registry);
<  const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
>  const TValue *gt = getGtable(L);
1243,1244c1268
<  api_check(L, L->openupval == NULL || uplevel(L->openupval) <= o,
<  "marked index below or equal new one");
>  api_check(L, L->tbclist < o, "given index below or equal a marked one");
src/lapi.h
44a45
> /* Map [-1, inf) (range of 'nresults') into (-inf, -2] */
45a47
> #define decodeNresults(n)	(-(n) - 3)
src/lauxlib.c
193c193
< int luaL_typeerror (lua_State *L, int arg, const char *tname) {
> LUALIB_API int luaL_typeerror (lua_State *L, int arg, const char *tname) {
381c381
<  if (!lua_checkstack(L, space)) {
>  if (l_unlikely(!lua_checkstack(L, space))) {
391c391
<  if (lua_type(L, arg) != t)
>  if (l_unlikely(lua_type(L, arg) != t))
397c397
<  if (lua_type(L, arg) == LUA_TNONE)
>  if (l_unlikely(lua_type(L, arg) == LUA_TNONE))
404c404
<  if (!s) tag_error(L, arg, LUA_TSTRING);
>  if (l_unlikely(!s)) tag_error(L, arg, LUA_TSTRING);
423c423
<  if (!isnum)
>  if (l_unlikely(!isnum))
445c445
<  if (!isnum) {
>  if (l_unlikely(!isnum)) {
478c478
<  if (temp == NULL && newsize > 0) { /* allocation error? */
>  if (l_unlikely(temp == NULL && newsize > 0)) { /* allocation error? */
518a519,527
> ** Whenever buffer is accessed, slot 'idx' must either be a box (which
> ** cannot be NULL) or it is a placeholder for the buffer.
> */
> #define checkbufferlevel(B,idx) \
>  lua_assert(buffonstack(B) ? lua_touserdata(B->L, idx) != NULL \
>  : lua_touserdata(B->L, idx) == (void*)B)
> 
> 
> /*
524c533
<  if (MAX_SIZET - sz < B->n) /* overflow in (B->n + sz)? */
>  if (l_unlikely(MAX_SIZET - sz < B->n)) /* overflow in (B->n + sz)? */
534,535c543,544
< ** 'B'. 'boxidx' is the relative position in the stack where the
< ** buffer's box is or should be.
> ** 'B'. 'boxidx' is the relative position in the stack where is the
> ** buffer's box or its placeholder.
537a547
>  checkbufferlevel(B, boxidx);
548c558
<  lua_pushnil(L); /* reserve slot for final result */
>  lua_remove(L, boxidx); /* remove placeholder */
550,551c560
<  /* move box (and slot) to its intended position */
<  lua_rotate(L, boxidx - 1, 2);
>  lua_insert(L, boxidx); /* move box to its intended position */
585a595
>  checkbufferlevel(B, -1);
587,590c597,599
<  if (buffonstack(B)) {
<  lua_copy(L, -1, -3); /* move string to reserved slot */
<  lua_pop(L, 2); /* pop string and box (closing the box) */
<  }
>  if (buffonstack(B))
>  lua_closeslot(L, -2); /* close the box */
>  lua_remove(L, -2); /* remove box or placeholder from the stack */
624a634
>  lua_pushlightuserdata(L, (void*)B); /* push placeholder */
642,644c652,653
< /* index of free-list header */
< #define freelist	0
< 
> /* index of free-list header (after the predefined values) */
> #define freelist	(LUA_RIDX_LAST + 1)
645a655,659
> /*
> ** The previously freed references form a linked list:
> ** t[freelist] is the index of a first free index, or zero if list is
> ** empty; t[t[freelist]] is the index of the second element; etc.
> */
653,655c667,676
<  lua_rawgeti(L, t, freelist); /* get first free element */
<  ref = (int)lua_tointeger(L, -1); /* ref = t[freelist] */
<  lua_pop(L, 1); /* remove it from stack */
>  if (lua_rawgeti(L, t, freelist) == LUA_TNIL) { /* first access? */
>  ref = 0; /* list is empty */
>  lua_pushinteger(L, 0); /* initialize as an empty list */
>  lua_rawseti(L, t, freelist); /* ref = t[freelist] = 0 */
>  }
>  else { /* already initialized */
>  lua_assert(lua_isinteger(L, -1));
>  ref = (int)lua_tointeger(L, -1); /* ref = t[freelist] */
>  }
>  lua_pop(L, 1); /* remove element from stack */
670a692
>  lua_assert(lua_isinteger(L, -1));
854c876
<  if (!isnum)
>  if (l_unlikely(!isnum))
1067c1089
<  if (L) {
>  if (l_likely(L)) {
src/lauxlib.h
14a15
> #include "luaconf.h"
133c134
< 		((void)((cond) || luaL_argerror(L, (arg), (extramsg))))
> 	((void)(luai_likely(cond) || luaL_argerror(L, (arg), (extramsg))))
136c137
< 		((void)((cond) || luaL_typeerror(L, (arg), (tname))))
> 	((void)(luai_likely(cond) || luaL_typeerror(L, (arg), (tname))))
160a162,177
> ** Internal assertions for in-house debugging
> */
> #if !defined(lua_assert)
> 
> #if defined LUAI_ASSERT
>  #include <assert.h>
>  #define lua_assert(c)		assert(c)
> #else
>  #define lua_assert(c)		((void)0)
> #endif
> 
> #endif
> 
> 
> 
> /*
src/lbaselib.c
141c141
<  if (luaL_getmetafield(L, 1, "__metatable") != LUA_TNIL)
>  if (l_unlikely(luaL_getmetafield(L, 1, "__metatable") != LUA_TNIL))
185c185,186
<  lua_pushstring(L, (oldmode == LUA_GCINC) ? "incremental" : "generational");
>  lua_pushstring(L, (oldmode == LUA_GCINC) ? "incremental"
>  : "generational");
302c303
<  if (status == LUA_OK) {
>  if (l_likely(status == LUA_OK)) {
358c359
<  else if (!lua_isstring(L, -1))
>  else if (l_unlikely(!lua_isstring(L, -1)))
396c397
<  if (luaL_loadfile(L, fname) != LUA_OK)
>  if (l_unlikely(luaL_loadfile(L, fname) != LUA_OK))
404c405
<  if (lua_toboolean(L, 1)) /* condition is true? */
>  if (l_likely(lua_toboolean(L, 1))) /* condition is true? */
440c441
<  if (status != LUA_OK && status != LUA_YIELD) { /* error? */
>  if (l_unlikely(status != LUA_OK && status != LUA_YIELD)) { /* error? */
src/lcode.c
317,325d316
< /*
< ** MAXimum number of successive Instructions WiTHout ABSolute line
< ** information.
< */
< #if !defined(MAXIWTHABS)
< #define MAXIWTHABS	120
< #endif
< 
< 
340c331
<  if (abs(linedif) >= LIMLINEDIFF || fs->iwthabs++ > MAXIWTHABS) {
>  if (abs(linedif) >= LIMLINEDIFF || fs->iwthabs++ >= MAXIWTHABS) {
346c337
<  fs->iwthabs = 0; /* restart counter */
>  fs->iwthabs = 1; /* restart counter */
547a539,540
> ** Note that all functions share the same table, so entering or exiting
> ** a function can make some indices wrong.
549a543
>  TValue val;
552c546
<  TValue *idx = luaH_set(L, fs->ls->h, key); /* index scanner table */
>  const TValue *idx = luaH_get(fs->ls->h, key); /* query scanner table */
566c560,561
<  setivalue(idx, k);
>  setivalue(&val, k);
>  luaH_finishset(L, fs->ls->h, key, idx, &val);
766c761
<  e->u.info = e->u.var.sidx;
>  e->u.info = e->u.var.ridx;
1039c1034
<  exp2reg(fs, ex, var->u.var.sidx); /* compute 'ex' into proper place */
>  exp2reg(fs, ex, var->u.var.ridx); /* compute 'ex' into proper place */
1279c1274
<  t->u.ind.t = (t->k == VLOCAL) ? t->u.var.sidx: t->u.info;
>  t->u.ind.t = (t->k == VLOCAL) ? t->u.var.ridx: t->u.info;
1306c1301,1302
<  return (tointegerns(v1, &i) && tointegerns(v2, &i));
>  return (luaV_tointegerns(v1, &i, LUA_FLOORN2I) &&
>  luaV_tointegerns(v2, &i, LUA_FLOORN2I));
src/lcorolib.c
34c34
<  if (!lua_checkstack(co, narg)) {
>  if (l_unlikely(!lua_checkstack(co, narg))) {
40,41c40,41
<  if (status == LUA_OK || status == LUA_YIELD) {
<  if (!lua_checkstack(L, nres + 1)) {
>  if (l_likely(status == LUA_OK || status == LUA_YIELD)) {
>  if (l_unlikely(!lua_checkstack(L, nres + 1))) {
60c60
<  if (r < 0) {
>  if (l_unlikely(r < 0)) {
76c76
<  if (r < 0) { /* error? */
>  if (l_unlikely(r < 0)) { /* error? */
78,79c78,82
<  if (stat != LUA_OK && stat != LUA_YIELD) /* error in the coroutine? */
<  lua_resetthread(co); /* close its tbc variables */
>  if (stat != LUA_OK && stat != LUA_YIELD) { /* error in the coroutine? */
>  stat = lua_resetthread(co); /* close its tbc variables */
>  lua_assert(stat != LUA_OK);
>  lua_xmove(co, L, 1); /* copy error message */
>  }
src/ldblib.c
36c36
<  if (L != L1 && !lua_checkstack(L1, n))
>  if (l_unlikely(L != L1 && !lua_checkstack(L1, n)))
154a155
>  luaL_argcheck(L, options[0] != '>', arg + 2, "invalid option '>'");
215c216
<  if (!lua_getstack(L1, level, &ar)) /* out of range? */
>  if (l_unlikely(!lua_getstack(L1, level, &ar))) /* out of range? */
240c241
<  if (!lua_getstack(L1, level, &ar)) /* out of range? */
>  if (l_unlikely(!lua_getstack(L1, level, &ar))) /* out of range? */
380c381
<  lua_pushstring(L, "k");
>  lua_pushliteral(L, "k");
423c424
<  if (fgets(buffer, sizeof(buffer), stdin) == 0 ||
>  if (fgets(buffer, sizeof(buffer), stdin) == NULL ||
src/ldebug.c
36,37d35
< /* inverse of 'pcRel' */
< #define invpcRel(pc, p)		((p)->code + (pc) + 1)
51,54c49,58
< ** For that, search the array of absolute line info for the largest saved
< ** instruction smaller or equal to the wanted instruction. A special
< ** case is when there is no absolute info or the instruction is before
< ** the first absolute one.
> ** Base lines are regularly placed at MAXIWTHABS intervals, so usually
> ** an integer division gets the right place. When the source file has
> ** large sequences of empty/comment lines, it may need extra entries,
> ** so the original estimate needs a correction.
> ** If the original estimate is -1, the initial 'if' ensures that the
> ** 'while' will run at least once.
> ** The assertion that the estimate is a lower bound for the correct base
> ** is valid as long as the debug info has been generated with the same
> ** value for MAXIWTHABS or smaller. (Previous releases use a little
> ** smaller value.)
62,75c66,71
<  unsigned int i;
<  if (pc >= f->abslineinfo[f->sizeabslineinfo - 1].pc)
<  i = f->sizeabslineinfo - 1; /* instruction is after last saved one */
<  else { /* binary search */
<  unsigned int j = f->sizeabslineinfo - 1; /* pc < anchorlines[j] */
<  i = 0; /* abslineinfo[i] <= pc */
<  while (i < j - 1) {
<  unsigned int m = (j + i) / 2;
<  if (pc >= f->abslineinfo[m].pc)
<  i = m;
<  else
<  j = m;
<  }
<  }
>  int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */
>  /* estimate must be a lower bond of the correct base */
>  lua_assert(i < 0 ||
>  (i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc));
>  while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc)
>  i++; /* low estimate; adjust it */
308,309c304,305
<  for (i = 0; i < p->sizelineinfo; i++) { /* for all lines with code */
<  currentline = nextline(p, currentline, i);
>  for (i = 0; i < p->sizelineinfo; i++) { /* for all instructions */
>  currentline = nextline(p, currentline, i); /* get its line */
632,637c628,631
<  case OP_LT: case OP_LE: case OP_LTI: case OP_LEI:
<  *name = "order"; /* '<=' can call '__lt', etc. */
<  return "metamethod";
<  case OP_CLOSE: case OP_RETURN:
<  *name = "close";
<  return "metamethod";
>  /* no cases for OP_EQI and OP_EQK, as they don't call metamethods */
>  case OP_LT: case OP_LTI: case OP_GTI: tm = TM_LT; break;
>  case OP_LE: case OP_LEI: case OP_GEI: tm = TM_LE; break;
>  case OP_CLOSE: case OP_RETURN: tm = TM_CLOSE; break;
650,652c644,647
< ** The subtraction of two potentially unrelated pointers is
< ** not ISO C, but it should not crash a program; the subsequent
< ** checks are ISO C and ensure a correct result.
> ** Check whether pointer 'o' points to some value in the stack
> ** frame of the current function. Because 'o' may not point to a
> ** value in this stack, we cannot compare it with the region
> ** boundaries (undefined behaviour in ISO C).
655,657c650,655
<  StkId base = ci->func + 1;
<  ptrdiff_t i = cast(StkId, o) - base;
<  return (0 <= i && i < (ci->top - base) && s2v(base + i) == o);
>  StkId pos;
>  for (pos = ci->func + 1; pos < ci->top; pos++) {
>  if (o == s2v(pos))
>  return 1;
>  }
>  return 0; /* not found */
699a698,710
> l_noret luaG_callerror (lua_State *L, const TValue *o) {
>  CallInfo *ci = L->ci;
>  const char *name = NULL; /* to avoid warnings */
>  const char *what = (isLua(ci)) ? funcnamefromcode(L, ci, &name) : NULL;
>  if (what != NULL) {
>  const char *t = luaT_objtypename(L, o);
>  luaG_runerror(L, "%s '%s' is not callable (a %s value)", what, name, t);
>  }
>  else
>  luaG_typeerror(L, o, "call");
> }
> 
> 
725c736
<  if (!tointegerns(p1, &temp))
>  if (!luaV_tointegerns(p1, &temp, LUA_FLOORN2I))
783c794,798
< ** previous instruction 'oldpc'.
> ** previous instruction 'oldpc'. More often than not, 'newpc' is only
> ** one or a few instructions after 'oldpc' (it must be after, see
> ** caller), so try to avoid calling 'luaG_getfuncline'. If they are
> ** too far apart, there is a good chance of a ABSLINEINFO in the way,
> ** so it goes directly to 'luaG_getfuncline'.
788,790c803,813
<  while (oldpc++ < newpc) {
<  if (p->lineinfo[oldpc] != 0)
<  return (luaG_getfuncline(p, oldpc - 1) != luaG_getfuncline(p, newpc));
>  if (newpc - oldpc < MAXIWTHABS / 2) { /* not too far apart? */
>  int delta = 0; /* line diference */
>  int pc = oldpc;
>  for (;;) {
>  int lineinfo = p->lineinfo[++pc];
>  if (lineinfo == ABSLINEINFO)
>  break; /* cannot compute delta; fall through */
>  delta += lineinfo;
>  if (pc == newpc)
>  return (delta != 0); /* delta computed successfully */
>  }
792c815,817
<  return 0; /* no line changes between positions */
>  /* either instructions are too far apart or there is an absolute line
>  info in the way; compute line difference explicitly */
>  return (luaG_getfuncline(p, oldpc) != luaG_getfuncline(p, newpc));
800,805c825,831
< ** function, 'npci' will be zero and will test as a new line without
< ** the need for 'oldpc'; so, 'oldpc' does not need to be initialized
< ** before. Some exceptional conditions may return to a function without
< ** updating 'oldpc'. In that case, 'oldpc' may be invalid; if so, it is
< ** reset to zero. (A wrong but valid 'oldpc' at most causes an extra
< ** call to a line hook.)
> ** function, 'npci' will be zero and will test as a new line whatever
> ** the value of 'oldpc'. Some exceptional conditions may return to
> ** a function without setting 'oldpc'. In that case, 'oldpc' may be
> ** invalid; if so, use zero as a valid value. (A wrong but valid 'oldpc'
> ** at most causes an extra call to a line hook.)
> ** This function is not "Protected" when called, so it should correct
> ** 'L->top' before calling anything that can run the GC.
812,813d837
<  /* 'L->oldpc' may be invalid; reset it in this case */
<  int oldpc = (L->oldpc < p->sizecode) ? L->oldpc : 0;
829,830c853,854
<  if (!isIT(*(ci->u.l.savedpc - 1)))
<  L->top = ci->top; /* prepare top */
>  if (!isIT(*(ci->u.l.savedpc - 1))) /* top not being used? */
>  L->top = ci->top; /* correct top */
833a858,859
>  /* 'L->oldpc' may be invalid; use zero in this case */
>  int oldpc = (L->oldpc < p->sizecode) ? L->oldpc : 0;
835,837c861,862
<  if (npci == 0 || /* call linehook when enter a new function, */
<  pc <= invpcRel(oldpc, p) || /* when jump back (loop), or when */
<  changedline(p, oldpc, npci)) { /* enter new line */
>  if (npci <= oldpc || /* call hook when jump back (loop), */
>  changedline(p, oldpc, npci)) { /* or when enter new line */
src/ldebug.h
28a29,38
> 
> /*
> ** MAXimum number of successive Instructions WiTHout ABSolute line
> ** information. (A power of two allows fast divisions.)
> */
> #if !defined(MAXIWTHABS)
> #define MAXIWTHABS	128
> #endif
> 
> 
33a44
> LUAI_FUNC l_noret luaG_callerror (lua_State *L, const TValue *o);
src/ldo.c
101c101
<  case CLOSEPROTECT: {
>  case LUA_OK: { /* special case only for closing upvalues */
105a106
>  lua_assert(errorstatus(errcode)); /* real error */
121,122c122
<  errcode = luaF_close(L, L->stack, errcode); /* close all upvalues */
<  L->status = cast_byte(errcode); /* mark it as dead */
>  errcode = luaE_resetthread(L, errcode); /* close all upvalues */
129,131d128
<  luaD_seterrorobj(L, errcode, L->top); /* assume EXTRA_STACK */
<  if (L->ci->top < L->top)
<  L->ci->top = L->top; /* pushing msg. can break this invariant */
166,167d162
<  if (oldstack == newstack)
<  return; /* stack address did not change */
168a164
>  L->tbclist = (L->tbclist - oldstack) + newstack;
183a180,190
> /*
> ** Reallocate the stack to a new size, correcting all pointers into
> ** it. (There are pointers to a stack from its upvalues, from its list
> ** of call infos, plus a few individual pointers.) The reallocation is
> ** done in two steps (allocation + free) because the correction must be
> ** done while both addresses (the old stack and the new one) are valid.
> ** (In ISO C, any pointer use after the pointer has been deallocated is
> ** undefined behavior.)
> ** In case of allocation error, raise an error or return false according
> ** to 'raiseerror'.
> */
185,187c192,195
<  int lim = stacksize(L);
<  StkId newstack = luaM_reallocvector(L, L->stack,
<  lim + EXTRA_STACK, newsize + EXTRA_STACK, StackValue);
>  int oldsize = stacksize(L);
>  int i;
>  StkId newstack = luaM_reallocvector(L, NULL, 0,
>  newsize + EXTRA_STACK, StackValue);
189c197
<  if (unlikely(newstack == NULL)) { /* reallocation failed? */
>  if (l_unlikely(newstack == NULL)) { /* reallocation failed? */
194,195c202,206
<  for (; lim < newsize; lim++)
<  setnilvalue(s2v(newstack + lim + EXTRA_STACK)); /* erase new segment */
>  /* number of elements to be copied to the new stack */
>  i = ((oldsize <= newsize) ? oldsize : newsize) + EXTRA_STACK;
>  memcpy(newstack, L->stack, i * sizeof(StackValue));
>  for (; i < newsize + EXTRA_STACK; i++)
>  setnilvalue(s2v(newstack + i)); /* erase new segment */
196a208
>  luaM_freearray(L, L->stack, oldsize + EXTRA_STACK);
209c221
<  if (unlikely(size > LUAI_MAXSTACK)) {
>  if (l_unlikely(size > LUAI_MAXSTACK)) {
225c237
<  if (likely(newsize <= LUAI_MAXSTACK))
>  if (l_likely(newsize <= LUAI_MAXSTACK))
300,301c312,313
<  ptrdiff_t top = savestack(L, L->top);
<  ptrdiff_t ci_top = savestack(L, ci->top);
>  ptrdiff_t top = savestack(L, L->top); /* preserve original 'top' */
>  ptrdiff_t ci_top = savestack(L, ci->top); /* idem for 'ci->top' */
310a323,324
>  if (isLua(ci) && L->top < ci->top)
>  L->top = ci->top; /* protect entire activation register */
312c326
<  if (L->top + LUA_MINSTACK > ci->top)
>  if (ci->top < L->top + LUA_MINSTACK)
334,342c348,356
<  int hook = (ci->callstatus & CIST_TAIL) ? LUA_HOOKTAILCALL : LUA_HOOKCALL;
<  Proto *p;
<  if (!(L->hookmask & LUA_MASKCALL)) /* some other hook? */
<  return; /* don't call hook */
<  p = clLvalue(s2v(ci->func))->p;
<  L->top = ci->top; /* prepare top */
<  ci->u.l.savedpc++; /* hooks assume 'pc' is already incremented */
<  luaD_hook(L, hook, -1, 1, p->numparams);
<  ci->u.l.savedpc--; /* correct 'pc' */
>  L->oldpc = 0; /* set 'oldpc' for new function */
>  if (L->hookmask & LUA_MASKCALL) { /* is call hook on? */
>  int event = (ci->callstatus & CIST_TAIL) ? LUA_HOOKTAILCALL
>  : LUA_HOOKCALL;
>  Proto *p = ci_func(ci)->p;
>  ci->u.l.savedpc++; /* hooks assume 'pc' is already incremented */
>  luaD_hook(L, event, -1, 1, p->numparams);
>  ci->u.l.savedpc--; /* correct 'pc' */
>  }
346,355c360,365
< static StkId rethook (lua_State *L, CallInfo *ci, StkId firstres, int nres) {
<  ptrdiff_t oldtop = savestack(L, L->top); /* hook may change top */
<  int delta = 0;
<  if (isLuacode(ci)) {
<  Proto *p = ci_func(ci)->p;
<  if (p->is_vararg)
<  delta = ci->u.l.nextraargs + p->numparams + 1;
<  if (L->top < ci->top)
<  L->top = ci->top; /* correct top to run hook */
<  }
> /*
> ** Executes a return hook for Lua and C functions and sets/corrects
> ** 'oldpc'. (Note that this correction is needed by the line hook, so it
> ** is done even when return hooks are off.)
> */
> static void rethook (lua_State *L, CallInfo *ci, int nres) {
356a367,368
>  StkId firstres = L->top - nres; /* index of first result */
>  int delta = 0; /* correction for vararg functions */
357a370,374
>  if (isLua(ci)) {
>  Proto *p = ci_func(ci)->p;
>  if (p->is_vararg)
>  delta = ci->u.l.nextraargs + p->numparams + 1;
>  }
364,365c381
<  L->oldpc = pcRel(ci->u.l.savedpc, ci_func(ci)->p); /* update 'oldpc' */
<  return restorestack(L, oldtop);
>  L->oldpc = pcRel(ci->u.l.savedpc, ci_func(ci)->p); /* set 'oldpc' */
377,378c393,394
<  if (unlikely(ttisnil(tm)))
<  luaG_typeerror(L, s2v(func), "call"); /* nothing to call */
>  if (l_unlikely(ttisnil(tm)))
>  luaG_callerror(L, s2v(func)); /* nothing to call */
402c418
<  else
>  else /* at least one result */
409c425
<  default: /* multiple results (or to-be-closed variables) */
>  default: /* two/more results and/or to-be-closed variables */
412,414c428,435
<  luaF_close(L, res, LUA_OK); /* may change the stack */
<  res = restorestack(L, savedres);
<  wanted = codeNresults(wanted); /* correct value */
>  L->ci->callstatus |= CIST_CLSRET; /* in case of yields */
>  L->ci->u2.nres = nres;
>  luaF_close(L, res, CLOSEKTOP, 1);
>  L->ci->callstatus &= ~CIST_CLSRET;
>  if (L->hookmask) /* if needed, call hook after '__close's */
>  rethook(L, L->ci, nres);
>  res = restorestack(L, savedres); /* close and hook can move stack */
>  wanted = decodeNresults(wanted);
416c437
<  wanted = nres;
>  wanted = nres; /* we want all results */
419a441
>  /* generic case */
421,422c443,445
<  /* move all results to correct place */
<  for (i = 0; i < nres && i < wanted; i++)
>  if (nres > wanted) /* extra results? */
>  nres = wanted; /* don't need them */
>  for (i = 0; i < nres; i++) /* move all results to correct place */
431,432c454,457
< ** Finishes a function call: calls hook if necessary, removes CallInfo,
< ** moves current number of results to proper place.
> ** Finishes a function call: calls hook if necessary, moves current
> ** number of results to proper place, and returns to previous call
> ** info. If function has to close variables, hook must be called after
> ** that.
435,437c460,462
<  if (L->hookmask)
<  L->top = rethook(L, ci, L->top - nres, nres);
<  L->ci = ci->previous; /* back to caller */
>  int wanted = ci->nresults;
>  if (l_unlikely(L->hookmask && !hastocloseCfunc(wanted)))
>  rethook(L, ci, nres);
439c464,468
<  moveresults(L, ci->func, nres, ci->nresults);
>  moveresults(L, ci->func, nres, wanted);
>  /* function cannot be in any of these cases when returning */
>  lua_assert(!(ci->callstatus &
>  (CIST_HOOKED | CIST_YPCALL | CIST_FIN | CIST_TRAN | CIST_CLSRET)));
>  L->ci = ci->previous; /* back to caller (after closing variables) */
498c527
<  if (L->hookmask & LUA_MASKCALL) {
>  if (l_unlikely(L->hookmask & LUA_MASKCALL)) {
544c573
<  if (unlikely(getCcalls(L) >= LUAI_MAXCCALLS))
>  if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS))
571,591c600,667
< ** Completes the execution of an interrupted C function, calling its
< ** continuation function.
< */
< static void finishCcall (lua_State *L, int status) {
<  CallInfo *ci = L->ci;
<  int n;
<  /* must have a continuation and must be able to call it */
<  lua_assert(ci->u.c.k != NULL && yieldable(L));
<  /* error status can only happen in a protected call */
<  lua_assert((ci->callstatus & CIST_YPCALL) || status == LUA_YIELD);
<  if (ci->callstatus & CIST_YPCALL) { /* was inside a pcall? */
<  ci->callstatus &= ~CIST_YPCALL; /* continuation is also inside it */
<  L->errfunc = ci->u.c.old_errfunc; /* with the same error function */
<  }
<  /* finish 'lua_callk'/'lua_pcall'; CIST_YPCALL and 'errfunc' already
<  handled */
<  adjustresults(L, ci->nresults);
<  lua_unlock(L);
<  n = (*ci->u.c.k)(L, status, ci->u.c.ctx); /* call continuation function */
<  lua_lock(L);
<  api_checknelems(L, n);
> ** Finish the job of 'lua_pcallk' after it was interrupted by an yield.
> ** (The caller, 'finishCcall', does the final call to 'adjustresults'.)
> ** The main job is to complete the 'luaD_pcall' called by 'lua_pcallk'.
> ** If a '__close' method yields here, eventually control will be back
> ** to 'finishCcall' (when that '__close' method finally returns) and
> ** 'finishpcallk' will run again and close any still pending '__close'
> ** methods. Similarly, if a '__close' method errs, 'precover' calls
> ** 'unroll' which calls ''finishCcall' and we are back here again, to
> ** close any pending '__close' methods.
> ** Note that, up to the call to 'luaF_close', the corresponding
> ** 'CallInfo' is not modified, so that this repeated run works like the
> ** first one (except that it has at least one less '__close' to do). In
> ** particular, field CIST_RECST preserves the error status across these
> ** multiple runs, changing only if there is a new error.
> */
> static int finishpcallk (lua_State *L, CallInfo *ci) {
>  int status = getcistrecst(ci); /* get original status */
>  if (l_likely(status == LUA_OK)) /* no error? */
>  status = LUA_YIELD; /* was interrupted by an yield */
>  else { /* error */
>  StkId func = restorestack(L, ci->u2.funcidx);
>  L->allowhook = getoah(ci->callstatus); /* restore 'allowhook' */
>  luaF_close(L, func, status, 1); /* can yield or raise an error */
>  func = restorestack(L, ci->u2.funcidx); /* stack may be moved */
>  luaD_seterrorobj(L, status, func);
>  luaD_shrinkstack(L); /* restore stack size in case of overflow */
>  setcistrecst(ci, LUA_OK); /* clear original status */
>  }
>  ci->callstatus &= ~CIST_YPCALL;
>  L->errfunc = ci->u.c.old_errfunc;
>  /* if it is here, there were errors or yields; unlike 'lua_pcallk',
>  do not change status */
>  return status;
> }
> 
> 
> /*
> ** Completes the execution of a C function interrupted by an yield.
> ** The interruption must have happened while the function was either
> ** closing its tbc variables in 'moveresults' or executing
> ** 'lua_callk'/'lua_pcallk'. In the first case, it just redoes
> ** 'luaD_poscall'. In the second case, the call to 'finishpcallk'
> ** finishes the interrupted execution of 'lua_pcallk'. After that, it
> ** calls the continuation of the interrupted function and finally it
> ** completes the job of the 'luaD_call' that called the function. In
> ** the call to 'adjustresults', we do not know the number of results
> ** of the function called by 'lua_callk'/'lua_pcallk', so we are
> ** conservative and use LUA_MULTRET (always adjust).
> */
> static void finishCcall (lua_State *L, CallInfo *ci) {
>  int n; /* actual number of results from C function */
>  if (ci->callstatus & CIST_CLSRET) { /* was returning? */
>  lua_assert(hastocloseCfunc(ci->nresults));
>  n = ci->u2.nres; /* just redo 'luaD_poscall' */
>  /* don't need to reset CIST_CLSRET, as it will be set again anyway */
>  }
>  else {
>  int status = LUA_YIELD; /* default if there were no errors */
>  /* must have a continuation and must be able to call it */
>  lua_assert(ci->u.c.k != NULL && yieldable(L));
>  if (ci->callstatus & CIST_YPCALL) /* was inside a 'lua_pcallk'? */
>  status = finishpcallk(L, ci); /* finish it */
>  adjustresults(L, LUA_MULTRET); /* finish 'lua_callk' */
>  lua_unlock(L);
>  n = (*ci->u.c.k)(L, status, ci->u.c.ctx); /* call continuation */
>  lua_lock(L);
>  api_checknelems(L, n);
>  }
599,602c675
< ** interruption long-jumps out of the loop). If the coroutine is
< ** recovering from an error, 'ud' points to the error status, which must
< ** be passed to the first continuation function (otherwise the default
< ** status is LUA_YIELD).
> ** interruption long-jumps out of the loop).
606,607c679
<  if (ud != NULL) /* error status? */
<  finishCcall(L, *(int *)ud); /* finish 'lua_pcallk' callee */
>  UNUSED(ud);
610c682
<  finishCcall(L, LUA_YIELD); /* complete its execution */
>  finishCcall(L, ci); /* complete its execution */
634,655d705
< ** Recovers from an error in a coroutine. Finds a recover point (if
< ** there is one) and completes the execution of the interrupted
< ** 'luaD_pcall'. If there is no recover point, returns zero.
< */
< static int recover (lua_State *L, int status) {
<  StkId oldtop;
<  CallInfo *ci = findpcall(L);
<  if (ci == NULL) return 0; /* no recovery point */
<  /* "finish" luaD_pcall */
<  oldtop = restorestack(L, ci->u2.funcidx);
<  L->ci = ci;
<  L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */
<  status = luaF_close(L, oldtop, status); /* may change the stack */
<  oldtop = restorestack(L, ci->u2.funcidx);
<  luaD_seterrorobj(L, status, oldtop);
<  luaD_shrinkstack(L); /* restore stack size in case of overflow */
<  L->errfunc = ci->u.c.old_errfunc;
<  return 1; /* continue running the coroutine */
< }
< 
< 
< /*
686c736,737
<  if (isLua(ci)) /* yielded inside a hook? */
>  if (isLua(ci)) { /* yielded inside a hook? */
>  L->top = firstArg; /* discard arguments */
687a739
>  }
700a753,772
> 
> /*
> ** Unrolls a coroutine in protected mode while there are recoverable
> ** errors, that is, errors inside a protected call. (Any error
> ** interrupts 'unroll', and this loop protects it again so it can
> ** continue.) Stops with a normal end (status == LUA_OK), an yield
> ** (status == LUA_YIELD), or an unprotected error ('findpcall' doesn't
> ** find a recover point).
> */
> static int precover (lua_State *L, int status) {
>  CallInfo *ci;
>  while (errorstatus(status) && (ci = findpcall(L)) != NULL) {
>  L->ci = ci; /* go down to recovery functions */
>  setcistrecst(ci, status); /* status to finish 'pcall' */
>  status = luaD_rawrunprotected(L, unroll, NULL);
>  }
>  return status;
> }
> 
> 
718,722c790,791
<  while (errorstatus(status) && recover(L, status)) {
<  /* unroll continuation */
<  status = luaD_rawrunprotected(L, unroll, &status);
<  }
<  if (likely(!errorstatus(status)))
>  status = precover(L, status);
>  if (l_likely(!errorstatus(status)))
748c817
<  if (unlikely(!yieldable(L))) {
>  if (l_unlikely(!yieldable(L))) {
754a824
>  ci->u2.nyield = nresults; /* save number of results */
756a827
>  api_check(L, nresults == 0, "hooks cannot yield values");
758d828
<  ci->u2.nyield = 0; /* no results */
763d832
<  ci->u2.nyield = nresults; /* save number of results */
772a842,880
> ** Auxiliary structure to call 'luaF_close' in protected mode.
> */
> struct CloseP {
>  StkId level;
>  int status;
> };
> 
> 
> /*
> ** Auxiliary function to call 'luaF_close' in protected mode.
> */
> static void closepaux (lua_State *L, void *ud) {
>  struct CloseP *pcl = cast(struct CloseP *, ud);
>  luaF_close(L, pcl->level, pcl->status, 0);
> }
> 
> 
> /*
> ** Calls 'luaF_close' in protected mode. Return the original status
> ** or, in case of errors, the new status.
> */
> int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status) {
>  CallInfo *old_ci = L->ci;
>  lu_byte old_allowhooks = L->allowhook;
>  for (;;) { /* keep closing upvalues until no more errors */
>  struct CloseP pcl;
>  pcl.level = restorestack(L, level); pcl.status = status;
>  status = luaD_rawrunprotected(L, &closepaux, &pcl);
>  if (l_likely(status == LUA_OK)) /* no more errors? */
>  return pcl.status;
>  else { /* an error occurred; restore saved state and repeat */
>  L->ci = old_ci;
>  L->allowhook = old_allowhooks;
>  }
>  }
> }
> 
> 
> /*
785,786c893
<  if (unlikely(status != LUA_OK)) { /* an error occurred? */
<  StkId oldtop = restorestack(L, old_top);
>  if (l_unlikely(status != LUA_OK)) { /* an error occurred? */
789,791c896,897
<  status = luaF_close(L, oldtop, status);
<  oldtop = restorestack(L, old_top); /* previous call may change stack */
<  luaD_seterrorobj(L, status, oldtop);
>  status = luaD_closeprotected(L, old_top, status);
>  luaD_seterrorobj(L, status, restorestack(L, old_top));
src/ldo.h
26c26
< 	if (L->stack_last - L->top <= (n)) \
> 	if (l_unlikely(L->stack_last - L->top <= (n))) \
65a66
> LUAI_FUNC int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status);
src/lfunc.c
103,108d102
< static void callclose (lua_State *L, void *ud) {
<  UNUSED(ud);
<  luaD_callnoyield(L, L->top - 3, 0);
< }
< 
< 
110,111c104,106
< ** Prepare closing method plus its arguments for object 'obj' with
< ** error message 'err'. (This function assumes EXTRA_STACK.)
> ** Call closing method for object 'obj' with error message 'err'. The
> ** boolean 'yy' controls whether the call is yieldable.
> ** (This function assumes EXTRA_STACK.)
113c108
< static int prepclosingmethod (lua_State *L, TValue *obj, TValue *err) {
> static void callclosemethod (lua_State *L, TValue *obj, TValue *err, int yy) {
116,117d110
<  if (ttisnil(tm)) /* no metamethod? */
<  return 0; /* nothing to call */
122c115,118
<  return 1;
>  if (yy)
>  luaD_call(L, top, 0);
>  else
>  luaD_callnoyield(L, top, 0);
127,128c123,124
< ** Raise an error with message 'msg', inserting the name of the
< ** local variable at position 'level' in the stack.
> ** Check whether object at given level has a close metamethod and raise
> ** an error if not.
130,134c126,133
< static void varerror (lua_State *L, StkId level, const char *msg) {
<  int idx = cast_int(level - L->ci->func);
<  const char *vname = luaG_findlocal(L, L->ci, idx, NULL);
<  if (vname == NULL) vname = "?";
<  luaG_runerror(L, msg, vname);
> static void checkclosemth (lua_State *L, StkId level) {
>  const TValue *tm = luaT_gettmbyobj(L, s2v(level), TM_CLOSE);
>  if (ttisnil(tm)) { /* no metamethod? */
>  int idx = cast_int(level - L->ci->func); /* variable index */
>  const char *vname = luaG_findlocal(L, L->ci, idx, NULL);
>  if (vname == NULL) vname = "?";
>  luaG_runerror(L, "variable '%s' got a non-closable value", vname);
>  }
139,148c138,142
< ** Prepare and call a closing method. If status is OK, code is still
< ** inside the original protected call, and so any error will be handled
< ** there. Otherwise, a previous error already activated the original
< ** protected call, and so the call to the closing method must be
< ** protected here. (A status == CLOSEPROTECT behaves like a previous
< ** error, to also run the closing method in protected mode).
< ** If status is OK, the call to the closing method will be pushed
< ** at the top of the stack. Otherwise, values are pushed after
< ** the 'level' of the upvalue being closed, as everything after
< ** that won't be used again.
> ** Prepare and call a closing method.
> ** If status is CLOSEKTOP, the call to the closing method will be pushed
> ** at the top of the stack. Otherwise, values can be pushed right after
> ** the 'level' of the upvalue being closed, as everything after that
> ** won't be used again.
150c144
< static int callclosemth (lua_State *L, StkId level, int status) {
> static void prepcallclosemth (lua_State *L, StkId level, int status, int yy) {
152,174c146,151
<  if (likely(status == LUA_OK)) {
<  if (prepclosingmethod(L, uv, &G(L)->nilvalue)) /* something to call? */
<  callclose(L, NULL); /* call closing method */
<  else if (!l_isfalse(uv)) /* non-closable non-false value? */
<  varerror(L, level, "attempt to close non-closable variable '%s'");
<  }
<  else { /* must close the object in protected mode */
<  ptrdiff_t oldtop;
<  level++; /* space for error message */
<  oldtop = savestack(L, level + 1); /* top will be after that */
<  luaD_seterrorobj(L, status, level); /* set error message */
<  if (prepclosingmethod(L, uv, s2v(level))) { /* something to call? */
<  int newstatus = luaD_pcall(L, callclose, NULL, oldtop, 0);
<  if (newstatus != LUA_OK && status == CLOSEPROTECT) /* first error? */
<  status = newstatus; /* this will be the new error */
<  else {
<  if (newstatus != LUA_OK) /* suppressed error? */
<  luaE_warnerror(L, "__close metamethod");
<  /* leave original error (or nil) on top */
<  L->top = restorestack(L, oldtop);
<  }
<  }
<  /* else no metamethod; ignore this case and keep original error */
>  TValue *errobj;
>  if (status == CLOSEKTOP)
>  errobj = &G(L)->nilvalue; /* error object is nil */
>  else { /* 'luaD_seterrorobj' will set top to level + 2 */
>  errobj = s2v(level + 1); /* error object goes after 'uv' */
>  luaD_seterrorobj(L, status, level + 1); /* set error object */
176c153
<  return status;
>  callclosemethod(L, uv, errobj, yy);
181,182c158,160
< ** Try to create a to-be-closed upvalue
< ** (can raise a memory-allocation error)
> ** Maximum value for deltas in 'tbclist', dependent on the type
> ** of delta. (This macro assumes that an 'L' is in scope where it
> ** is used.)
184,186c162,163
< static void trynewtbcupval (lua_State *L, void *ud) {
<  newupval(L, 1, cast(StkId, ud), &L->openupval);
< }
> #define MAXDELTA \
> 	((256ul << ((sizeof(L->stack->tbclist.delta) - 1) * 8)) - 1)
190,192c167
< ** Create a to-be-closed upvalue. If there is a memory error
< ** when creating the upvalue, the closing method must be called here,
< ** as there is no upvalue to call it later.
> ** Insert a variable in the list of to-be-closed variables.
195,210c170,176
<  TValue *obj = s2v(level);
<  lua_assert(L->openupval == NULL || uplevel(L->openupval) < level);
<  if (!l_isfalse(obj)) { /* false doesn't need to be closed */
<  int status;
<  const TValue *tm = luaT_gettmbyobj(L, obj, TM_CLOSE);
<  if (ttisnil(tm)) /* no metamethod? */
<  varerror(L, level, "variable '%s' got a non-closable value");
<  status = luaD_rawrunprotected(L, trynewtbcupval, level);
<  if (unlikely(status != LUA_OK)) { /* memory error creating upvalue? */
<  lua_assert(status == LUA_ERRMEM);
<  luaD_seterrorobj(L, LUA_ERRMEM, level + 1); /* save error message */
<  /* next call must succeed, as object is closable */
<  prepclosingmethod(L, s2v(level), s2v(level + 1));
<  callclose(L, NULL); /* call closing method */
<  luaD_throw(L, LUA_ERRMEM); /* throw memory error */
<  }
>  lua_assert(level > L->tbclist);
>  if (l_isfalse(s2v(level)))
>  return; /* false doesn't need to be closed */
>  checkclosemth(L, level); /* value must have a close method */
>  while (cast_uint(level - L->tbclist) > MAXDELTA) {
>  L->tbclist += MAXDELTA; /* create a dummy node at maximum delta */
>  L->tbclist->tbclist.delta = 0;
211a178,179
>  level->tbclist.delta = cast(unsigned short, level - L->tbclist);
>  L->tbclist = level;
223c191,194
< int luaF_close (lua_State *L, StkId level, int status) {
> /*
> ** Close all upvalues up to the given stack level.
> */
> void luaF_closeupval (lua_State *L, StkId level) {
225c196,197
<  while ((uv = L->openupval) != NULL && uplevel(uv) >= level) {
>  StkId upl; /* stack index pointed by 'uv' */
>  while ((uv = L->openupval) != NULL && (upl = uplevel(uv)) >= level) {
228,234c200
<  if (uv->tbc && status != NOCLOSINGMETH) {
<  /* must run closing method, which may change the stack */
<  ptrdiff_t levelrel = savestack(L, level);
<  status = callclosemth(L, uplevel(uv), status);
<  level = restorestack(L, levelrel);
<  }
<  luaF_unlinkupval(uv);
>  luaF_unlinkupval(uv); /* remove upvalue from 'openupval' list */
242c208,236
<  return status;
> }
> 
> 
> /*
> ** Remove firt element from the tbclist plus its dummy nodes.
> */
> static void poptbclist (lua_State *L) {
>  StkId tbc = L->tbclist;
>  lua_assert(tbc->tbclist.delta > 0); /* first element cannot be dummy */
>  tbc -= tbc->tbclist.delta;
>  while (tbc > L->stack && tbc->tbclist.delta == 0)
>  tbc -= MAXDELTA; /* remove dummy nodes */
>  L->tbclist = tbc;
> }
> 
> 
> /*
> ** Close all upvalues and to-be-closed variables up to the given stack
> ** level.
> */
> void luaF_close (lua_State *L, StkId level, int status, int yy) {
>  ptrdiff_t levelrel = savestack(L, level);
>  luaF_closeupval(L, level); /* first, close the upvalues */
>  while (L->tbclist >= level) { /* traverse tbc's down to that level */
>  StkId tbc = L->tbclist; /* get variable index */
>  poptbclist(L); /* remove it from list */
>  prepcallclosemth(L, tbc, status, yy); /* close variable */
>  level = restorestack(L, levelrel);
>  }
src/lfunc.h
45,47d44
< /*
< ** Special "status" for 'luaF_close'
< */
49,53c46,47
< /* close upvalues without running their closing methods */
< #define NOCLOSINGMETH	(-1)
< 
< /* close upvalues running all closing methods in protected mode */
< #define CLOSEPROTECT	(-2)
> /* special status to close upvalues preserving the top of the stack */
> #define CLOSEKTOP	(-1)
62c56,57
< LUAI_FUNC int luaF_close (lua_State *L, StkId level, int status);
> LUAI_FUNC void luaF_closeupval (lua_State *L, StkId level);
> LUAI_FUNC void luaF_close (lua_State *L, StkId level, int status, int yy);
src/lgc.c
919c919
<  if (unlikely(status != LUA_OK)) { /* error while running __gc? */
>  if (l_unlikely(status != LUA_OK)) { /* error while running __gc? */
1577a1578,1580
>  lu_mem work;
>  lua_assert(!g->gcstopem); /* collector is not reentrant */
>  g->gcstopem = 1; /* no emergency collections while collecting */
1582c1585,1586
<  return 1;
>  work = 1;
>  break;
1587c1591
<  return 0;
>  work = 0;
1590c1594,1595
<  return propagatemark(g); /* traverse one gray object */
>  work = propagatemark(g); /* traverse one gray object */
>  break;
1593c1598
<  lu_mem work = atomic(L); /* work is what was traversed by 'atomic' */
>  work = atomic(L); /* work is what was traversed by 'atomic' */
1596c1601
<  return work;
>  break;
1599c1604,1605
<  return sweepstep(L, g, GCSswpfinobj, &g->finobj);
>  work = sweepstep(L, g, GCSswpfinobj, &g->finobj);
>  break;
1602c1608,1609
<  return sweepstep(L, g, GCSswptobefnz, &g->tobefnz);
>  work = sweepstep(L, g, GCSswptobefnz, &g->tobefnz);
>  break;
1605c1612,1613
<  return sweepstep(L, g, GCSswpend, NULL);
>  work = sweepstep(L, g, GCSswpend, NULL);
>  break;
1610c1618,1619
<  return 0;
>  work = 0;
>  break;
1614,1615c1623,1624
<  int n = runafewfinalizers(L, GCFINMAX);
<  return n * GCFINALIZECOST;
>  g->gcstopem = 0; /* ok collections during finalizers */
>  work = runafewfinalizers(L, GCFINMAX) * GCFINALIZECOST;
1619c1628
<  return 0;
>  work = 0;
1620a1630
>  break;
1623a1634,1635
>  g->gcstopem = 0;
>  return work;
src/liolib.c
55,60d54
< #if !defined(l_checkmodep)
< /* By default, Lua accepts only "r" or "w" as mode */
< #define l_checkmodep(m)	((m[0] == 'r' || m[0] == 'w') && m[1] == '0円')
< #endif
< 
< 
72a67,72
> #if !defined(l_checkmodep)
> /* Windows accepts "[rw][bt]?" as valid modes */
> #define l_checkmodep(m)	((m[0] == 'r' || m[0] == 'w') && \
>  (m[1] == '0円' || ((m[1] == 'b' || m[1] == 't') && m[2] == '0円')))
> #endif
> 
85a86,91
> 
> #if !defined(l_checkmodep)
> /* By default, Lua accepts only "r" or "w" as valid modes */
> #define l_checkmodep(m) ((m[0] == 'r' || m[0] == 'w') && m[1] == '0円')
> #endif
> 
183c189
<  if (isclosed(p))
>  if (l_unlikely(isclosed(p)))
258c264
<  if (p->f == NULL)
>  if (l_unlikely(p->f == NULL))
306c312
<  if (isclosed(p))
>  if (l_unlikely(isclosed(p)))
433c439
<  if (rn->n >= L_MAXLENNUM) { /* buffer overflow? */
>  if (l_unlikely(rn->n >= L_MAXLENNUM)) { /* buffer overflow? */
496,497c502,503
<  if (lua_stringtonumber(L, rn.buff)) /* is this a valid number? */
<  return 1; /* ok */
>  if (l_likely(lua_stringtonumber(L, rn.buff)))
>  return 1; /* ok, it is a valid number */
673c679,680
<  if (status) return 1; /* file handle already on stack top */
>  if (l_likely(status))
>  return 1; /* file handle already on stack top */
700c707
<  if (op)
>  if (l_unlikely(op))
src/llex.c
125,127c125,132
< ** creates a new string and anchors it in scanner's table so that
< ** it will not be collected until the end of the compilation
< ** (by that time it should be anchored somewhere)
> ** Creates a new string and anchors it in scanner's table so that it
> ** will not be collected until the end of the compilation; by that time
> ** it should be anchored somewhere. It also internalizes long strings,
> ** ensuring there is only one copy of each unique string. The table
> ** here is used as a set: the string enters as the key, while its value
> ** is irrelevant. We use the string itself as the value only because it
> ** is a TValue readly available. Later, the code generation can change
> ** this value.
131d135
<  TValue *o; /* entry for 'str' */
133,138c137,144
<  setsvalue2s(L, L->top++, ts); /* temporarily anchor it in stack */
<  o = luaH_set(L, ls->h, s2v(L->top - 1));
<  if (isempty(o)) { /* not in use yet? */
<  /* boolean value does not need GC barrier;
<  table is not a metatable, so it does not need to invalidate cache */
<  setbtvalue(o); /* t[string] = true */
>  const TValue *o = luaH_getstr(ls->h, ts);
>  if (!ttisnil(o)) /* string already present? */
>  ts = keystrval(nodefromval(o)); /* get saved copy */
>  else { /* not in use yet */
>  TValue *stv = s2v(L->top++); /* reserve stack space for string */
>  setsvalue(L, stv, ts); /* temporarily anchor the string */
>  luaH_finishset(L, ls->h, stv, o, stv); /* t[string] = string */
>  /* table is not a metatable, so it does not need to invalidate cache */
139a146
>  L->top--; /* remove string from stack */
141,144d147
<  else { /* string already present */
<  ts = keystrval(nodefromval(o)); /* re-use value previously stored */
<  }
<  L->top--; /* remove string from stack */
src/llimits.h
153,168d152
< ** macros to improve jump prediction (used mainly for error handling)
< */
< #if !defined(likely)
< 
< #if defined(__GNUC__)
< #define likely(x)	(__builtin_expect(((x) != 0), 1))
< #define unlikely(x)	(__builtin_expect(((x) != 0), 0))
< #else
< #define likely(x)	(x)
< #define unlikely(x)	(x)
< #endif
< 
< #endif
< 
< 
< /*
src/lmathlib.c
76c76
<  if (valid)
>  if (l_likely(valid))
178c178,179
<  res = l_mathop(log2)(x); else
>  res = l_mathop(log2)(x);
>  else
src/lmem.c
27,29c27,29
< ** First allocation will fail whenever not building initial state
< ** and not shrinking a block. (This fail will trigger 'tryagain' and
< ** a full GC cycle at every allocation.)
> ** First allocation will fail whenever not building initial state.
> ** (This fail will trigger 'tryagain' and a full GC cycle at every
> ** allocation.)
32c32
<  if (ttisnil(&g->nilvalue) && ns > os)
>  if (completestate(g) && ns > 0) /* frees never fail */
86c86
<  if (unlikely(size >= limit)) /* cannot grow even a little? */
>  if (l_unlikely(size >= limit)) /* cannot grow even a little? */
141,144c141,146
< ** In case of allocation fail, this function will call the GC to try
< ** to free some memory and then try the allocation again.
< ** (It should not be called when shrinking a block, because then the
< ** interpreter may be in the middle of a collection step.)
> ** In case of allocation fail, this function will do an emergency
> ** collection to free some memory and then try the allocation again.
> ** The GC should not be called while state is not fully built, as the
> ** collector is not yet fully initialized. Also, it should not be called
> ** when 'gcstopem' is true, because then the interpreter is in the
> ** middle of a collection step.
149c151
<  if (ttisnil(&g->nilvalue)) { /* is state fully build? */
>  if (completestate(g) && !g->gcstopem) {
159,160d160
< ** If allocation fails while shrinking a block, do not try again; the
< ** GC shrinks some blocks and it is not reentrant.
167,169c167,168
<  if (unlikely(newblock == NULL && nsize > 0)) {
<  if (nsize > osize) /* not shrinking a block? */
<  newblock = tryagain(L, block, osize, nsize);
>  if (l_unlikely(newblock == NULL && nsize > 0)) {
>  newblock = tryagain(L, block, osize, nsize);
182c181
<  if (unlikely(newblock == NULL && nsize > 0)) /* allocation failed? */
>  if (l_unlikely(newblock == NULL && nsize > 0)) /* allocation failed? */
194c193
<  if (unlikely(newblock == NULL)) {
>  if (l_unlikely(newblock == NULL)) {
src/loadlib.c
135c135,136
<  if (lib == NULL) lua_pushstring(L, dlerror());
>  if (l_unlikely(lib == NULL))
>  lua_pushstring(L, dlerror());
142c143,144
<  if (f == NULL) lua_pushstring(L, dlerror());
>  if (l_unlikely(f == NULL))
>  lua_pushstring(L, dlerror());
413c415
<  if (stat == 0) /* no errors? */
>  if (l_likely(stat == 0)) /* no errors? */
526c528
<  if (path == NULL)
>  if (l_unlikely(path == NULL))
533c535
<  if (stat) { /* module loaded successfully? */
>  if (l_likely(stat)) { /* module loaded successfully? */
626c628,629
<  if (lua_getfield(L, lua_upvalueindex(1), "searchers") != LUA_TTABLE)
>  if (l_unlikely(lua_getfield(L, lua_upvalueindex(1), "searchers")
>  != LUA_TTABLE))
632c635
<  if (lua_rawgeti(L, 3, i) == LUA_TNIL) { /* no more searchers? */
>  if (l_unlikely(lua_rawgeti(L, 3, i) == LUA_TNIL)) { /* no more searchers? */
src/lobject.h
139c139,144
< ** Entries in the Lua stack
> ** Entries in a Lua stack. Field 'tbclist' forms a list of all
> ** to-be-closed variables active in this stack. Dummy entries are
> ** used when the distance between two tbc variables does not fit
> ** in an unsigned short. They are represented by delta==0, and
> ** their real delta is always the maximum value that fits in
> ** that field.
142a148,151
>  struct {
>  TValuefields;
>  unsigned short delta;
>  } tbclist;
573d581
< #define ttisclosure(o)		((rawtt(o) & 0x1F) == LUA_VLCL)
576a585,586
> #define ttisclosure(o) (ttisLclosure(o) || ttisCclosure(o))
> 
src/lopcodes.h
228,234c228,234
< OP_ADDK,/*	A B C	R[A] := R[B] + K[C]				*/
< OP_SUBK,/*	A B C	R[A] := R[B] - K[C]				*/
< OP_MULK,/*	A B C	R[A] := R[B] * K[C]				*/
< OP_MODK,/*	A B C	R[A] := R[B] % K[C]				*/
< OP_POWK,/*	A B C	R[A] := R[B] ^ K[C]				*/
< OP_DIVK,/*	A B C	R[A] := R[B] / K[C]				*/
< OP_IDIVK,/*	A B C	R[A] := R[B] // K[C]				*/
> OP_ADDK,/*	A B C	R[A] := R[B] + K[C]:number			*/
> OP_SUBK,/*	A B C	R[A] := R[B] - K[C]:number			*/
> OP_MULK,/*	A B C	R[A] := R[B] * K[C]:number			*/
> OP_MODK,/*	A B C	R[A] := R[B] % K[C]:number			*/
> OP_POWK,/*	A B C	R[A] := R[B] ^ K[C]:number			*/
> OP_DIVK,/*	A B C	R[A] := R[B] / K[C]:number			*/
> OP_IDIVK,/*	A B C	R[A] := R[B] // K[C]:number			*/
src/loslib.c
173c173
<  if (err)
>  if (l_unlikely(err))
211c211
<  if (value > LUA_MAXINTEGER - delta)
>  if (l_unlikely(value > LUA_MAXINTEGER - delta))
256c256
<  if (t != LUA_TNIL) /* some other value? */
>  if (l_unlikely(t != LUA_TNIL)) /* some other value? */
258c258
<  else if (d < 0) /* absent field; no default? */
>  else if (l_unlikely(d < 0)) /* absent field; no default? */
src/lparser.c
131c131
<  if (unlikely(!testnext(ls, what))) {
>  if (l_unlikely(!testnext(ls, what))) {
225,228c225,227
< ** Convert 'nvar', a compiler index level, to it corresponding
< ** stack index level. For that, search for the highest variable
< ** below that level that is in the stack and uses its stack
< ** index ('sidx').
> ** Convert 'nvar', a compiler index level, to its corresponding
> ** register. For that, search for the highest variable below that level
> ** that is in a register and uses its register index ('ridx') plus one.
230c229
< static int stacklevel (FuncState *fs, int nvar) {
> static int reglevel (FuncState *fs, int nvar) {
232,234c231,233
<  Vardesc *vd = getlocalvardesc(fs, nvar); /* get variable */
<  if (vd->vd.kind != RDKCTC) /* is in the stack? */
<  return vd->vd.sidx + 1;
>  Vardesc *vd = getlocalvardesc(fs, nvar); /* get previous variable */
>  if (vd->vd.kind != RDKCTC) /* is in a register? */
>  return vd->vd.ridx + 1;
236c235
<  return 0; /* no variables in the stack */
>  return 0; /* no variables in registers */
241c240,241
< ** Return the number of variables in the stack for function 'fs'
> ** Return the number of variables in the register stack for the given
> ** function.
244c244
<  return stacklevel(fs, fs->nactvar);
>  return reglevel(fs, fs->nactvar);
270c270
<  e->u.var.sidx = getlocalvardesc(fs, vidx)->vd.sidx;
>  e->u.var.ridx = getlocalvardesc(fs, vidx)->vd.ridx;
313c313
<  int stklevel = luaY_nvarstack(fs);
>  int reglevel = luaY_nvarstack(fs);
318c318
<  var->vd.sidx = stklevel++;
>  var->vd.ridx = reglevel++;
369c369
<  up->idx = v->u.var.sidx;
>  up->idx = v->u.var.ridx;
520c520
<  if (unlikely(gt->nactvar < label->nactvar)) /* enter some scope? */
>  if (l_unlikely(gt->nactvar < label->nactvar)) /* enter some scope? */
623c623
<  if (stacklevel(fs, gt->nactvar) > stacklevel(fs, bl->nactvar))
>  if (reglevel(fs, gt->nactvar) > reglevel(fs, bl->nactvar))
664c664
<  int stklevel = stacklevel(fs, bl->nactvar); /* level outside the block */
>  int stklevel = reglevel(fs, bl->nactvar); /* level outside the block */
1333c1333
<  if (v->k == VLOCAL && lh->v.u.ind.t == v->u.var.sidx) {
>  if (v->k == VLOCAL && lh->v.u.ind.t == v->u.var.ridx) {
1339c1339
<  lh->v.u.ind.idx == v->u.var.sidx) {
>  lh->v.u.ind.idx == v->u.var.ridx) {
1349c1349
<  luaK_codeABC(fs, OP_MOVE, extra, v->u.var.sidx, 0);
>  luaK_codeABC(fs, OP_MOVE, extra, v->u.var.ridx, 0);
1414c1414
<  int lblevel = stacklevel(fs, lb->nactvar); /* label level */
>  int lblevel = reglevel(fs, lb->nactvar); /* label level */
1438c1438
<  if (unlikely(lb != NULL)) { /* already defined? */
>  if (l_unlikely(lb != NULL)) { /* already defined? */
1491c1491
<  luaK_codeABC(fs, OP_CLOSE, stacklevel(fs, bl2.nactvar), 0, 0);
>  luaK_codeABC(fs, OP_CLOSE, reglevel(fs, bl2.nactvar), 0, 0);
1523c1523
<  if (unlikely(offset > MAXARG_Bx))
>  if (l_unlikely(offset > MAXARG_Bx))
1711c1711
<  luaK_codeABC(fs, OP_TBC, stacklevel(fs, level), 0, 0);
>  luaK_codeABC(fs, OP_TBC, reglevel(fs, level), 0, 0);
src/lparser.h
38c38
<  VLOCAL, /* local variable; var.sidx = stack index (local register);
>  VLOCAL, /* local variable; var.ridx = register index;
80c80
<  lu_byte sidx; /* index in the stack */
>  lu_byte ridx; /* register holding the variable */
100c100
<  lu_byte sidx; /* index of the variable in the stack */
>  lu_byte ridx; /* register holding the variable */
src/lstate.c
175c175
<  if (unlikely(getCcalls(L) >= LUAI_MAXCCALLS))
>  if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS))
183a184
>  L1->tbclist = L1->stack;
216d216
<  TValue temp;
222,226c222,224
<  setthvalue(L, &temp, L); /* temp = L */
<  luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp);
<  /* registry[LUA_RIDX_GLOBALS] = table of globals */
<  sethvalue(L, &temp, luaH_new(L)); /* temp = new table (global table) */
<  luaH_setint(L, registry, LUA_RIDX_GLOBALS, &temp);
>  setthvalue(L, &registry->array[LUA_RIDX_MAINTHREAD - 1], L);
>  /* registry[LUA_RIDX_GLOBALS] = new table (table of globals) */
>  sethvalue(L, &registry->array[LUA_RIDX_GLOBALS - 1], luaH_new(L));
232,233d229
< ** ('g->nilvalue' being a nil value flags that the state was completely
< ** build.)
244c240
<  setnilvalue(&g->nilvalue);
>  setnilvalue(&g->nilvalue); /* now state is complete */
258a255
>  L->nCcalls = 0;
274,276c271,275
<  luaF_close(L, L->stack, CLOSEPROTECT); /* close all upvalues */
<  luaC_freeallobjects(L); /* collect all objects */
<  if (ttisnil(&g->nilvalue)) /* closing a fully built state? */
>  if (!completestate(g)) /* closing a partially built state? */
>  luaC_freeallobjects(L); /* jucst collect its objects */
>  else { /* closing a fully built state */
>  luaD_closeprotected(L, 1, LUA_OK); /* close all upvalues */
>  luaC_freeallobjects(L); /* collect all objects */
277a277
>  }
302d301
<  L1->nCcalls = 0;
319c318
<  luaF_close(L1, L1->stack, NOCLOSINGMETH); /* close all upvalues */
>  luaF_closeupval(L1, L1->stack); /* close all upvalues */
327,331c326,327
< int lua_resetthread (lua_State *L) {
<  CallInfo *ci;
<  int status;
<  lua_lock(L);
<  L->ci = ci = &L->base_ci; /* unwind CallInfo list */
> int luaE_resetthread (lua_State *L, int status) {
>  CallInfo *ci = L->ci = &L->base_ci; /* unwind CallInfo list */
335,338c331
<  status = luaF_close(L, L->stack, CLOSEPROTECT);
<  if (status != CLOSEPROTECT) /* real errors? */
<  luaD_seterrorobj(L, status, L->stack + 1);
<  else {
>  if (status == LUA_YIELD)
339a333,336
>  status = luaD_closeprotected(L, 1, status);
>  if (status != LUA_OK) /* errors? */
>  luaD_seterrorobj(L, status, L->stack + 1);
>  else
341d337
<  }
343c339,348
<  L->status = status;
>  L->status = cast_byte(status);
>  luaD_reallocstack(L, cast_int(ci->top - L->stack), 0);
>  return status;
> }
> 
> 
> LUA_API int lua_resetthread (lua_State *L) {
>  int status;
>  lua_lock(L);
>  status = luaE_resetthread(L, L->status);
363d367
<  L->nCcalls = 0;
377a382
>  g->gcstopem = 0;
src/lstate.h
158a159,170
> ** About union 'u':
> ** - field 'l' is used only for Lua functions;
> ** - field 'c' is used only for C functions.
> ** About union 'u2':
> ** - field 'funcidx' is used only by C functions while doing a
> ** protected call;
> ** - field 'nyield' is used only while a function is "doing" an
> ** yield (from the yield until the next resume);
> ** - field 'nres' is used only while closing tbc variables when
> ** returning from a C function;
> ** - field 'transferinfo' is used only during call/returnhooks,
> ** before the function starts or after it ends.
178a191
>  int nres; /* number of values returned */
194c207
< #define CIST_FRESH	(1<<2) /* call is on a fresh "luaV_execute" frame */
> #define CIST_FRESH	(1<<2)	/* call is on a fresh "luaV_execute" frame */
196c209
< #define CIST_YPCALL	(1<<4)	/* call is a yieldable protected call */
> #define CIST_YPCALL	(1<<4)	/* doing a yieldable protected call */
199c212
< #define CIST_FIN	(1<<7) /* call is running a finalizer */
> #define CIST_FIN	(1<<7)	/* call is running a finalizer */
200a214,216
> #define CIST_CLSRET	(1<<9) /* function is closing tbc variables */
> /* Bits 10-12 are used for CIST_RECST (see below) */
> #define CIST_RECST	10
202c218
< #define CIST_LEQ	(1<<9) /* using __lt for __le */
> #define CIST_LEQ	(1<<13) /* using __lt for __le */
204a221,234
> 
> /*
> ** Field CIST_RECST stores the "recover status", used to keep the error
> ** status while closing to-be-closed variables in coroutines, so that
> ** Lua can correctly resume after an yield from a __close method called
> ** because of an error. (Three bits are enough for error status.)
> */
> #define getcistrecst(ci) (((ci)->callstatus >> CIST_RECST) & 7)
> #define setcistrecst(ci,st) \
>  check_exp(((st) & 7) == (st), /* status must fit in three bits */ \
>  ((ci)->callstatus = ((ci)->callstatus & ~(7 << CIST_RECST)) \
>  | ((st) << CIST_RECST)))
> 
> 
232a263
>  lu_byte gcstopem; /* stops emergency collections */
283a315
>  StkId tbclist; /* list of to-be-closed variables */
299a332,337
> /*
> ** 'g->nilvalue' being a nil value flags that the state was completely
> ** build.
> */
> #define completestate(g)	ttisnil(&g->nilvalue)
> 
361a400
> LUAI_FUNC int luaE_resetthread (lua_State *L, int status);
src/lstring.c
92c92
<  if (unlikely(newvect == NULL)) { /* reallocation failed? */
>  if (l_unlikely(newvect == NULL)) { /* reallocation failed? */
175c175
<  if (unlikely(tb->nuse == MAX_INT)) { /* too many strings? */
>  if (l_unlikely(tb->nuse == MAX_INT)) { /* too many strings? */
226c226
<  if (unlikely(l >= (MAX_SIZE - sizeof(TString))/sizeof(char)))
>  if (l_unlikely(l >= (MAX_SIZE - sizeof(TString))/sizeof(char)))
262c262
<  if (unlikely(s > MAX_SIZE - udatamemoffset(nuvalue)))
>  if (l_unlikely(s > MAX_SIZE - udatamemoffset(nuvalue)))
src/lstrlib.c
155,156c155,157
<  if (n <= 0) lua_pushliteral(L, "");
<  else if (l + lsep < l || l + lsep > MAXSIZE / n) /* may overflow? */
>  if (n <= 0)
>  lua_pushliteral(L, "");
>  else if (l_unlikely(l + lsep < l || l + lsep > MAXSIZE / n))
184c185
<  if (pose - posi >= (size_t)INT_MAX) /* arithmetic overflow? */
>  if (l_unlikely(pose - posi >= (size_t)INT_MAX)) /* arithmetic overflow? */
238c239
<  if (lua_dump(L, writer, &state, strip) != 0)
>  if (l_unlikely(lua_dump(L, writer, &state, strip) != 0))
278c279,280
<  if (lua_type(L, 2) == LUA_TSTRING || !luaL_getmetafield(L, 2, mtname))
>  if (l_unlikely(lua_type(L, 2) == LUA_TSTRING ||
>  !luaL_getmetafield(L, 2, mtname)))
386c388,389
<  if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)
>  if (l_unlikely(l < 0 || l >= ms->level ||
>  ms->capture[l].len == CAP_UNFINISHED))
403c406
<  if (p == ms->p_end)
>  if (l_unlikely(p == ms->p_end))
410c413
<  if (p == ms->p_end)
>  if (l_unlikely(p == ms->p_end))
485c488
<  if (p >= ms->p_end - 1)
>  if (l_unlikely(p >= ms->p_end - 1))
568c571
<  if (ms->matchdepth-- == 0)
>  if (l_unlikely(ms->matchdepth-- == 0))
602c605
<  if (*p != '[')
>  if (l_unlikely(*p != '['))
702c705
<  if (i != 0)
>  if (l_unlikely(i != 0))
710c713
<  if (capl == CAP_UNFINISHED)
>  if (l_unlikely(capl == CAP_UNFINISHED))
929c932
<  else if (!lua_isstring(L, -1))
>  else if (l_unlikely(!lua_isstring(L, -1)))
1061c1064
<  else if (fmt[SIZELENMOD] != 'a')
>  else if (l_unlikely(fmt[SIZELENMOD] != 'a'))
1362,1371d1364
< ** Union for serializing floats
< */
< typedef union Ftypes {
<  float f;
<  double d;
<  lua_Number n;
< } Ftypes;
< 
< 
< /*
1387c1380,1382
<  Kfloat,	/* floating-point numbers */
>  Kfloat,	/* single-precision floating-point numbers */
>  Knumber,	/* Lua "native" floating-point numbers */
>  Kdouble,	/* double-precision floating-point numbers */
1422c1417
<  if (sz > MAXINTSIZE || sz <= 0)
>  if (l_unlikely(sz > MAXINTSIZE || sz <= 0))
1456,1457c1451,1452
<  case 'd': *size = sizeof(double); return Kfloat;
<  case 'n': *size = sizeof(lua_Number); return Kfloat;
>  case 'n': *size = sizeof(lua_Number); return Knumber;
>  case 'd': *size = sizeof(double); return Kdouble;
1463c1458
<  if (*size == -1)
>  if (l_unlikely(*size == -1))
1502c1497
<  if ((align & (align - 1)) != 0) /* is 'align' not a power of 2? */
>  if (l_unlikely((align & (align - 1)) != 0)) /* not a power of 2? */
1583,1591c1578,1598
<  case Kfloat: { /* floating-point options */
<  Ftypes u;
<  char *buff = luaL_prepbuffsize(&b, size);
<  lua_Number n = luaL_checknumber(L, arg); /* get argument */
<  if (size == sizeof(u.f)) u.f = (float)n; /* copy it into 'u' */
<  else if (size == sizeof(u.d)) u.d = (double)n;
<  else u.n = n;
<  /* move 'u' to final result, correcting endianness if needed */
<  copywithendian(buff, (char *)&u, size, h.islittle);
>  case Kfloat: { /* C float */
>  float f = (float)luaL_checknumber(L, arg); /* get argument */
>  char *buff = luaL_prepbuffsize(&b, sizeof(f));
>  /* move 'f' to final result, correcting endianness if needed */
>  copywithendian(buff, (char *)&f, sizeof(f), h.islittle);
>  luaL_addsize(&b, size);
>  break;
>  }
>  case Knumber: { /* Lua float */
>  lua_Number f = luaL_checknumber(L, arg); /* get argument */
>  char *buff = luaL_prepbuffsize(&b, sizeof(f));
>  /* move 'f' to final result, correcting endianness if needed */
>  copywithendian(buff, (char *)&f, sizeof(f), h.islittle);
>  luaL_addsize(&b, size);
>  break;
>  }
>  case Kdouble: { /* C double */
>  double f = (double)luaL_checknumber(L, arg); /* get argument */
>  char *buff = luaL_prepbuffsize(&b, sizeof(f));
>  /* move 'f' to final result, correcting endianness if needed */
>  copywithendian(buff, (char *)&f, sizeof(f), h.islittle);
1682c1689
<  if ((unsigned char)str[islittle ? i : size - 1 - i] != mask)
>  if (l_unlikely((unsigned char)str[islittle ? i : size - 1 - i] != mask))
1717,1723c1724,1738
<  Ftypes u;
<  lua_Number num;
<  copywithendian((char *)&u, data + pos, size, h.islittle);
<  if (size == sizeof(u.f)) num = (lua_Number)u.f;
<  else if (size == sizeof(u.d)) num = (lua_Number)u.d;
<  else num = u.n;
<  lua_pushnumber(L, num);
>  float f;
>  copywithendian((char *)&f, data + pos, sizeof(f), h.islittle);
>  lua_pushnumber(L, (lua_Number)f);
>  break;
>  }
>  case Knumber: {
>  lua_Number f;
>  copywithendian((char *)&f, data + pos, sizeof(f), h.islittle);
>  lua_pushnumber(L, f);
>  break;
>  }
>  case Kdouble: {
>  double f;
>  copywithendian((char *)&f, data + pos, sizeof(f), h.islittle);
>  lua_pushnumber(L, (lua_Number)f);
src/ltable.c
70a71,74
> /*
> ** When the original hash value is good, hashing by a power of 2
> ** avoids the cost of '%'.
> */
73,77d76
< #define hashstr(t,str)		hashpow2(t, (str)->hash)
< #define hashboolean(t,p)	hashpow2(t, p)
< #define hashint(t,i)		hashpow2(t, i)
< 
< 
79,80c78,79
< ** for some types, it is better to avoid modulus by power of 2, as
< ** they tend to have many 2 factors.
> ** for other types, it is better to avoid modulo by power of 2, as
> ** they can have many 2 factors.
84a84,89
> #define hashstr(t,str)		hashpow2(t, (str)->hash)
> #define hashboolean(t,p)	hashpow2(t, p)
> 
> #define hashint(t,i)		hashpow2(t, i)
> 
> 
138,145c143,158
<  case LUA_VNUMINT:
<  return hashint(t, ivalueraw(*kvl));
<  case LUA_VNUMFLT:
<  return hashmod(t, l_hashfloat(fltvalueraw(*kvl)));
<  case LUA_VSHRSTR:
<  return hashstr(t, tsvalueraw(*kvl));
<  case LUA_VLNGSTR:
<  return hashpow2(t, luaS_hashlongstr(tsvalueraw(*kvl)));
>  case LUA_VNUMINT: {
>  lua_Integer key = ivalueraw(*kvl);
>  return hashint(t, key);
>  }
>  case LUA_VNUMFLT: {
>  lua_Number n = fltvalueraw(*kvl);
>  return hashmod(t, l_hashfloat(n));
>  }
>  case LUA_VSHRSTR: {
>  TString *ts = tsvalueraw(*kvl);
>  return hashstr(t, ts);
>  }
>  case LUA_VLNGSTR: {
>  TString *ts = tsvalueraw(*kvl);
>  return hashpow2(t, luaS_hashlongstr(ts));
>  }
150,155c163,174
<  case LUA_VLIGHTUSERDATA:
<  return hashpointer(t, pvalueraw(*kvl));
<  case LUA_VLCF:
<  return hashpointer(t, fvalueraw(*kvl));
<  default:
<  return hashpointer(t, gcvalueraw(*kvl));
>  case LUA_VLIGHTUSERDATA: {
>  void *p = pvalueraw(*kvl);
>  return hashpointer(t, p);
>  }
>  case LUA_VLCF: {
>  lua_CFunction f = fvalueraw(*kvl);
>  return hashpointer(t, f);
>  }
>  default: {
>  GCObject *o = gcvalueraw(*kvl);
>  return hashpointer(t, o);
>  }
310c329
<  if (unlikely(isabstkey(n)))
>  if (l_unlikely(isabstkey(n)))
488c507
<  setobjt2t(L, luaH_set(L, t, &k), gval(old));
>  luaH_set(L, t, &k, gval(old));
544c563
<  if (unlikely(newarray == NULL && newasize > 0)) { /* allocation failed? */
>  if (l_unlikely(newarray == NULL && newasize > 0)) { /* allocation failed? */
635c654
< TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {
> void luaH_newkey (lua_State *L, Table *t, const TValue *key, TValue *value) {
638c657
<  if (unlikely(ttisnil(key)))
>  if (l_unlikely(ttisnil(key)))
647c666
<  else if (unlikely(luai_numisnan(f)))
>  else if (l_unlikely(luai_numisnan(f)))
649a669,670
>  if (ttisnil(value))
>  return; /* do not insert nil values */
657c678,679
<  return luaH_set(L, t, key); /* insert key into grown table */
>  luaH_set(L, t, key, value); /* insert key into grown table */
>  return;
685c707
<  return gval(mp);
>  setobj2t(L, gval(mp), value);
772a795,809
> ** Finish a raw "set table" operation, where 'slot' is where the value
> ** should have been (the result of a previous "get table").
> ** Beware: when using this function you probably need to check a GC
> ** barrier and invalidate the TM cache.
> */
> void luaH_finishset (lua_State *L, Table *t, const TValue *key,
>  const TValue *slot, TValue *value) {
>  if (isabstkey(slot))
>  luaH_newkey(L, t, key, value);
>  else
>  setobj2t(L, cast(TValue *, slot), value);
> }
> 
> 
> /*
776,780c813,815
< TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {
<  const TValue *p = luaH_get(t, key);
<  if (!isabstkey(p))
<  return cast(TValue *, p);
<  else return luaH_newkey(L, t, key);
> void luaH_set (lua_State *L, Table *t, const TValue *key, TValue *value) {
>  const TValue *slot = luaH_get(t, key);
>  luaH_finishset(L, t, key, slot, value);
786,789c821
<  TValue *cell;
<  if (!isabstkey(p))
<  cell = cast(TValue *, p);
<  else {
>  if (isabstkey(p)) {
792c824
<  cell = luaH_newkey(L, t, &k);
>  luaH_newkey(L, t, &k, value);
794c826,827
<  setobj2t(L, cell, value);
>  else
>  setobj2t(L, cast(TValue *, p), value);
src/ltable.h
44,45c44,49
< LUAI_FUNC TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key);
< LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);
> LUAI_FUNC void luaH_newkey (lua_State *L, Table *t, const TValue *key,
>  TValue *value);
> LUAI_FUNC void luaH_set (lua_State *L, Table *t, const TValue *key,
>  TValue *value);
> LUAI_FUNC void luaH_finishset (lua_State *L, Table *t, const TValue *key,
>  const TValue *slot, TValue *value);
src/ltablib.c
148,149c148,149
<  if (!lua_isstring(L, -1))
<  luaL_error(L, "invalid value (%s) at index %d in table for 'concat'",
>  if (l_unlikely(!lua_isstring(L, -1)))
>  luaL_error(L, "invalid value (%s) at index %I in table for 'concat'",
199c199,200
<  if (n >= (unsigned int)INT_MAX || !lua_checkstack(L, (int)(++n)))
>  if (l_unlikely(n >= (unsigned int)INT_MAX ||
>  !lua_checkstack(L, (int)(++n))))
303c304
<  if (i == up - 1) /* a[i] < P but a[up - 1] == P ?? */
>  if (l_unlikely(i == up - 1)) /* a[i] < P but a[up - 1] == P ?? */
310c311
<  if (j < i) /* j < i but a[j] > P ?? */
>  if (l_unlikely(j < i)) /* j < i but a[j] > P ?? */
src/ltm.c
150c150
<  if (!callbinTM(L, p1, p2, res, event)) {
>  if (l_unlikely(!callbinTM(L, p1, p2, res, event))) {
169c169,170
<  if (!callbinTM(L, s2v(top - 2), s2v(top - 1), top - 2, TM_CONCAT))
>  if (l_unlikely(!callbinTM(L, s2v(top - 2), s2v(top - 1), top - 2,
>  TM_CONCAT)))
src/lua.c
39a40,59
> #if defined(LUA_USE_POSIX) /* { */
> 
> /*
> ** Use 'sigaction' when available.
> */
> static void setsignal (int sig, void (*handler)(int)) {
>  struct sigaction sa;
>  sa.sa_handler = handler;
>  sa.sa_flags = 0;
>  sigemptyset(&sa.sa_mask); /* do not mask any signal */
>  sigaction(sig, &sa, NULL);
> }
> 
> #else /* }{ */
> 
> #define setsignal signal
> 
> #endif /* } */
> 
> 
58c78
<  signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */
>  setsignal(i, SIG_DFL); /* if another SIGINT happens, terminate process */
138c158
<  signal(SIGINT, laction); /* set C-signal handler */
>  setsignal(SIGINT, laction); /* set C-signal handler */
140c160
<  signal(SIGINT, SIG_DFL); /* reset C-signal handler */
>  setsignal(SIGINT, SIG_DFL); /* reset C-signal handler */
src/lua.h
21c21
< #define LUA_VERSION_RELEASE	"2"
> #define LUA_VERSION_RELEASE	"3"
28c28
< #define LUA_COPYRIGHT	LUA_RELEASE " Copyright (C) 1994-2020 Lua.org, PUC-Rio"
> #define LUA_COPYRIGHT	LUA_RELEASE " Copyright (C) 1994-2021 Lua.org, PUC-Rio"
350c350,351
< LUA_API void (lua_toclose) (lua_State *L, int idx);
> LUA_API void (lua_toclose) (lua_State *L, int idx);
> LUA_API void (lua_closeslot) (lua_State *L, int idx);
494c495
< * Copyright (C) 1994-2020 Lua.org, PUC-Rio.
> * Copyright (C) 1994-2021 Lua.org, PUC-Rio.
src/luaconf.h
19,25c19,25
< ** Some definitions here can be changed externally, through the
< ** compiler (e.g., with '-D' options). Those are protected by
< ** '#if !defined' guards. However, several other definitions should
< ** be changed directly here, either because they affect the Lua
< ** ABI (by making the changes here, you ensure that all software
< ** connected to Lua, such as C libraries, will be compiled with the
< ** same configuration); or because they are seldom changed.
> ** Some definitions here can be changed externally, through the compiler
> ** (e.g., with '-D' options): They are commented out or protected
> ** by '#if !defined' guards. However, several other definitions
> ** should be changed directly here, either because they affect the
> ** Lua ABI (by making the changes here, you ensure that all software
> ** connected to Lua, such as C libraries, will be compiled with the same
> ** configuration); or because they are seldom changed.
84c84,86
< ** Configuration for Number types.
> ** Configuration for Number types. These options should not be
> ** set externally, because any other code connected to Lua must
> ** use the same configuration.
89,104d90
< @@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats.
< */
< /* #define LUA_32BITS */
< 
< 
< /*
< @@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for
< ** C89 ('long' and 'double'); Windows always has '__int64', so it does
< ** not need to use this case.
< */
< #if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS)
< #define LUA_C89_NUMBERS
< #endif
< 
< 
< /*
124c110,134
< #if defined(LUA_32BITS)		/* { */
> 
> /* Default configuration ('long long' and 'double', for 64-bit Lua) */
> #define LUA_INT_DEFAULT		LUA_INT_LONGLONG
> #define LUA_FLOAT_DEFAULT	LUA_FLOAT_DOUBLE
> 
> 
> /*
> @@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats.
> */
> #define LUA_32BITS	0
> 
> 
> /*
> @@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for
> ** C89 ('long' and 'double'); Windows always has '__int64', so it does
> ** not need to use this case.
> */
> #if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS)
> #define LUA_C89_NUMBERS		1
> #else
> #define LUA_C89_NUMBERS		0
> #endif
> 
> 
> #if LUA_32BITS		/* { */
135c145
< #elif defined(LUA_C89_NUMBERS)	/* }{ */
> #elif LUA_C89_NUMBERS	/* }{ */
142c152,153
< #endif				/* } */
> #else		/* }{ */
> /* use defaults */
143a155,156
> #define LUA_INT_TYPE	LUA_INT_DEFAULT
> #define LUA_FLOAT_TYPE	LUA_FLOAT_DEFAULT
145,150c158
< /*
< ** default configuration for 64-bit Lua ('long long' and 'double')
< */
< #if !defined(LUA_INT_TYPE)
< #define LUA_INT_TYPE	LUA_INT_LONGLONG
< #endif
> #endif				/* } */
152,154d159
< #if !defined(LUA_FLOAT_TYPE)
< #define LUA_FLOAT_TYPE	LUA_FLOAT_DOUBLE
< #endif
376c381
< ** Configuration for Numbers.
> ** Configuration for Numbers (low-level part).
383d387
< @@ LUA_NUMBER is the floating-point type used by Lua.
476,477d479
< @@ LUA_INTEGER is the integer type used by Lua.
< **
479d480
< **
661a663,690
> 
> /*
> ** macros to improve jump prediction, used mostly for error handling
> ** and debug facilities. (Some macros in the Lua API use these macros.
> ** Define LUA_NOBUILTIN if you do not want '__builtin_expect' in your
> ** code.)
> */
> #if !defined(luai_likely)
> 
> #if defined(__GNUC__) && !defined(LUA_NOBUILTIN)
> #define luai_likely(x)		(__builtin_expect(((x) != 0), 1))
> #define luai_unlikely(x)	(__builtin_expect(((x) != 0), 0))
> #else
> #define luai_likely(x)		(x)
> #define luai_unlikely(x)	(x)
> #endif
> 
> #endif
> 
> 
> #if defined(LUA_CORE) || defined(LUA_LIB)
> /* shorter names for Lua's own use */
> #define l_likely(x)	luai_likely(x)
> #define l_unlikely(x)	luai_unlikely(x)
> #endif
> 
> 
> 
src/lualib.h
52,57d51
< 
< #if !defined(lua_assert)
< #define lua_assert(x)	((void)0)
< #endif
< 
< 
src/lvm.c
238c238
<  if (unlikely(!tonumber(plimit, &limit)))
>  if (l_unlikely(!tonumber(plimit, &limit)))
240c240
<  if (unlikely(!tonumber(pstep, &step)))
>  if (l_unlikely(!tonumber(pstep, &step)))
242c242
<  if (unlikely(!tonumber(pinit, &init)))
>  if (l_unlikely(!tonumber(pinit, &init)))
295c295
<  if (unlikely(notm(tm)))
>  if (l_unlikely(notm(tm)))
340,343c340
<  if (isabstkey(slot)) /* no previous entry? */
<  slot = luaH_newkey(L, h, key); /* create one */
<  /* no metamethod and (now) there is an entry with given key */
<  setobj2t(L, cast(TValue *, slot), val); /* set its new value */
>  luaH_finishset(L, h, key, slot, val); /* set new value */
352c349
<  if (unlikely(notm(tm)))
>  if (l_unlikely(notm(tm)))
574,575c571,577
<  lua_Integer i1, i2; /* compare them as integers */
<  return (tointegerns(t1, &i1) && tointegerns(t2, &i2) && i1 == i2);
>  /* One of them is an integer. If the other does not have an
>  integer value, they cannot be equal; otherwise, compare their
>  integer values. */
>  lua_Integer i1, i2;
>  return (luaV_tointegerns(t1, &i1, F2Ieq) &&
>  luaV_tointegerns(t2, &i2, F2Ieq) &&
>  i1 == i2);
657c659
<  if (unlikely(l >= (MAX_SIZE/sizeof(char)) - tl))
>  if (l_unlikely(l >= (MAX_SIZE/sizeof(char)) - tl))
701c703
<  if (unlikely(notm(tm))) /* no metamethod? */
>  if (l_unlikely(notm(tm))) /* no metamethod? */
717c719
<  if (unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */
>  if (l_unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */
737c739
<  if (unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */
>  if (l_unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */
847a850,853
>  case OP_CLOSE: case OP_RETURN: { /* yielded closing variables */
>  ci->u.l.savedpc--; /* repeat instruction to close other vars. */
>  break;
>  }
923c929
<  TValue *v2 = KC(i); \
>  TValue *v2 = KC(i); lua_assert(ttisnumber(v2)); \
952c958
<  TValue *v2 = KC(i); \
>  TValue *v2 = KC(i); lua_assert(ttisnumber(v2)); \
1051c1057,1058
< #define updatestack(ci) { if (trap) { updatebase(ci); ra = RA(i); } }
> #define updatestack(ci) \
> 	{ if (l_unlikely(trap)) { updatebase(ci); ra = RA(i); } }
1109c1116
<  if (trap) { /* stack reallocation or hooks? */ \
>  if (l_unlikely(trap)) { /* stack reallocation or hooks? */ \
1137c1144
<  if (trap) {
>  if (l_unlikely(trap)) {
1151a1159,1160
> // low-level line tracing for debugging Lua
> // printf("line: %d\n", luaG_getfuncline(cl->p, pcRel(pc, cl->p)));
1530c1539
<  Protect(luaF_close(L, ra, LUA_OK));
>  Protect(luaF_close(L, ra, LUA_OK, 1));
1635,1638c1644,1645
<  /* close upvalues from current call; the compiler ensures
<  that there are no to-be-closed variables here, so this
<  call cannot change the stack */
<  luaF_close(L, base, NOCLOSINGMETH);
>  luaF_closeupval(L, base); /* close upvalues from current call */
>  lua_assert(L->tbclist < base); /* no pending tbc variables */
1668c1675
<  luaF_close(L, base, LUA_OK);
>  luaF_close(L, base, CLOSEKTOP, 1);
1680c1687
<  if (L->hookmask) {
>  if (l_unlikely(L->hookmask)) {
1687c1694
<  int nres = ci->nresults;
>  int nres;
1690c1697
<  while (nres-- > 0)
>  for (nres = ci->nresults; l_unlikely(nres > 0); nres--)
1696c1703
<  if (L->hookmask) {
>  if (l_unlikely(L->hookmask)) {
1710,1711c1717,1718
<  while (--nres > 0) /* complete missing results */
<  setnilvalue(s2v(L->top++));
>  for (; l_unlikely(nres > 1); nres--)
>  setnilvalue(s2v(L->top++)); /* complete missing results */
1814c1821
<  if (trap) {
>  if (l_unlikely(trap)) { /* previous "Protect" updated trap */
src/lvm.h
63c63,64
<  (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger(o,i,LUA_FLOORN2I))
>  (l_likely(ttisinteger(o)) ? (*(i) = ivalue(o), 1) \
>  : luaV_tointeger(o,i,LUA_FLOORN2I))
68c69,70
<  (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointegerns(o,i,LUA_FLOORN2I))
>  (l_likely(ttisinteger(o)) ? (*(i) = ivalue(o), 1) \
>  : luaV_tointegerns(o,i,LUA_FLOORN2I))

Last update: Mon Mar 15 13:43:57 UTC 2021

AltStyle によって変換されたページ (->オリジナル) /