diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-08-27 12:16:28 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-08-27 12:16:28 -0300 |
| commit | c3d72096c4841ebc04a0615917d71f22aaa5e5ff (patch) | |
| tree | 45b143ed4284ba9b30fdae965aef0a047aab6deb /lcode.c | |
| parent | 7afc74ff07907294a2162600023a9c61a64cdbd5 (diff) | |
| download | lua-c3d72096c4841ebc04a0615917d71f22aaa5e5ff.tar.gz lua-c3d72096c4841ebc04a0615917d71f22aaa5e5ff.tar.bz2 lua-c3d72096c4841ebc04a0615917d71f22aaa5e5ff.zip | |
use a table to find (and reuse) constants when parsing
Diffstat (limited to 'lcode.c')
| -rw-r--r-- | lcode.c | 44 |
1 files changed, 20 insertions, 24 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lcode.c,v 1.77 2001/07/17 14:30:44 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.78 2001/07/24 17:19:07 roberto Exp roberto $ |
| 3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -18,6 +18,7 @@ | |||
| 18 | #include "lobject.h" | 18 | #include "lobject.h" |
| 19 | #include "lopcodes.h" | 19 | #include "lopcodes.h" |
| 20 | #include "lparser.h" | 20 | #include "lparser.h" |
| 21 | #include "ltable.h" | ||
| 21 | 22 | ||
| 22 | 23 | ||
| 23 | #define hasjumps(e) ((e)->t != (e)->f) | 24 | #define hasjumps(e) ((e)->t != (e)->f) |
| @@ -222,38 +223,33 @@ static void freeexp (FuncState *fs, expdesc *e) { | |||
| 222 | 223 | ||
| 223 | 224 | ||
| 224 | static int addk (FuncState *fs, TObject *k) { | 225 | static int addk (FuncState *fs, TObject *k) { |
| 225 | Proto *f = fs->f; | 226 | const TObject *index = luaH_get(fs->h, k); |
| 226 | luaM_growvector(fs->L, f->k, fs->nk, f->sizek, TObject, | 227 | if (ttype(index) == LUA_TNUMBER) { |
| 227 | MAXARG_Bc, l_s("constant table overflow")); | 228 | lua_assert(luaO_equalObj(&fs->f->k[(int)nvalue(index)], k)); |
| 228 | setobj(&f->k[fs->nk], k); | 229 | return (int)nvalue(index); |
| 229 | return fs->nk++; | 230 | } |
| 231 | else { /* constant not found; create a new entry */ | ||
| 232 | TObject o; | ||
| 233 | Proto *f = fs->f; | ||
| 234 | luaM_growvector(fs->L, f->k, fs->nk, f->sizek, TObject, | ||
| 235 | MAXARG_Bc, l_s("constant table overflow")); | ||
| 236 | setobj(&f->k[fs->nk], k); | ||
| 237 | setnvalue(&o, fs->nk); | ||
| 238 | setobj(luaH_set(fs->L, fs->h, k), &o); | ||
| 239 | return fs->nk++; | ||
| 240 | } | ||
| 230 | } | 241 | } |
| 231 | 242 | ||
| 232 | 243 | ||
| 233 | int luaK_stringk (FuncState *fs, TString *s) { | 244 | int luaK_stringk (FuncState *fs, TString *s) { |
| 234 | Proto *f = fs->f; | 245 | TObject o; |
| 235 | int c = s->tsv.constindex; | 246 | setsvalue(&o, s); |
| 236 | if (c >= fs->nk || ttype(&f->k[c]) != LUA_TSTRING || tsvalue(&f->k[c]) != s) { | 247 | return addk(fs, &o); |
| 237 | TObject o; | ||
| 238 | setsvalue(&o, s); | ||
| 239 | c = addk(fs, &o); | ||
| 240 | s->tsv.constindex = (unsigned short)c; /* hint for next time */ | ||
| 241 | } | ||
| 242 | return c; | ||
| 243 | } | 248 | } |
| 244 | 249 | ||
| 245 | 250 | ||
| 246 | static int number_constant (FuncState *fs, lua_Number r) { | 251 | static int number_constant (FuncState *fs, lua_Number r) { |
| 247 | /* check whether `r' has appeared within the last LOOKBACKNUMS entries */ | ||
| 248 | TObject o; | 252 | TObject o; |
| 249 | Proto *f = fs->f; | ||
| 250 | int c = fs->nk; | ||
| 251 | int lim = c < LOOKBACKNUMS ? 0 : c-LOOKBACKNUMS; | ||
| 252 | while (--c >= lim) { | ||
| 253 | if (ttype(&f->k[c]) == LUA_TNUMBER && nvalue(&f->k[c]) == r) | ||
| 254 | return c; | ||
| 255 | } | ||
| 256 | /* not found; create a new entry */ | ||
| 257 | setnvalue(&o, r); | 253 | setnvalue(&o, r); |
| 258 | return addk(fs, &o); | 254 | return addk(fs, &o); |
| 259 | } | 255 | } |
