diff options
Diffstat (limited to 'src/lj_parse.c')
-rw-r--r-- | src/lj_parse.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/lj_parse.c b/src/lj_parse.c index a3291553..30a423bd 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c | |||
@@ -974,19 +974,21 @@ static void checkname(LexState *ls, ExpDesc *e) | |||
974 | 974 | ||
975 | /* -- Variable handling --------------------------------------------------- */ | 975 | /* -- Variable handling --------------------------------------------------- */ |
976 | 976 | ||
977 | #define getlocvar(fs, i) ((fs)->pt->varinfo[(fs)->actvar[(i)]]) | 977 | #define getlocvar(fs, i) (proto_varinfo((fs)->pt)[(fs)->actvar[(i)]]) |
978 | 978 | ||
979 | static BCReg registerlocalvar(LexState *ls, GCstr *name) | 979 | static BCReg registerlocalvar(LexState *ls, GCstr *name) |
980 | { | 980 | { |
981 | FuncState *fs = ls->fs; | 981 | FuncState *fs = ls->fs; |
982 | GCproto *pt = fs->pt; | 982 | GCproto *pt = fs->pt; |
983 | VarInfo *varinfo = proto_varinfo(pt); | ||
983 | if (LJ_UNLIKELY(fs->nlocvars >= pt->sizevarinfo)) { | 984 | if (LJ_UNLIKELY(fs->nlocvars >= pt->sizevarinfo)) { |
984 | MSize oldsize = pt->sizevarinfo; | 985 | MSize oldsize = pt->sizevarinfo; |
985 | checklimit(fs, fs->nlocvars, 32767, "local variables"); | 986 | checklimit(fs, fs->nlocvars, 32767, "local variables"); |
986 | lj_mem_growvec(fs->L, pt->varinfo, pt->sizevarinfo, 32767, VarInfo); | 987 | lj_mem_growvec(fs->L, varinfo, pt->sizevarinfo, 32767, VarInfo); |
987 | while (oldsize < pt->sizevarinfo) pt->varinfo[oldsize++].name = NULL; | 988 | setmref(pt->varinfo, varinfo); |
989 | while (oldsize < pt->sizevarinfo) setgcrefnull(varinfo[oldsize++].name); | ||
988 | } | 990 | } |
989 | pt->varinfo[fs->nlocvars].name = name; | 991 | setgcref(varinfo[fs->nlocvars].name, obj2gco(name)); |
990 | lj_gc_objbarrier(ls->L, pt, name); | 992 | lj_gc_objbarrier(ls->L, pt, name); |
991 | return fs->nlocvars++; | 993 | return fs->nlocvars++; |
992 | } | 994 | } |
@@ -1048,7 +1050,7 @@ static BCReg searchvar(FuncState *fs, GCstr *n) | |||
1048 | { | 1050 | { |
1049 | int i; | 1051 | int i; |
1050 | for (i = fs->nactvar-1; i >= 0; i--) { | 1052 | for (i = fs->nactvar-1; i >= 0; i--) { |
1051 | if (n == getlocvar(fs, i).name) | 1053 | if (n == gco2str(gcref(getlocvar(fs, i).name))) |
1052 | return (BCReg)i; | 1054 | return (BCReg)i; |
1053 | } | 1055 | } |
1054 | return (BCReg)-1; /* Not found. */ | 1056 | return (BCReg)-1; /* Not found. */ |
@@ -1237,6 +1239,7 @@ static void close_func(LexState *ls) | |||
1237 | BCIns *bc; | 1239 | BCIns *bc; |
1238 | GCRef *uvname; | 1240 | GCRef *uvname; |
1239 | BCLine *lineinfo; | 1241 | BCLine *lineinfo; |
1242 | VarInfo *varinfo; | ||
1240 | removevars(ls, 0); | 1243 | removevars(ls, 0); |
1241 | finalret(fs, pt); | 1244 | finalret(fs, pt); |
1242 | bc = proto_bc(pt); | 1245 | bc = proto_bc(pt); |
@@ -1249,7 +1252,9 @@ static void close_func(LexState *ls) | |||
1249 | lj_mem_reallocvec(L, lineinfo, pt->sizelineinfo, fs->pc, BCLine); | 1252 | lj_mem_reallocvec(L, lineinfo, pt->sizelineinfo, fs->pc, BCLine); |
1250 | setmref(pt->lineinfo, lineinfo); | 1253 | setmref(pt->lineinfo, lineinfo); |
1251 | pt->sizelineinfo = fs->pc; | 1254 | pt->sizelineinfo = fs->pc; |
1252 | lj_mem_reallocvec(L, pt->varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo); | 1255 | varinfo = proto_varinfo(pt); |
1256 | lj_mem_reallocvec(L, varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo); | ||
1257 | setmref(pt->varinfo, varinfo); | ||
1253 | pt->sizevarinfo = fs->nlocvars; | 1258 | pt->sizevarinfo = fs->nlocvars; |
1254 | uvname = mref(pt->uvname, GCRef); | 1259 | uvname = mref(pt->uvname, GCRef); |
1255 | lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef); | 1260 | lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef); |