diff options
Diffstat (limited to 'lcode.c')
| -rw-r--r-- | lcode.c | 50 |
1 files changed, 35 insertions, 15 deletions
| @@ -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 | */ |
| 609 | static int boolK (FuncState *fs, int b) { | 612 | static 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 | */ | ||
| 622 | static 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 | ||
| 855 | static int code_loadbool (FuncState *fs, int A, int b, int jump) { | 875 | static 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; |
