aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2025-05-15 12:43:37 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2025-05-15 12:43:37 -0300
commit3fb7a77731e6140674a6b13b73979256bfb95ce3 (patch)
treee877e7bb99ac7d2d6c7bf6a9c7c94948f0ddaf65
parentfded0b4a844990b1a6d0cda1aba25df33eb5f46f (diff)
downloadlua-3fb7a77731e6140674a6b13b73979256bfb95ce3.tar.gz
lua-3fb7a77731e6140674a6b13b73979256bfb95ce3.tar.bz2
lua-3fb7a77731e6140674a6b13b73979256bfb95ce3.zip
Internalized string "break" kept by the parser
The parser uses "break" as fake label to compile "break" as "goto break". To avoid producing this string at each use, it keeps it available in its state.
-rw-r--r--llex.c3
-rw-r--r--llex.h1
-rw-r--r--lparser.c6
3 files changed, 7 insertions, 3 deletions
diff --git a/llex.c b/llex.c
index 59d927d4..54e7f343 100644
--- a/llex.c
+++ b/llex.c
@@ -190,6 +190,9 @@ void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source,
190 ls->lastline = 1; 190 ls->lastline = 1;
191 ls->source = source; 191 ls->source = source;
192 ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */ 192 ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */
193 ls->brkn = luaS_newliteral(L, "break"); /* get "break" name */
194 /* "break" cannot be collected, as it is a reserved word" */
195 lua_assert(isreserved(ls->brkn));
193 luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ 196 luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */
194} 197}
195 198
diff --git a/llex.h b/llex.h
index 078e4d31..0dba9d60 100644
--- a/llex.h
+++ b/llex.h
@@ -75,6 +75,7 @@ typedef struct LexState {
75 struct Dyndata *dyd; /* dynamic structures used by the parser */ 75 struct Dyndata *dyd; /* dynamic structures used by the parser */
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} LexState; 79} LexState;
79 80
80 81
diff --git a/lparser.c b/lparser.c
index 27c8a927..29022bfd 100644
--- a/lparser.c
+++ b/lparser.c
@@ -707,7 +707,7 @@ static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) {
707*/ 707*/
708static l_noret undefgoto (LexState *ls, Labeldesc *gt) { 708static l_noret undefgoto (LexState *ls, Labeldesc *gt) {
709 /* breaks are checked when created, cannot be undefined */ 709 /* breaks are checked when created, cannot be undefined */
710 lua_assert(!eqstr(gt->name, luaS_newliteral(ls->L, "break"))); 710 lua_assert(!eqstr(gt->name, ls->brkn));
711 luaK_semerror(ls, "no visible label '%s' for <goto> at line %d", 711 luaK_semerror(ls, "no visible label '%s' for <goto> at line %d",
712 getstr(gt->name), gt->line); 712 getstr(gt->name), gt->line);
713} 713}
@@ -723,7 +723,7 @@ static void leaveblock (FuncState *fs) {
723 removevars(fs, bl->nactvar); /* remove block locals */ 723 removevars(fs, bl->nactvar); /* remove block locals */
724 lua_assert(bl->nactvar == fs->nactvar); /* back to level on entry */ 724 lua_assert(bl->nactvar == fs->nactvar); /* back to level on entry */
725 if (bl->isloop == 2) /* has to fix pending breaks? */ 725 if (bl->isloop == 2) /* has to fix pending breaks? */
726 createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0); 726 createlabel(ls, ls->brkn, 0, 0);
727 solvegotos(fs, bl); 727 solvegotos(fs, bl);
728 if (bl->previous == NULL) { /* was it the last block? */ 728 if (bl->previous == NULL) { /* was it the last block? */
729 if (bl->firstgoto < ls->dyd->gt.n) /* still pending gotos? */ 729 if (bl->firstgoto < ls->dyd->gt.n) /* still pending gotos? */
@@ -1497,7 +1497,7 @@ static void breakstat (LexState *ls, int line) {
1497 ok: 1497 ok:
1498 bl->isloop = 2; /* signal that block has pending breaks */ 1498 bl->isloop = 2; /* signal that block has pending breaks */
1499 luaX_next(ls); /* skip break */ 1499 luaX_next(ls); /* skip break */
1500 newgotoentry(ls, luaS_newliteral(ls->L, "break"), line); 1500 newgotoentry(ls, ls->brkn, line);
1501} 1501}
1502 1502
1503 1503