aboutsummaryrefslogtreecommitdiff
path: root/lcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'lcode.c')
-rw-r--r--lcode.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/lcode.c b/lcode.c
index 8fb0f70c..321af3c9 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 1.58 2001/01/29 13:14:49 roberto Exp roberto $ 2** $Id: lcode.c,v 1.59 2001/01/29 15:26:40 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*/
@@ -460,25 +460,26 @@ int luaK_code1 (FuncState *fs, OpCode o, int arg1) {
460int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { 460int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) {
461 Proto *f; 461 Proto *f;
462 Instruction i = previous_instruction(fs); 462 Instruction i = previous_instruction(fs);
463 int delta = (int)luaK_opproperties[o].push - (int)luaK_opproperties[o].pop; 463 int push = (int)luaK_opproperties[o].push;
464 int pop = (int)luaK_opproperties[o].pop;
464 int optm = 0; /* 1 when there is an optimization */ 465 int optm = 0; /* 1 when there is an optimization */
465 switch (o) { 466 switch (o) {
466 case OP_CLOSURE: { 467 case OP_CLOSURE: {
467 delta = -arg2+1; 468 pop = arg2;
468 break; 469 break;
469 } 470 }
470 case OP_SETTABLE: { 471 case OP_SETTABLE: {
471 delta = -arg2; 472 pop = arg2;
472 break; 473 break;
473 } 474 }
474 case OP_SETLIST: { 475 case OP_SETLIST: {
475 if (arg2 == 0) return NO_JUMP; /* nothing to do */ 476 if (arg2 == 0) return NO_JUMP; /* nothing to do */
476 delta = -arg2; 477 pop = arg2;
477 break; 478 break;
478 } 479 }
479 case OP_SETMAP: { 480 case OP_SETMAP: {
480 if (arg1 == 0) return NO_JUMP; /* nothing to do */ 481 if (arg1 == 0) return NO_JUMP; /* nothing to do */
481 delta = -2*arg1; 482 pop = 2*arg1;
482 break; 483 break;
483 } 484 }
484 case OP_RETURN: { 485 case OP_RETURN: {
@@ -491,7 +492,7 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) {
491 } 492 }
492 case OP_PUSHNIL: { 493 case OP_PUSHNIL: {
493 if (arg1 == 0) return NO_JUMP; /* nothing to do */ 494 if (arg1 == 0) return NO_JUMP; /* nothing to do */
494 delta = arg1; 495 push = arg1;
495 switch(GET_OPCODE(i)) { 496 switch(GET_OPCODE(i)) {
496 case OP_PUSHNIL: SETARG_U(i, GETARG_U(i)+arg1); optm = 1; break; 497 case OP_PUSHNIL: SETARG_U(i, GETARG_U(i)+arg1); optm = 1; break;
497 default: break; 498 default: break;
@@ -500,7 +501,7 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) {
500 } 501 }
501 case OP_POP: { 502 case OP_POP: {
502 if (arg1 == 0) return NO_JUMP; /* nothing to do */ 503 if (arg1 == 0) return NO_JUMP; /* nothing to do */
503 delta = -arg1; 504 pop = arg1;
504 switch(GET_OPCODE(i)) { 505 switch(GET_OPCODE(i)) {
505 case OP_SETTABLE: SETARG_B(i, GETARG_B(i)+arg1); optm = 1; break; 506 case OP_SETTABLE: SETARG_B(i, GETARG_B(i)+arg1); optm = 1; break;
506 default: break; 507 default: break;
@@ -539,7 +540,7 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) {
539 break; 540 break;
540 } 541 }
541 case OP_CONCAT: { 542 case OP_CONCAT: {
542 delta = -arg1+1; 543 pop = arg1;
543 switch(GET_OPCODE(i)) { 544 switch(GET_OPCODE(i)) {
544 case OP_CONCAT: /* `a..b..c' */ 545 case OP_CONCAT: /* `a..b..c' */
545 SETARG_U(i, GETARG_U(i)+1); 546 SETARG_U(i, GETARG_U(i)+1);
@@ -573,7 +574,7 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) {
573 case OP_JMPEQ: { 574 case OP_JMPEQ: {
574 if (i == CREATE_U(OP_PUSHNIL, 1)) { /* `a==nil' */ 575 if (i == CREATE_U(OP_PUSHNIL, 1)) { /* `a==nil' */
575 i = CREATE_0(OP_NOT); 576 i = CREATE_0(OP_NOT);
576 delta = -1; /* just undo effect of previous PUSHNIL */ 577 pop = 1; /* just undo effect of previous PUSHNIL */
577 optm = 1; 578 optm = 1;
578 } 579 }
579 break; 580 break;
@@ -637,12 +638,14 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) {
637 break; 638 break;
638 } 639 }
639 default: { 640 default: {
640 lua_assert(delta != VD);
641 break; 641 break;
642 } 642 }
643 } 643 }
644 f = fs->f; 644 f = fs->f;
645 luaK_deltastack(fs, delta); 645 lua_assert(push != VD);
646 lua_assert(pop != VD);
647 luaK_deltastack(fs, push);
648 luaK_deltastack(fs, -pop);
646 if (optm) { /* optimize: put instruction in place of last one */ 649 if (optm) { /* optimize: put instruction in place of last one */
647 f->code[fs->pc-1] = i; /* change previous instruction */ 650 f->code[fs->pc-1] = i; /* change previous instruction */
648 return fs->pc-1; /* do not generate new instruction */ 651 return fs->pc-1; /* do not generate new instruction */
@@ -668,7 +671,7 @@ const OpProperties luaK_opproperties[NUM_OPCODES] = {
668 {iAB, 0, 0}, /* OP_CALL */ 671 {iAB, 0, 0}, /* OP_CALL */
669 {iAB, 0, 0}, /* OP_TAILCALL */ 672 {iAB, 0, 0}, /* OP_TAILCALL */
670 {iU, VD, 0}, /* OP_PUSHNIL */ 673 {iU, VD, 0}, /* OP_PUSHNIL */
671 {iU, VD, 0}, /* OP_POP */ 674 {iU, 0, VD}, /* OP_POP */
672 {iS, 1, 0}, /* OP_PUSHINT */ 675 {iS, 1, 0}, /* OP_PUSHINT */
673 {iU, 1, 0}, /* OP_PUSHSTRING */ 676 {iU, 1, 0}, /* OP_PUSHSTRING */
674 {iU, 1, 0}, /* OP_PUSHNUM */ 677 {iU, 1, 0}, /* OP_PUSHNUM */
@@ -683,16 +686,16 @@ const OpProperties luaK_opproperties[NUM_OPCODES] = {
683 {iU, 1, 0}, /* OP_CREATETABLE */ 686 {iU, 1, 0}, /* OP_CREATETABLE */
684 {iU, 0, 1}, /* OP_SETLOCAL */ 687 {iU, 0, 1}, /* OP_SETLOCAL */
685 {iU, 0, 1}, /* OP_SETGLOBAL */ 688 {iU, 0, 1}, /* OP_SETGLOBAL */
686 {iAB, VD, 0}, /* OP_SETTABLE */ 689 {iAB, 0, VD}, /* OP_SETTABLE */
687 {iAB, VD, 0}, /* OP_SETLIST */ 690 {iAB, 0, VD}, /* OP_SETLIST */
688 {iU, VD, 0}, /* OP_SETMAP */ 691 {iU, 0, VD}, /* OP_SETMAP */
689 {iO, 1, 2}, /* OP_ADD */ 692 {iO, 1, 2}, /* OP_ADD */
690 {iS, 1, 1}, /* OP_ADDI */ 693 {iS, 1, 1}, /* OP_ADDI */
691 {iO, 1, 2}, /* OP_SUB */ 694 {iO, 1, 2}, /* OP_SUB */
692 {iO, 1, 2}, /* OP_MULT */ 695 {iO, 1, 2}, /* OP_MULT */
693 {iO, 1, 2}, /* OP_DIV */ 696 {iO, 1, 2}, /* OP_DIV */
694 {iO, 1, 2}, /* OP_POW */ 697 {iO, 1, 2}, /* OP_POW */
695 {iU, VD, 0}, /* OP_CONCAT */ 698 {iU, 1, VD}, /* OP_CONCAT */
696 {iO, 1, 1}, /* OP_MINUS */ 699 {iO, 1, 1}, /* OP_MINUS */
697 {iO, 1, 1}, /* OP_NOT */ 700 {iO, 1, 1}, /* OP_NOT */
698 {iS, 0, 2}, /* OP_JMPNE */ 701 {iS, 0, 2}, /* OP_JMPNE */
@@ -711,6 +714,6 @@ const OpProperties luaK_opproperties[NUM_OPCODES] = {
711 {iS, 0, 3}, /* OP_FORLOOP */ 714 {iS, 0, 3}, /* OP_FORLOOP */
712 {iS, 3, 0}, /* OP_LFORPREP */ 715 {iS, 3, 0}, /* OP_LFORPREP */
713 {iS, 0, 4}, /* OP_LFORLOOP */ 716 {iS, 0, 4}, /* OP_LFORLOOP */
714 {iAB, VD, 0} /* OP_CLOSURE */ 717 {iAB, 1, VD} /* OP_CLOSURE */
715}; 718};
716 719