aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2025-05-16 14:51:07 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2025-05-16 14:51:07 -0300
commitded2ad2d86f44424c6b6e12bf1b75836cfa9e502 (patch)
tree825ca888400928a3912687a8c4af793ad6b1f7b5
parent3fb7a77731e6140674a6b13b73979256bfb95ce3 (diff)
downloadlua-ded2ad2d86f44424c6b6e12bf1b75836cfa9e502.tar.gz
lua-ded2ad2d86f44424c6b6e12bf1b75836cfa9e502.tar.bz2
lua-ded2ad2d86f44424c6b6e12bf1b75836cfa9e502.zip
Slightly faster way to check for "global"
-rw-r--r--llex.c20
-rw-r--r--llex.h1
-rw-r--r--lparser.c4
3 files changed, 13 insertions, 12 deletions
diff --git a/llex.c b/llex.c
index 54e7f343..f8bb3ea4 100644
--- a/llex.c
+++ b/llex.c
@@ -40,16 +40,11 @@
40 40
41#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') 41#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r')
42 42
43#if defined(LUA_COMPAT_GLOBAL)
44#define GLOBALLEX ".g" /* anything not recognizable as a name */
45#else
46#define GLOBALLEX "global"
47#endif
48 43
49/* ORDER RESERVED */ 44/* ORDER RESERVED */
50static const char *const luaX_tokens [] = { 45static const char *const luaX_tokens [] = {
51 "and", "break", "do", "else", "elseif", 46 "and", "break", "do", "else", "elseif",
52 "end", "false", "for", "function", GLOBALLEX, "goto", "if", 47 "end", "false", "for", "function", "global", "goto", "if",
53 "in", "local", "nil", "not", "or", "repeat", 48 "in", "local", "nil", "not", "or", "repeat",
54 "return", "then", "true", "until", "while", 49 "return", "then", "true", "until", "while",
55 "//", "..", "...", "==", ">=", "<=", "~=", 50 "//", "..", "...", "==", ">=", "<=", "~=",
@@ -189,10 +184,15 @@ void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source,
189 ls->linenumber = 1; 184 ls->linenumber = 1;
190 ls->lastline = 1; 185 ls->lastline = 1;
191 ls->source = source; 186 ls->source = source;
192 ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */ 187 /* all three strings here ("_ENV", "break", "global") were fixed,
193 ls->brkn = luaS_newliteral(L, "break"); /* get "break" name */ 188 so they cannot be collected */
194 /* "break" cannot be collected, as it is a reserved word" */ 189 ls->envn = luaS_newliteral(L, LUA_ENV); /* get env string */
195 lua_assert(isreserved(ls->brkn)); 190 ls->brkn = luaS_newliteral(L, "break"); /* get "break" string */
191#if defined(LUA_COMPAT_GLOBAL)
192 /* compatibility mode: "global" is not a reserved word */
193 ls->glbn = luaS_newliteral(L, "global"); /* get "global" string */
194 ls->glbn->extra = 0; /* mark it as not reserved */
195#endif
196 luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ 196 luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */
197} 197}
198 198
diff --git a/llex.h b/llex.h
index 0dba9d60..37016e8a 100644
--- a/llex.h
+++ b/llex.h
@@ -76,6 +76,7 @@ typedef struct LexState {
76 TString *source; /* current source name */ 76 TString *source; /* current source name */
77 TString *envn; /* environment variable name */ 77 TString *envn; /* environment variable name */
78 TString *brkn; /* "break" name (used as a label) */ 78 TString *brkn; /* "break" name (used as a label) */
79 TString *glbn; /* "global" name (when not a reserved word) */
79} LexState; 80} LexState;
80 81
81 82
diff --git a/lparser.c b/lparser.c
index 29022bfd..384ef690 100644
--- a/lparser.c
+++ b/lparser.c
@@ -2001,10 +2001,10 @@ static void statement (LexState *ls) {
2001 case TK_NAME: { 2001 case TK_NAME: {
2002 /* compatibility code to parse global keyword when "global" 2002 /* compatibility code to parse global keyword when "global"
2003 is not reserved */ 2003 is not reserved */
2004 if (strcmp(getstr(ls->t.seminfo.ts), "global") == 0) { 2004 if (ls->t.seminfo.ts == ls->glbn) { /* current = "global"? */
2005 int lk = luaX_lookahead(ls); 2005 int lk = luaX_lookahead(ls);
2006 if (lk == TK_NAME || lk == '*' || lk == TK_FUNCTION) { 2006 if (lk == TK_NAME || lk == '*' || lk == TK_FUNCTION) {
2007 /* 'global <name>' or 'global *' or 'global function' */ 2007 /* 'global name' or 'global *' or 'global function' */
2008 globalstatfunc(ls, line); 2008 globalstatfunc(ls, line);
2009 break; 2009 break;
2010 } 2010 }