diff options
Diffstat (limited to 'lcode.c')
-rw-r--r-- | lcode.c | 27 |
1 files changed, 19 insertions, 8 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 1.89 2002/02/05 22:39:12 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.90 2002/03/05 12:42:47 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 | */ |
@@ -158,6 +158,11 @@ void luaK_patchlist (FuncState *fs, int list, int target) { | |||
158 | } | 158 | } |
159 | 159 | ||
160 | 160 | ||
161 | void luaK_patchtohere (FuncState *fs, int list) { | ||
162 | luaK_patchlist(fs, list, luaK_getlabel(fs)); | ||
163 | } | ||
164 | |||
165 | |||
161 | void luaK_concat (FuncState *fs, int *l1, int l2) { | 166 | void luaK_concat (FuncState *fs, int *l1, int l2) { |
162 | if (*l1 == NO_JUMP) | 167 | if (*l1 == NO_JUMP) |
163 | *l1 = l2; | 168 | *l1 = l2; |
@@ -171,16 +176,22 @@ void luaK_concat (FuncState *fs, int *l1, int l2) { | |||
171 | } | 176 | } |
172 | 177 | ||
173 | 178 | ||
174 | void luaK_reserveregs (FuncState *fs, int n) { | 179 | void luaK_checkstack (FuncState *fs, int n) { |
175 | fs->freereg += n; | 180 | int newstack = fs->freereg + n; |
176 | if (fs->freereg > fs->f->maxstacksize) { | 181 | if (newstack > fs->f->maxstacksize) { |
177 | if (fs->freereg >= MAXSTACK) | 182 | if (newstack >= MAXSTACK) |
178 | luaK_error(fs->ls, "function or expression too complex"); | 183 | luaK_error(fs->ls, "function or expression too complex"); |
179 | fs->f->maxstacksize = cast(lu_byte, fs->freereg); | 184 | fs->f->maxstacksize = cast(lu_byte, newstack); |
180 | } | 185 | } |
181 | } | 186 | } |
182 | 187 | ||
183 | 188 | ||
189 | void luaK_reserveregs (FuncState *fs, int n) { | ||
190 | luaK_checkstack(fs, n); | ||
191 | fs->freereg += n; | ||
192 | } | ||
193 | |||
194 | |||
184 | static void freereg (FuncState *fs, int reg) { | 195 | static void freereg (FuncState *fs, int reg) { |
185 | if (reg >= fs->nactloc && reg < MAXSTACK) { | 196 | if (reg >= fs->nactloc && reg < MAXSTACK) { |
186 | fs->freereg--; | 197 | fs->freereg--; |
@@ -533,7 +544,7 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) { | |||
533 | } | 544 | } |
534 | } | 545 | } |
535 | luaK_concat(fs, &e->f, pc); /* insert last jump in `f' list */ | 546 | luaK_concat(fs, &e->f, pc); /* insert last jump in `f' list */ |
536 | luaK_patchlist(fs, e->t, luaK_getlabel(fs)); | 547 | luaK_patchtohere(fs, e->t); |
537 | e->t = NO_JUMP; | 548 | e->t = NO_JUMP; |
538 | } | 549 | } |
539 | 550 | ||
@@ -560,7 +571,7 @@ static void luaK_goiffalse (FuncState *fs, expdesc *e) { | |||
560 | } | 571 | } |
561 | } | 572 | } |
562 | luaK_concat(fs, &e->t, pc); /* insert last jump in `t' list */ | 573 | luaK_concat(fs, &e->t, pc); /* insert last jump in `t' list */ |
563 | luaK_patchlist(fs, e->f, luaK_getlabel(fs)); | 574 | luaK_patchtohere(fs, e->f); |
564 | e->f = NO_JUMP; | 575 | e->f = NO_JUMP; |
565 | } | 576 | } |
566 | 577 | ||