aboutsummaryrefslogtreecommitdiff
path: root/lcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'lcode.c')
-rw-r--r--lcode.c50
1 files changed, 35 insertions, 15 deletions
diff --git a/lcode.c b/lcode.c
index 4fc97e2b..72a8820b 100644
--- a/lcode.c
+++ b/lcode.c
@@ -84,8 +84,11 @@ int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v) {
84 if (hasjumps(e)) 84 if (hasjumps(e))
85 return 0; /* not a constant */ 85 return 0; /* not a constant */
86 switch (e->k) { 86 switch (e->k) {
87 case VFALSE: case VTRUE: 87 case VFALSE:
88 setbvalue(v, e->k == VTRUE); 88 setbfvalue(v);
89 return 1;
90 case VTRUE:
91 setbtvalue(v);
89 return 1; 92 return 1;
90 case VNIL: 93 case VNIL:
91 setnilvalue(v); 94 setnilvalue(v);
@@ -604,11 +607,21 @@ static int luaK_numberK (FuncState *fs, lua_Number r) {
604 607
605 608
606/* 609/*
607** Add a boolean to list of constants and return its index. 610** Add a false to list of constants and return its index.
608*/ 611*/
609static int boolK (FuncState *fs, int b) { 612static int boolF (FuncState *fs) {
610 TValue o; 613 TValue o;
611 setbvalue(&o, b); 614 setbfvalue(&o);
615 return addk(fs, &o, &o); /* use boolean itself as key */
616}
617
618
619/*
620** Add a true to list of constants and return its index.
621*/
622static int boolT (FuncState *fs) {
623 TValue o;
624 setbtvalue(&o);
612 return addk(fs, &o, &o); /* use boolean itself as key */ 625 return addk(fs, &o, &o); /* use boolean itself as key */
613} 626}
614 627
@@ -671,8 +684,11 @@ static void const2exp (TValue *v, expdesc *e) {
671 case LUA_TNUMFLT: 684 case LUA_TNUMFLT:
672 e->k = VKFLT; e->u.nval = fltvalue(v); 685 e->k = VKFLT; e->u.nval = fltvalue(v);
673 break; 686 break;
674 case LUA_TBOOLEAN: 687 case LUA_TFALSE:
675 e->k = bvalue(v) ? VTRUE : VFALSE; 688 e->k = VFALSE;
689 break;
690 case LUA_TTRUE:
691 e->k = VTRUE;
676 break; 692 break;
677 case LUA_TNIL: 693 case LUA_TNIL:
678 e->k = VNIL; 694 e->k = VNIL;
@@ -801,8 +817,12 @@ static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
801 luaK_nil(fs, reg, 1); 817 luaK_nil(fs, reg, 1);
802 break; 818 break;
803 } 819 }
804 case VFALSE: case VTRUE: { 820 case VFALSE: {
805 luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); 821 luaK_codeABC(fs, OP_LOADFALSE, reg, 0, 0);
822 break;
823 }
824 case VTRUE: {
825 luaK_codeABC(fs, OP_LOADTRUE, reg, 0, 0);
806 break; 826 break;
807 } 827 }
808 case VKSTR: { 828 case VKSTR: {
@@ -852,9 +872,9 @@ static void discharge2anyreg (FuncState *fs, expdesc *e) {
852} 872}
853 873
854 874
855static int code_loadbool (FuncState *fs, int A, int b, int jump) { 875static int code_loadbool (FuncState *fs, int A, OpCode op, int jump) {
856 luaK_getlabel(fs); /* those instructions may be jump targets */ 876 luaK_getlabel(fs); /* those instructions may be jump targets */
857 return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump); 877 return luaK_codeABC(fs, op, A, jump, 0);
858} 878}
859 879
860 880
@@ -888,8 +908,8 @@ static void exp2reg (FuncState *fs, expdesc *e, int reg) {
888 int p_t = NO_JUMP; /* position of an eventual LOAD true */ 908 int p_t = NO_JUMP; /* position of an eventual LOAD true */
889 if (need_value(fs, e->t) || need_value(fs, e->f)) { 909 if (need_value(fs, e->t) || need_value(fs, e->f)) {
890 int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs); 910 int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);
891 p_f = code_loadbool(fs, reg, 0, 1); /* load false and skip next i. */ 911 p_f = code_loadbool(fs, reg, OP_LOADFALSE, 1); /* skip next inst. */
892 p_t = code_loadbool(fs, reg, 1, 0); /* load true */ 912 p_t = code_loadbool(fs, reg, OP_LOADTRUE, 0);
893 /* jump around these booleans if 'e' is not a test */ 913 /* jump around these booleans if 'e' is not a test */
894 luaK_patchtohere(fs, fj); 914 luaK_patchtohere(fs, fj);
895 } 915 }
@@ -963,8 +983,8 @@ static int luaK_exp2K (FuncState *fs, expdesc *e) {
963 if (!hasjumps(e)) { 983 if (!hasjumps(e)) {
964 int info; 984 int info;
965 switch (e->k) { /* move constants to 'k' */ 985 switch (e->k) { /* move constants to 'k' */
966 case VTRUE: info = boolK(fs, 1); break; 986 case VTRUE: info = boolT(fs); break;
967 case VFALSE: info = boolK(fs, 0); break; 987 case VFALSE: info = boolF(fs); break;
968 case VNIL: info = nilK(fs); break; 988 case VNIL: info = nilK(fs); break;
969 case VKINT: info = luaK_intK(fs, e->u.ival); break; 989 case VKINT: info = luaK_intK(fs, e->u.ival); break;
970 case VKFLT: info = luaK_numberK(fs, e->u.nval); break; 990 case VKFLT: info = luaK_numberK(fs, e->u.nval); break;