From c63e5d212bc5dec1b1c749e3f07b42cd83081826 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 5 Feb 2021 17:51:25 -0300 Subject: New macro 'completestate' --- lapi.c | 2 +- lmem.c | 4 ++-- lstate.c | 6 ++---- lstate.h | 6 ++++++ 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lapi.c b/lapi.c index 27bf23da..41e6b86d 100644 --- 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 index 43739bff..4822a0ea 100644 --- 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 index c708a162..52336f44 100644 --- 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 index f3d791ab..5ef55355 100644 --- 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) -- cgit v1.2.3-55-g6feb