diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-06-15 10:52:08 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-06-15 10:52:08 -0300 |
commit | 3db5f60547d6f31892071f5c00032dfb79a8f729 (patch) | |
tree | 96fefd7cc75518254e0294bbe9502723b366786e | |
parent | 2258ec6bc94bc127024a49e29a0b40f58a5ae0a3 (diff) | |
download | lua-3db5f60547d6f31892071f5c00032dfb79a8f729.tar.gz lua-3db5f60547d6f31892071f5c00032dfb79a8f729.tar.bz2 lua-3db5f60547d6f31892071f5c00032dfb79a8f729.zip |
BUG: "(((1 or false) and true) or false)" gives wrong result
-rw-r--r-- | lcode.c | 24 |
1 files changed, 15 insertions, 9 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 2.36 2008/04/07 18:41:47 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 2.37 2009/06/10 16:52:03 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 | */ |
@@ -543,15 +543,18 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) { | |||
543 | pc = NO_JUMP; /* always true; do nothing */ | 543 | pc = NO_JUMP; /* always true; do nothing */ |
544 | break; | 544 | break; |
545 | } | 545 | } |
546 | case VFALSE: { | ||
547 | pc = luaK_jump(fs); /* always jump */ | ||
548 | break; | ||
549 | } | ||
550 | case VJMP: { | 546 | case VJMP: { |
551 | invertjump(fs, e); | 547 | invertjump(fs, e); |
552 | pc = e->u.s.info; | 548 | pc = e->u.s.info; |
553 | break; | 549 | break; |
554 | } | 550 | } |
551 | case VFALSE: { | ||
552 | if (!hasjumps(e)) { | ||
553 | pc = luaK_jump(fs); /* always jump */ | ||
554 | break; | ||
555 | } | ||
556 | /* else go through */ | ||
557 | } | ||
555 | default: { | 558 | default: { |
556 | pc = jumponcond(fs, e, 0); | 559 | pc = jumponcond(fs, e, 0); |
557 | break; | 560 | break; |
@@ -571,14 +574,17 @@ static void luaK_goiffalse (FuncState *fs, expdesc *e) { | |||
571 | pc = NO_JUMP; /* always false; do nothing */ | 574 | pc = NO_JUMP; /* always false; do nothing */ |
572 | break; | 575 | break; |
573 | } | 576 | } |
574 | case VTRUE: { | ||
575 | pc = luaK_jump(fs); /* always jump */ | ||
576 | break; | ||
577 | } | ||
578 | case VJMP: { | 577 | case VJMP: { |
579 | pc = e->u.s.info; | 578 | pc = e->u.s.info; |
580 | break; | 579 | break; |
581 | } | 580 | } |
581 | case VTRUE: { | ||
582 | if (!hasjumps(e)) { | ||
583 | pc = luaK_jump(fs); /* always jump */ | ||
584 | break; | ||
585 | } | ||
586 | /* else go through */ | ||
587 | } | ||
582 | default: { | 588 | default: { |
583 | pc = jumponcond(fs, e, 1); | 589 | pc = jumponcond(fs, e, 1); |
584 | break; | 590 | break; |