From 6d998055c80a0fe8d4698ba02becb1813203eee9 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 27 Jul 2017 10:50:16 -0300 Subject: no more reference 'memerrmsg' + new reference to "n" (both can be retrieved by 'luaS_newliteral' without creating anything, because they are fixed, but "n" deserves fast access while 'memerrmsg' does not) --- ldo.c | 5 +++-- lstate.h | 4 ++-- lstring.c | 16 ++++++++-------- lstring.h | 9 ++++++++- ltm.c | 6 +++--- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/ldo.c b/ldo.c index 5917f78f..0c0bb0bc 100644 --- a/ldo.c +++ b/ldo.c @@ -1,5 +1,5 @@ /* -** $Id: ldo.c,v 2.160 2017/05/23 12:50:11 roberto Exp roberto $ +** $Id: ldo.c,v 2.161 2017/06/29 15:06:44 roberto Exp roberto $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */ @@ -91,7 +91,8 @@ struct lua_longjmp { static void seterrorobj (lua_State *L, int errcode, StkId oldtop) { switch (errcode) { case LUA_ERRMEM: { /* memory error? */ - setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */ + TString *memerrmsg = luaS_newliteral(L, MEMERRMSG); + setsvalue2s(L, oldtop, memerrmsg); /* reuse preregistered msg. */ break; } case LUA_ERRERR: { diff --git a/lstate.h b/lstate.h index 12dddf3b..5ccc4025 100644 --- a/lstate.h +++ b/lstate.h @@ -1,5 +1,5 @@ /* -** $Id: lstate.h,v 2.142 2017/05/26 19:14:29 roberto Exp roberto $ +** $Id: lstate.h,v 2.143 2017/06/12 14:21:44 roberto Exp roberto $ ** Global State ** See Copyright Notice in lua.h */ @@ -175,7 +175,7 @@ typedef struct global_State { lua_CFunction panic; /* to be called in unprotected errors */ struct lua_State *mainthread; const lua_Number *version; /* pointer to version number */ - TString *memerrmsg; /* memory-error message */ + TString *nfield; /* string "n" (key in vararg tables) */ TString *tmname[TM_N]; /* array with tag-method names */ struct Table *mt[LUA_NUMTAGS]; /* metatables for basic types */ TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */ diff --git a/lstring.c b/lstring.c index fc9eb220..a851fd74 100644 --- a/lstring.c +++ b/lstring.c @@ -1,5 +1,5 @@ /* -** $Id: lstring.c,v 2.55 2015/11/03 15:36:01 roberto Exp roberto $ +** $Id: lstring.c,v 2.56 2015/11/23 11:32:51 roberto Exp roberto $ ** String table (keeps all strings handled by Lua) ** See Copyright Notice in lua.h */ @@ -22,9 +22,6 @@ #include "lstring.h" -#define MEMERRMSG "not enough memory" - - /* ** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to ** compute its hash @@ -105,7 +102,7 @@ void luaS_clearcache (global_State *g) { for (i = 0; i < STRCACHE_N; i++) for (j = 0; j < STRCACHE_M; j++) { if (iswhite(g->strcache[i][j])) /* will entry be collected? */ - g->strcache[i][j] = g->memerrmsg; /* replace it with something fixed */ + g->strcache[i][j] = g->nfield; /* replace it with something fixed */ } } @@ -116,13 +113,16 @@ void luaS_clearcache (global_State *g) { void luaS_init (lua_State *L) { global_State *g = G(L); int i, j; + TString *memerrmsg; luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ /* pre-create memory-error message */ - g->memerrmsg = luaS_newliteral(L, MEMERRMSG); - luaC_fix(L, obj2gco(g->memerrmsg)); /* it should never be collected */ + memerrmsg = luaS_newliteral(L, MEMERRMSG); + luaC_fix(L, obj2gco(memerrmsg)); /* it should never be collected */ + g->nfield = luaS_newliteral(L, "n"); /* pre-create "n" field name */ + luaC_fix(L, obj2gco(g->nfield)); /* it also should never be collected */ for (i = 0; i < STRCACHE_N; i++) /* fill cache with valid strings */ for (j = 0; j < STRCACHE_M; j++) - g->strcache[i][j] = g->memerrmsg; + g->strcache[i][j] = g->nfield; } diff --git a/lstring.h b/lstring.h index 6351003a..416d9519 100644 --- a/lstring.h +++ b/lstring.h @@ -1,5 +1,5 @@ /* -** $Id: lstring.h,v 1.60 2015/09/08 15:41:05 roberto Exp roberto $ +** $Id: lstring.h,v 1.61 2015/11/03 15:36:01 roberto Exp roberto $ ** String table (keep all strings handled by Lua) ** See Copyright Notice in lua.h */ @@ -12,6 +12,13 @@ #include "lstate.h" +/* +** Memory-allocation error message must be preallocated (it cannot +** be created after memory is exausted) +*/ +#define MEMERRMSG "not enough memory" + + #define sizelstring(l) (sizeof(union UTString) + ((l) + 1) * sizeof(char)) #define sizeludata(l) (sizeof(union UUdata) + (l)) diff --git a/ltm.c b/ltm.c index 3629dc69..cbc4cc5e 100644 --- a/ltm.c +++ b/ltm.c @@ -1,5 +1,5 @@ /* -** $Id: ltm.c,v 2.41 2017/05/13 12:57:20 roberto Exp roberto $ +** $Id: ltm.c,v 2.42 2017/06/29 15:06:44 roberto Exp roberto $ ** Tag methods ** See Copyright Notice in lua.h */ @@ -188,7 +188,7 @@ void luaT_adjustvarargs (lua_State *L, Proto *p, int actual) { luaH_resize(L, vtab, actual, 1); for (i = 0; i < actual; i++) /* put extra arguments into vararg table */ setobj2n(L, &vtab->array[i], s2v(L->top - actual + i - 1)); - setsvalue(L, &nname, luaS_newliteral(L, "n")); /* get field 'n' */ + setsvalue(L, &nname, G(L)->nfield); /* get field 'n' */ setivalue(luaH_set(L, vtab, &nname), actual); /* store counter there */ L->top -= actual; /* remove extra elements from the stack */ sethvalue2s(L, L->top - 1, vtab); /* move table to new top */ @@ -202,7 +202,7 @@ void luaT_getvarargs (lua_State *L, TValue *t, StkId where, int wanted) { int i; Table *h = hvalue(t); if (wanted < 0) { /* get all? */ - const TValue *ns = luaH_getstr(h, luaS_newliteral(L, "n")); + const TValue *ns = luaH_getstr(h, G(L)->nfield); int n = (ttisinteger(ns)) ? ivalue(ns) : 0; wanted = n; checkstackp(L, n, where); -- cgit v1.2.3-55-g6feb