summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2006-03-21 16:28:49 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2006-03-21 16:28:49 -0300
commit1ae0b6c0bf9c389bcf9bdf266591cb1e17e80a15 (patch)
tree2c9d090fe0c4c7e8e1486e43bc24fd6bddfc0ddb
parente1dda047b24600e67796279337db4be1d01cb673 (diff)
downloadlua-github-1ae0b6c0bf9c389bcf9bdf266591cb1e17e80a15.tar.gz
BUG: should copy the union, not (some of) its fields
-rw-r--r--bugs42
-rw-r--r--lcode.c14
2 files changed, 48 insertions, 8 deletions
diff --git a/bugs b/bugs
index 27bf71d0..e9ea6b73 100644
--- a/bugs
+++ b/bugs
@@ -797,3 +797,45 @@ patch = [[
}
+
+
+-----------------------------------------------------------------
+-- Lua 5.1
+
+Bug{
+what = [[In 16-bit machines, expressions and/or with numeric constants as the
+right operand may result in weird values]],
+
+report = [[Andreas Stenius, 15/03/2006]],
+
+example = [[
+print(false or 0) -- on 16-bit machines
+]],
+
+patch = [[
+* lcode.c:
+@@ -731,17 +731,15 @@
+ case OPR_AND: {
+ lua_assert(e1->t == NO_JUMP); /* list must be closed */
+ luaK_dischargevars(fs, e2);
+- luaK_concat(fs, &e1->f, e2->f);
+- e1->k = e2->k; e1->u.s.info = e2->u.s.info;
+- e1->u.s.aux = e2->u.s.aux; e1->t = e2->t;
++ luaK_concat(fs, &e2->f, e1->f);
++ *e1 = *e2;
+ break;
+ }
+ case OPR_OR: {
+ lua_assert(e1->f == NO_JUMP); /* list must be closed */
+ luaK_dischargevars(fs, e2);
+- luaK_concat(fs, &e1->t, e2->t);
+- e1->k = e2->k; e1->u.s.info = e2->u.s.info;
+- e1->u.s.aux = e2->u.s.aux; e1->f = e2->f;
++ luaK_concat(fs, &e2->t, e1->t);
++ *e1 = *e2;
+ break;
+ }
+]],
+
+}
+
diff --git a/lcode.c b/lcode.c
index feaad660..b8ba2a98 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
/*
-** $Id: lcode.c,v 2.23 2005/11/25 13:29:32 roberto Exp roberto $
+** $Id: lcode.c,v 2.24 2005/12/22 16:19:56 roberto Exp roberto $
** Code generator for Lua
** See Copyright Notice in lua.h
*/
@@ -731,17 +731,15 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
case OPR_AND: {
lua_assert(e1->t == NO_JUMP); /* list must be closed */
luaK_dischargevars(fs, e2);
- luaK_concat(fs, &e1->f, e2->f);
- e1->k = e2->k; e1->u.s.info = e2->u.s.info;
- e1->u.s.aux = e2->u.s.aux; e1->t = e2->t;
+ luaK_concat(fs, &e2->f, e1->f);
+ *e1 = *e2;
break;
}
case OPR_OR: {
lua_assert(e1->f == NO_JUMP); /* list must be closed */
luaK_dischargevars(fs, e2);
- luaK_concat(fs, &e1->t, e2->t);
- e1->k = e2->k; e1->u.s.info = e2->u.s.info;
- e1->u.s.aux = e2->u.s.aux; e1->f = e2->f;
+ luaK_concat(fs, &e2->t, e1->t);
+ *e1 = *e2;
break;
}
case OPR_CONCAT: {
@@ -750,7 +748,7 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1);
freeexp(fs, e1);
SETARG_B(getcode(fs, e2), e1->u.s.info);
- e1->k = e2->k; e1->u.s.info = e2->u.s.info;
+ e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info;
}
else {
luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */