From 78b40bf57db59aa35c9f1cbbd6482dc17e4306de Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 9 May 2002 11:14:34 -0300 Subject: `skip' instructions must be followed by a jump --- lcode.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) (limited to 'lcode.c') diff --git a/lcode.c b/lcode.c index a34eed8e..6d463311 100644 --- a/lcode.c +++ b/lcode.c @@ -1,5 +1,5 @@ /* -** $Id: lcode.c,v 1.98 2002/05/06 15:51:41 roberto Exp roberto $ +** $Id: lcode.c,v 1.99 2002/05/07 17:36:56 roberto Exp roberto $ ** Code generator for Lua ** See Copyright Notice in lua.h */ @@ -338,22 +338,19 @@ static void discharge2anyreg (FuncState *fs, expdesc *e) { static void luaK_exp2reg (FuncState *fs, expdesc *e, int reg) { discharge2reg(fs, e, reg); - if (e->k == VJMP || hasjumps(e)) { + if (e->k == VJMP) + luaK_concat(fs, &e->t, e->info); /* put this jump in `t' list */ + if (hasjumps(e)) { int final; /* position after whole expression */ - int p_f = NO_JUMP; /* position of an eventual PUSH false */ - int p_t = NO_JUMP; /* position of an eventual PUSH true */ - if (e->k == VJMP || need_value(fs, e->t, 1) - || need_value(fs, e->f, 0)) { + int p_f = NO_JUMP; /* position of an eventual LOAD false */ + int p_t = NO_JUMP; /* position of an eventual LOAD true */ + if (need_value(fs, e->t, 1) || need_value(fs, e->f, 0)) { if (e->k != VJMP) { - luaK_getlabel(fs); /* these instruction may be jump target */ + luaK_getlabel(fs); /* this instruction may be a jump target */ luaK_codeAsBx(fs, OP_JMP, 0, 2); /* to jump over both pushes */ } - else { /* last expression is a conditional (test + jump) */ - fs->pc--; /* remove its jump */ - lua_assert(testOpMode(GET_OPCODE(fs->f->code[fs->pc - 1]), OpModeT)); - } - p_t = code_label(fs, reg, 1, 1); - p_f = code_label(fs, reg, 0, 0); + p_f = code_label(fs, reg, 0, 1); + p_t = code_label(fs, reg, 1, 0); } final = luaK_getlabel(fs); luaK_patchlistaux(fs, e->f, p_f, NO_REG, final, reg, p_f); -- cgit v1.2.3-55-g6feb