diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-05-09 11:14:34 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-05-09 11:14:34 -0300 |
| commit | 78b40bf57db59aa35c9f1cbbd6482dc17e4306de (patch) | |
| tree | 64d06e1c13d99a9b4d9d201ef5bafd6989446880 /lcode.c | |
| parent | 01f1ac36b13f4fb23527785add70afe64f275944 (diff) | |
| download | lua-78b40bf57db59aa35c9f1cbbd6482dc17e4306de.tar.gz lua-78b40bf57db59aa35c9f1cbbd6482dc17e4306de.tar.bz2 lua-78b40bf57db59aa35c9f1cbbd6482dc17e4306de.zip | |
`skip' instructions must be followed by a jump
Diffstat (limited to 'lcode.c')
| -rw-r--r-- | lcode.c | 23 |
1 files changed, 10 insertions, 13 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lcode.c,v 1.98 2002/05/06 15:51:41 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.99 2002/05/07 17:36:56 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 | */ |
| @@ -338,22 +338,19 @@ static void discharge2anyreg (FuncState *fs, expdesc *e) { | |||
| 338 | 338 | ||
| 339 | static void luaK_exp2reg (FuncState *fs, expdesc *e, int reg) { | 339 | static void luaK_exp2reg (FuncState *fs, expdesc *e, int reg) { |
| 340 | discharge2reg(fs, e, reg); | 340 | discharge2reg(fs, e, reg); |
| 341 | if (e->k == VJMP || hasjumps(e)) { | 341 | if (e->k == VJMP) |
| 342 | luaK_concat(fs, &e->t, e->info); /* put this jump in `t' list */ | ||
| 343 | if (hasjumps(e)) { | ||
| 342 | int final; /* position after whole expression */ | 344 | int final; /* position after whole expression */ |
| 343 | int p_f = NO_JUMP; /* position of an eventual PUSH false */ | 345 | int p_f = NO_JUMP; /* position of an eventual LOAD false */ |
| 344 | int p_t = NO_JUMP; /* position of an eventual PUSH true */ | 346 | int p_t = NO_JUMP; /* position of an eventual LOAD true */ |
| 345 | if (e->k == VJMP || need_value(fs, e->t, 1) | 347 | if (need_value(fs, e->t, 1) || need_value(fs, e->f, 0)) { |
| 346 | || need_value(fs, e->f, 0)) { | ||
| 347 | if (e->k != VJMP) { | 348 | if (e->k != VJMP) { |
| 348 | luaK_getlabel(fs); /* these instruction may be jump target */ | 349 | luaK_getlabel(fs); /* this instruction may be a jump target */ |
| 349 | luaK_codeAsBx(fs, OP_JMP, 0, 2); /* to jump over both pushes */ | 350 | luaK_codeAsBx(fs, OP_JMP, 0, 2); /* to jump over both pushes */ |
| 350 | } | 351 | } |
| 351 | else { /* last expression is a conditional (test + jump) */ | 352 | p_f = code_label(fs, reg, 0, 1); |
| 352 | fs->pc--; /* remove its jump */ | 353 | p_t = code_label(fs, reg, 1, 0); |
| 353 | lua_assert(testOpMode(GET_OPCODE(fs->f->code[fs->pc - 1]), OpModeT)); | ||
| 354 | } | ||
| 355 | p_t = code_label(fs, reg, 1, 1); | ||
| 356 | p_f = code_label(fs, reg, 0, 0); | ||
| 357 | } | 354 | } |
| 358 | final = luaK_getlabel(fs); | 355 | final = luaK_getlabel(fs); |
| 359 | luaK_patchlistaux(fs, e->f, p_f, NO_REG, final, reg, p_f); | 356 | luaK_patchlistaux(fs, e->f, p_f, NO_REG, final, reg, p_f); |
