aboutsummaryrefslogtreecommitdiff
path: root/lcode.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-03-20 16:15:37 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-03-20 16:15:37 -0300
commit374cc888f4f1e1adf2311dc7fb296e443533ccbb (patch)
tree6e4b07f576a13efa9db15b5ae0c44ae06ad48b63 /lcode.c
parentbb9605bbc954d53b7d5997c53fceafe4450a6917 (diff)
downloadlua-374cc888f4f1e1adf2311dc7fb296e443533ccbb.tar.gz
lua-374cc888f4f1e1adf2311dc7fb296e443533ccbb.tar.bz2
lua-374cc888f4f1e1adf2311dc7fb296e443533ccbb.zip
better(?) treatment for SETLINE
Diffstat (limited to 'lcode.c')
-rw-r--r--lcode.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/lcode.c b/lcode.c
index 42899758..e08d49dc 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 1.14 2000/03/17 13:09:46 roberto Exp roberto $ 2** $Id: lcode.c,v 1.15 2000/03/17 14:46:04 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*/
@@ -139,8 +139,7 @@ static void luaK_eq (FuncState *fs) {
139static void luaK_neq (FuncState *fs) { 139static void luaK_neq (FuncState *fs) {
140 Instruction previous = prepare(fs, CREATE_S(OP_IFNEQJMP, 0), -2); 140 Instruction previous = prepare(fs, CREATE_S(OP_IFNEQJMP, 0), -2);
141 if (previous == CREATE_U(OP_PUSHNIL, 1)) { 141 if (previous == CREATE_U(OP_PUSHNIL, 1)) {
142 fs->pc -= 2; /* remove PUSHNIL and IFNEQJMP */ 142 setprevious(fs, CREATE_S(OP_IFTJMP, 0));
143 luaK_deltastack(fs, 1); /* undo delta from `prepare' */
144 } 143 }
145} 144}
146 145
@@ -345,12 +344,6 @@ static void luaK_jump (FuncState *fs, OpCode jump) {
345 break; 344 break;
346 } 345 }
347 else return; /* do not set previous */ 346 else return; /* do not set previous */
348 case OP_PUSHNIL:
349 if (jump == OP_IFFJMP) {
350 previous = CREATE_S(OP_JMP, 0);
351 break;
352 }
353 else return; /* do not set previous */
354 default: return; 347 default: return;
355 } 348 }
356 setprevious(fs, previous); 349 setprevious(fs, previous);
@@ -419,6 +412,7 @@ void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue) {
419 Instruction *previous; 412 Instruction *previous;
420 discharge1(fs, v); 413 discharge1(fs, v);
421 previous = &fs->f->code[fs->pc-1]; 414 previous = &fs->f->code[fs->pc-1];
415 LUA_ASSERT(L, GET_OPCODE(*previous) != OP_SETLINE, "bad place to set line");
422 if (ISJUMP(GET_OPCODE(*previous))) 416 if (ISJUMP(GET_OPCODE(*previous)))
423 SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); 417 SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous)));
424 else { 418 else {
@@ -435,6 +429,7 @@ void luaK_goiffalse (FuncState *fs, expdesc *v, int keepvalue) {
435 Instruction previous; 429 Instruction previous;
436 discharge1(fs, v); 430 discharge1(fs, v);
437 previous = fs->f->code[fs->pc-1]; 431 previous = fs->f->code[fs->pc-1];
432 LUA_ASSERT(L, GET_OPCODE(previous) != OP_SETLINE, "bad place to set line");
438 if (!ISJUMP(GET_OPCODE(previous))) { 433 if (!ISJUMP(GET_OPCODE(previous))) {
439 OpCode jump = keepvalue ? OP_ONTJMP : OP_IFTJMP; 434 OpCode jump = keepvalue ? OP_ONTJMP : OP_IFTJMP;
440 luaK_jump(fs, jump); 435 luaK_jump(fs, jump);
@@ -450,6 +445,7 @@ void luaK_tostack (LexState *ls, expdesc *v, int onlyone) {
450 if (discharge(fs, v)) return; 445 if (discharge(fs, v)) return;
451 else { /* is an expression */ 446 else { /* is an expression */
452 OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]); 447 OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]);
448 LUA_ASSERT(L, previous != OP_SETLINE, "bad place to set line");
453 if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) { 449 if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) {
454 /* it is an expression without jumps */ 450 /* it is an expression without jumps */
455 if (onlyone && v->k == VEXP) 451 if (onlyone && v->k == VEXP)