diff options
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 | } |