commit c63e5d212bc5dec1b1c749e3f07b42cd83081826
parent dee6433a89b088a1f8da9531a92a2a2693e5dac7
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Fri, 5 Feb 2021 17:50:58 -0300
New macro 'completestate'
Diffstat:
4 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/lapi.c b/lapi.c
@@ -39,7 +39,7 @@ const char lua_ident[] =
/*
-** Test for a valid index.
+** Test for a valid index (one that is not the 'nilvalue').
** '!ttisnil(o)' implies 'o != &G(L)->nilvalue', so it is not needed.
** However, it covers the most common cases in a faster way.
*/
diff --git a/lmem.c b/lmem.c
@@ -29,7 +29,7 @@
** a full GC cycle at every allocation.)
*/
static void *firsttry (global_State *g, void *block, size_t os, size_t ns) {
- if (ttisnil(&g->nilvalue) && ns > os)
+ if (completestate(g) && ns > os)
return NULL; /* fail */
else /* normal allocation */
return (*g->frealloc)(g->ud, block, os, ns);
@@ -146,7 +146,7 @@ void luaM_free_ (lua_State *L, void *block, size_t osize) {
static void *tryagain (lua_State *L, void *block,
size_t osize, size_t nsize) {
global_State *g = G(L);
- if (ttisnil(&g->nilvalue)) { /* is state fully build? */
+ if (completestate(g)) { /* is state fully build? */
luaC_fullgc(L, 1); /* try to free some memory... */
return (*g->frealloc)(g->ud, block, osize, nsize); /* try again */
}
diff --git a/lstate.c b/lstate.c
@@ -226,8 +226,6 @@ static void init_registry (lua_State *L, global_State *g) {
/*
** open parts of the state that may cause memory-allocation errors.
-** ('g->nilvalue' being a nil value flags that the state was completely
-** build.)
*/
static void f_luaopen (lua_State *L, void *ud) {
global_State *g = G(L);
@@ -238,7 +236,7 @@ static void f_luaopen (lua_State *L, void *ud) {
luaT_init(L);
luaX_init(L);
g->gcrunning = 1; /* allow gc */
- setnilvalue(&g->nilvalue);
+ setnilvalue(&g->nilvalue); /* now state is complete */
luai_userstateopen(L);
}
@@ -272,7 +270,7 @@ static void close_state (lua_State *L) {
global_State *g = G(L);
luaD_closeprotected(L, 0, LUA_OK); /* close all upvalues */
luaC_freeallobjects(L); /* collect all objects */
- if (ttisnil(&g->nilvalue)) /* closing a fully built state? */
+ if (completestate(g)) /* closing a fully built state? */
luai_userstateclose(L);
luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size);
freestack(L);
diff --git a/lstate.h b/lstate.h
@@ -324,6 +324,12 @@ struct lua_State {
#define G(L) (L->l_G)
+/*
+** 'g->nilvalue' being a nil value flags that the state was completely
+** build.
+*/
+#define completestate(g) ttisnil(&g->nilvalue)
+
/*
** Union of all collectable objects (only for conversions)