summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lcode.c23
-rw-r--r--ldebug.c9
-rw-r--r--lvm.c12
3 files changed, 23 insertions, 21 deletions
diff --git a/lcode.c b/lcode.c
index a34eed8e..6d463311 100644
--- a/lcode.c
+++ b/lcode.c
@@ -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
339static void luaK_exp2reg (FuncState *fs, expdesc *e, int reg) { 339static 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);
diff --git a/ldebug.c b/ldebug.c
index a86f32e5..59c74731 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 1.111 2002/05/02 13:06:20 roberto Exp roberto $ 2** $Id: ldebug.c,v 1.112 2002/05/07 17:36:56 roberto Exp roberto $
3** Debug Interface 3** Debug Interface
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -270,8 +270,7 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) {
270 int pc; 270 int pc;
271 int last; /* stores position of last instruction that changed `reg' */ 271 int last; /* stores position of last instruction that changed `reg' */
272 last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */ 272 last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */
273 if (reg == NO_REG) /* full check? */ 273 check(precheck(pt));
274 check(precheck(pt));
275 for (pc = 0; pc < lastpc; pc++) { 274 for (pc = 0; pc < lastpc; pc++) {
276 const Instruction i = pt->code[pc]; 275 const Instruction i = pt->code[pc];
277 OpCode op = GET_OPCODE(i); 276 OpCode op = GET_OPCODE(i);
@@ -303,8 +302,10 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) {
303 if (testOpMode(op, OpModesetA)) { 302 if (testOpMode(op, OpModesetA)) {
304 if (a == reg) last = pc; /* change register `a' */ 303 if (a == reg) last = pc; /* change register `a' */
305 } 304 }
306 if (testOpMode(op, OpModeT)) 305 if (testOpMode(op, OpModeT)) {
307 check(pc+2 < pt->sizecode); /* check skip */ 306 check(pc+2 < pt->sizecode); /* check skip */
307 check(GET_OPCODE(pt->code[pc+1]) == OP_JMP);
308 }
308 switch (op) { 309 switch (op) {
309 case OP_LOADBOOL: { 310 case OP_LOADBOOL: {
310 check(c == 0 || pc+2 < pt->sizecode); /* check its jump */ 311 check(c == 0 || pc+2 < pt->sizecode); /* check its jump */
diff --git a/lvm.c b/lvm.c
index e867d870..a9045eef 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.228 2002/05/02 13:06:20 roberto Exp roberto $ 2** $Id: lvm.c,v 1.229 2002/05/06 15:51:41 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -449,16 +449,21 @@ StkId luaV_execute (lua_State *L) {
449 } 449 }
450 case OP_EQ: { /* skip next instruction if test fails */ 450 case OP_EQ: { /* skip next instruction if test fails */
451 if (luaO_equalObj(ra, RKC(i)) != GETARG_B(i)) pc++; 451 if (luaO_equalObj(ra, RKC(i)) != GETARG_B(i)) pc++;
452 else dojump(pc, GETARG_sBx(*pc) + 1);
452 break; 453 break;
453 } 454 }
454 case OP_CMP: { 455 case OP_CMP: {
455 if (!(luaV_cmp(L, ra, RKC(i), GETARG_B(i)))) pc++; 456 if (!(luaV_cmp(L, ra, RKC(i), GETARG_B(i)))) pc++;
457 else dojump(pc, GETARG_sBx(*pc) + 1);
456 break; 458 break;
457 } 459 }
458 case OP_TEST: { 460 case OP_TEST: {
459 StkId rc = RKC(i); 461 StkId rc = RKC(i);
460 if (l_isfalse(rc) == GETARG_B(i)) pc++; 462 if (l_isfalse(rc) == GETARG_B(i)) pc++;
461 else setobj(ra, rc); 463 else {
464 setobj(ra, rc);
465 dojump(pc, GETARG_sBx(*pc) + 1);
466 }
462 break; 467 break;
463 } 468 }
464 case OP_CALL: { 469 case OP_CALL: {
@@ -519,7 +524,6 @@ StkId luaV_execute (lua_State *L) {
519 } 524 }
520 case OP_FORLOOP: { 525 case OP_FORLOOP: {
521 lua_Number step, index, limit; 526 lua_Number step, index, limit;
522 int j = GETARG_sBx(i);
523 const TObject *plimit = ra+1; 527 const TObject *plimit = ra+1;
524 const TObject *pstep = ra+2; 528 const TObject *pstep = ra+2;
525 if (ttype(ra) != LUA_TNUMBER) 529 if (ttype(ra) != LUA_TNUMBER)
@@ -532,7 +536,7 @@ StkId luaV_execute (lua_State *L) {
532 index = nvalue(ra) + step; /* increment index */ 536 index = nvalue(ra) + step; /* increment index */
533 limit = nvalue(plimit); 537 limit = nvalue(plimit);
534 if (step > 0 ? index <= limit : index >= limit) { 538 if (step > 0 ? index <= limit : index >= limit) {
535 dojump(pc, j); /* jump back */ 539 dojump(pc, GETARG_sBx(i)); /* jump back */
536 chgnvalue(ra, index); /* update index */ 540 chgnvalue(ra, index); /* update index */
537 } 541 }
538 break; 542 break;