summaryrefslogtreecommitdiff
path: root/lcode.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-03-24 09:18:30 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-03-24 09:18:30 -0300
commit47b4bf59649834c611571d7ac1482eac55687ce5 (patch)
treec35f5927bf2de05115ee8da6f6f459f5733463f5 /lcode.c
parent415ee1a24f59136b735eb78e864a934ea534e5ff (diff)
downloadlua-47b4bf59649834c611571d7ac1482eac55687ce5.tar.gz
lua-47b4bf59649834c611571d7ac1482eac55687ce5.tar.bz2
lua-47b4bf59649834c611571d7ac1482eac55687ce5.zip
small refactoring.
Diffstat (limited to 'lcode.c')
-rw-r--r--lcode.c48
1 files changed, 23 insertions, 25 deletions
diff --git a/lcode.c b/lcode.c
index e08d49dc..78777e00 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 1.15 2000/03/17 14:46:04 roberto Exp roberto $ 2** $Id: lcode.c,v 1.16 2000/03/20 19:15:37 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*/
@@ -408,49 +408,47 @@ static void concatlists (FuncState *fs, int *l1, int l2) {
408} 408}
409 409
410 410
411void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue) { 411static void luaK_testgo (FuncState *fs, expdesc *v, int invert, OpCode jump) {
412 Instruction *previous; 412 Instruction *previous;
413 int *golist = &v->u.l.f;
414 int *exitlist = &v->u.l.t;
415 if (invert) { /* interchange `golist' and `exitlist' */
416 int *temp = golist; golist = exitlist; exitlist = temp;
417 }
413 discharge1(fs, v); 418 discharge1(fs, v);
414 previous = &fs->f->code[fs->pc-1]; 419 previous = &fs->f->code[fs->pc-1];
415 LUA_ASSERT(L, GET_OPCODE(*previous) != OP_SETLINE, "bad place to set line"); 420 LUA_ASSERT(L, GET_OPCODE(*previous) != OP_SETLINE, "bad place to set line");
416 if (ISJUMP(GET_OPCODE(*previous))) 421 if (ISJUMP(GET_OPCODE(*previous))) {
417 SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); 422 if (invert)
418 else { 423 SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous)));
419 OpCode jump = keepvalue ? OP_ONFJMP : OP_IFFJMP;
420 luaK_jump(fs, jump);
421 } 424 }
422 insert_last(fs, &v->u.l.f); 425 else
423 luaK_patchlist(fs, v->u.l.t, luaK_getlabel(fs)); 426 luaK_jump(fs, jump);
424 v->u.l.t = NO_JUMP; 427 insert_last(fs, exitlist);
428 luaK_patchlist(fs, *golist, luaK_getlabel(fs));
429 *golist = NO_JUMP;
430}
431
432
433void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue) {
434 luaK_testgo(fs, v, 1, keepvalue ? OP_ONFJMP : OP_IFFJMP);
425} 435}
426 436
427 437
428void luaK_goiffalse (FuncState *fs, expdesc *v, int keepvalue) { 438void luaK_goiffalse (FuncState *fs, expdesc *v, int keepvalue) {
429 Instruction previous; 439 luaK_testgo(fs, v, 0, keepvalue ? OP_ONTJMP : OP_IFTJMP);
430 discharge1(fs, v);
431 previous = fs->f->code[fs->pc-1];
432 LUA_ASSERT(L, GET_OPCODE(previous) != OP_SETLINE, "bad place to set line");
433 if (!ISJUMP(GET_OPCODE(previous))) {
434 OpCode jump = keepvalue ? OP_ONTJMP : OP_IFTJMP;
435 luaK_jump(fs, jump);
436 }
437 insert_last(fs, &v->u.l.t);
438 luaK_patchlist(fs, v->u.l.f, luaK_getlabel(fs));
439 v->u.l.f = NO_JUMP;
440} 440}
441 441
442 442
443void luaK_tostack (LexState *ls, expdesc *v, int onlyone) { 443void luaK_tostack (LexState *ls, expdesc *v, int onlyone) {
444 FuncState *fs = ls->fs; 444 FuncState *fs = ls->fs;
445 if (discharge(fs, v)) return; 445 if (!discharge(fs, v)) { /* `v' is an expression? */
446 else { /* is an expression */
447 OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]); 446 OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]);
448 LUA_ASSERT(L, previous != OP_SETLINE, "bad place to set line"); 447 LUA_ASSERT(L, previous != OP_SETLINE, "bad place to set line");
449 if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) { 448 if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) {
450 /* it is an expression without jumps */ 449 /* it is an expression without jumps */
451 if (onlyone && v->k == VEXP) 450 if (onlyone)
452 luaK_setcallreturns(fs, 1); /* call must return 1 value */ 451 luaK_setcallreturns(fs, 1); /* call must return 1 value */
453 return;
454 } 452 }
455 else { /* expression has jumps... */ 453 else { /* expression has jumps... */
456 int p_nil = 0; /* position of an eventual PUSHNIL */ 454 int p_nil = 0; /* position of an eventual PUSHNIL */