New macro 'completestate'
diff --git a/lapi.c b/lapi.c
index 27bf23d..41e6b86 100644
--- a/lapi.c
+++ b/lapi.c
@@ -39,7 +39,7 @@
/*
-** 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 43739bf..4822a0e 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 @@
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 c708a16..52336f4 100644
--- a/lstate.c
+++ b/lstate.c
@@ -226,8 +226,6 @@
/*
** 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 @@
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 @@
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 f3d791a..5ef5535 100644
--- a/lstate.h
+++ b/lstate.h
@@ -324,6 +324,12 @@
#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)