diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-12-17 11:23:22 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-12-17 11:23:22 -0300 |
| commit | 1c40ff9faafed620aa0458b397bcbfbe19e0f663 (patch) | |
| tree | edfb96022feb99244a7a6c4c9d28525e141b783e /llex.c | |
| parent | 7538f3886dfa091d661c56e48ebb1578ced8e467 (diff) | |
| download | lua-1c40ff9faafed620aa0458b397bcbfbe19e0f663.tar.gz lua-1c40ff9faafed620aa0458b397bcbfbe19e0f663.tar.bz2 lua-1c40ff9faafed620aa0458b397bcbfbe19e0f663.zip | |
Scanner and parser use different tables for constants
Moreover, each function being parsed has its own table.
The code is cleaner when each table is used for one specific purpose:
The scanner uses its table to anchor and unify strings, mapping strings
to themselves; the parser uses it to reuse constants in the code,
mapping constants to their indices in the constant table. A different
table for each task avoids false collisions.
Diffstat (limited to 'llex.c')
| -rw-r--r-- | llex.c | 15 |
1 files changed, 6 insertions, 9 deletions
| @@ -130,18 +130,15 @@ l_noret luaX_syntaxerror (LexState *ls, const char *msg) { | |||
| 130 | ** Creates a new string and anchors it in scanner's table so that it | 130 | ** Creates a new string and anchors it in scanner's table so that it |
| 131 | ** will not be collected until the end of the compilation; by that time | 131 | ** will not be collected until the end of the compilation; by that time |
| 132 | ** it should be anchored somewhere. It also internalizes long strings, | 132 | ** it should be anchored somewhere. It also internalizes long strings, |
| 133 | ** ensuring there is only one copy of each unique string. The table | 133 | ** ensuring there is only one copy of each unique string. |
| 134 | ** here is used as a set: the string enters as the key, while its value | ||
| 135 | ** is irrelevant. We use the string itself as the value only because it | ||
| 136 | ** is a TValue readily available. Later, the code generation can change | ||
| 137 | ** this value. | ||
| 138 | */ | 134 | */ |
| 139 | TString *luaX_newstring (LexState *ls, const char *str, size_t l) { | 135 | TString *luaX_newstring (LexState *ls, const char *str, size_t l) { |
| 140 | lua_State *L = ls->L; | 136 | lua_State *L = ls->L; |
| 141 | TString *ts = luaS_newlstr(L, str, l); /* create new string */ | 137 | TString *ts = luaS_newlstr(L, str, l); /* create new string */ |
| 142 | TString *oldts = luaH_getstrkey(ls->h, ts); | 138 | TValue oldts; |
| 143 | if (oldts != NULL) /* string already present? */ | 139 | int tag = luaH_getstr(ls->h, ts, &oldts); |
| 144 | return oldts; /* use it */ | 140 | if (!tagisempty(tag)) /* string already present? */ |
| 141 | return tsvalue(&oldts); /* use stored value */ | ||
| 145 | else { /* create a new entry */ | 142 | else { /* create a new entry */ |
| 146 | TValue *stv = s2v(L->top.p++); /* reserve stack space for string */ | 143 | TValue *stv = s2v(L->top.p++); /* reserve stack space for string */ |
| 147 | setsvalue(L, stv, ts); /* temporarily anchor the string */ | 144 | setsvalue(L, stv, ts); /* temporarily anchor the string */ |
| @@ -149,8 +146,8 @@ TString *luaX_newstring (LexState *ls, const char *str, size_t l) { | |||
| 149 | /* table is not a metatable, so it does not need to invalidate cache */ | 146 | /* table is not a metatable, so it does not need to invalidate cache */ |
| 150 | luaC_checkGC(L); | 147 | luaC_checkGC(L); |
| 151 | L->top.p--; /* remove string from stack */ | 148 | L->top.p--; /* remove string from stack */ |
| 149 | return ts; | ||
| 152 | } | 150 | } |
| 153 | return ts; | ||
| 154 | } | 151 | } |
| 155 | 152 | ||
| 156 | 153 | ||
