diff options
| -rw-r--r-- | bugs | 42 | ||||
| -rw-r--r-- | lcode.c | 14 |
2 files changed, 48 insertions, 8 deletions
| @@ -797,3 +797,45 @@ patch = [[ | |||
| 797 | 797 | ||
| 798 | } | 798 | } |
| 799 | 799 | ||
| 800 | |||
| 801 | |||
| 802 | ----------------------------------------------------------------- | ||
| 803 | -- Lua 5.1 | ||
| 804 | |||
| 805 | Bug{ | ||
| 806 | what = [[In 16-bit machines, expressions and/or with numeric constants as the | ||
| 807 | right operand may result in weird values]], | ||
| 808 | |||
| 809 | report = [[Andreas Stenius, 15/03/2006]], | ||
| 810 | |||
| 811 | example = [[ | ||
| 812 | print(false or 0) -- on 16-bit machines | ||
| 813 | ]], | ||
| 814 | |||
| 815 | patch = [[ | ||
| 816 | * lcode.c: | ||
| 817 | @@ -731,17 +731,15 @@ | ||
| 818 | case OPR_AND: { | ||
| 819 | lua_assert(e1->t == NO_JUMP); /* list must be closed */ | ||
| 820 | luaK_dischargevars(fs, e2); | ||
| 821 | - luaK_concat(fs, &e1->f, e2->f); | ||
| 822 | - e1->k = e2->k; e1->u.s.info = e2->u.s.info; | ||
| 823 | - e1->u.s.aux = e2->u.s.aux; e1->t = e2->t; | ||
| 824 | + luaK_concat(fs, &e2->f, e1->f); | ||
| 825 | + *e1 = *e2; | ||
| 826 | break; | ||
| 827 | } | ||
| 828 | case OPR_OR: { | ||
| 829 | lua_assert(e1->f == NO_JUMP); /* list must be closed */ | ||
| 830 | luaK_dischargevars(fs, e2); | ||
| 831 | - luaK_concat(fs, &e1->t, e2->t); | ||
| 832 | - e1->k = e2->k; e1->u.s.info = e2->u.s.info; | ||
| 833 | - e1->u.s.aux = e2->u.s.aux; e1->f = e2->f; | ||
| 834 | + luaK_concat(fs, &e2->t, e1->t); | ||
| 835 | + *e1 = *e2; | ||
| 836 | break; | ||
| 837 | } | ||
| 838 | ]], | ||
| 839 | |||
| 840 | } | ||
| 841 | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lcode.c,v 2.23 2005/11/25 13:29:32 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 2.24 2005/12/22 16:19:56 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 | */ |
| @@ -731,17 +731,15 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) { | |||
| 731 | case OPR_AND: { | 731 | case OPR_AND: { |
| 732 | lua_assert(e1->t == NO_JUMP); /* list must be closed */ | 732 | lua_assert(e1->t == NO_JUMP); /* list must be closed */ |
| 733 | luaK_dischargevars(fs, e2); | 733 | luaK_dischargevars(fs, e2); |
| 734 | luaK_concat(fs, &e1->f, e2->f); | 734 | luaK_concat(fs, &e2->f, e1->f); |
| 735 | e1->k = e2->k; e1->u.s.info = e2->u.s.info; | 735 | *e1 = *e2; |
| 736 | e1->u.s.aux = e2->u.s.aux; e1->t = e2->t; | ||
| 737 | break; | 736 | break; |
| 738 | } | 737 | } |
| 739 | case OPR_OR: { | 738 | case OPR_OR: { |
| 740 | lua_assert(e1->f == NO_JUMP); /* list must be closed */ | 739 | lua_assert(e1->f == NO_JUMP); /* list must be closed */ |
| 741 | luaK_dischargevars(fs, e2); | 740 | luaK_dischargevars(fs, e2); |
| 742 | luaK_concat(fs, &e1->t, e2->t); | 741 | luaK_concat(fs, &e2->t, e1->t); |
| 743 | e1->k = e2->k; e1->u.s.info = e2->u.s.info; | 742 | *e1 = *e2; |
| 744 | e1->u.s.aux = e2->u.s.aux; e1->f = e2->f; | ||
| 745 | break; | 743 | break; |
| 746 | } | 744 | } |
| 747 | case OPR_CONCAT: { | 745 | case OPR_CONCAT: { |
| @@ -750,7 +748,7 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) { | |||
| 750 | lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1); | 748 | lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1); |
| 751 | freeexp(fs, e1); | 749 | freeexp(fs, e1); |
| 752 | SETARG_B(getcode(fs, e2), e1->u.s.info); | 750 | SETARG_B(getcode(fs, e2), e1->u.s.info); |
| 753 | e1->k = e2->k; e1->u.s.info = e2->u.s.info; | 751 | e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info; |
| 754 | } | 752 | } |
| 755 | else { | 753 | else { |
| 756 | luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */ | 754 | luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */ |
