summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-04-27 11:41:11 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-04-27 11:41:11 -0300
commite98ba351cebaec72f56acceddd82338cc37c3265 (patch)
treeed72629b9b4002fea51848d49b8b56310ca37d8d
parentcbe4998bc29d5b98636f39cad5812c77a4fc2d77 (diff)
downloadlua-e98ba351cebaec72f56acceddd82338cc37c3265.tar.gz
lua-e98ba351cebaec72f56acceddd82338cc37c3265.tar.bz2
lua-e98ba351cebaec72f56acceddd82338cc37c3265.zip
n^-m gives float result (instead of error)
-rw-r--r--lcode.c4
-rw-r--r--lobject.c7
-rw-r--r--lvm.c17
-rw-r--r--lvm.h4
4 files changed, 15 insertions, 17 deletions
diff --git a/lcode.c b/lcode.c
index 52ef2615..b9e2c6f0 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 2.86 2014/04/01 14:39:55 roberto Exp roberto $ 2** $Id: lcode.c,v 2.87 2014/04/02 16:44:42 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*/
@@ -768,8 +768,6 @@ static int validop (int op, TValue *v1, TValue *v2) {
768 return (tointeger(v1, &i) && tointeger(v2, &i)); 768 return (tointeger(v1, &i) && tointeger(v2, &i));
769 case LUA_OPMOD: /* integer module by 0 */ 769 case LUA_OPMOD: /* integer module by 0 */
770 return !(ttisinteger(v1) && ttisinteger(v2) && ivalue(v2) == 0); 770 return !(ttisinteger(v1) && ttisinteger(v2) && ivalue(v2) == 0);
771 case LUA_OPPOW: /* negative integer exponentiation */
772 return !(ttisinteger(v1) && ttisinteger(v2) && ivalue(v2) < 0);
773 default: return 1; /* everything else is valid */ 771 default: return 1; /* everything else is valid */
774 } 772 }
775} 773}
diff --git a/lobject.c b/lobject.c
index 2c437527..bfdb51dd 100644
--- a/lobject.c
+++ b/lobject.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.c,v 2.79 2014/04/15 14:28:20 roberto Exp roberto $ 2** $Id: lobject.c,v 2.80 2014/04/15 16:32:49 roberto Exp roberto $
3** Some generic functions over Lua objects 3** Some generic functions over Lua objects
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -77,7 +77,7 @@ static lua_Integer intarith (lua_State *L, int op, lua_Integer v1,
77 case LUA_OPSUB:return intop(-, v1, v2); 77 case LUA_OPSUB:return intop(-, v1, v2);
78 case LUA_OPMUL:return intop(*, v1, v2); 78 case LUA_OPMUL:return intop(*, v1, v2);
79 case LUA_OPMOD: return luaV_mod(L, v1, v2); 79 case LUA_OPMOD: return luaV_mod(L, v1, v2);
80 case LUA_OPPOW: return luaV_pow(L, v1, v2); 80 case LUA_OPPOW: return luaV_pow(v1, v2);
81 case LUA_OPIDIV: return luaV_div(L, v1, v2); 81 case LUA_OPIDIV: return luaV_div(L, v1, v2);
82 case LUA_OPBAND: return intop(&, v1, v2); 82 case LUA_OPBAND: return intop(&, v1, v2);
83 case LUA_OPBOR: return intop(|, v1, v2); 83 case LUA_OPBOR: return intop(|, v1, v2);
@@ -133,7 +133,8 @@ void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2,
133 } 133 }
134 default: { /* other operations */ 134 default: { /* other operations */
135 lua_Number n1; lua_Number n2; 135 lua_Number n1; lua_Number n2;
136 if (ttisinteger(p1) && ttisinteger(p2)) { 136 if (ttisinteger(p1) && ttisinteger(p2) &&
137 (op != LUA_OPPOW || ivalue(p2) >= 0)) {
137 setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2))); 138 setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2)));
138 return; 139 return;
139 } 140 }
diff --git a/lvm.c b/lvm.c
index 653e6a16..c85349d6 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.197 2014/04/15 14:28:20 roberto Exp roberto $ 2** $Id: lvm.c,v 2.198 2014/04/15 16:32:49 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -374,12 +374,10 @@ lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y) {
374} 374}
375 375
376 376
377lua_Integer luaV_pow (lua_State *L, lua_Integer x, lua_Integer y) { 377lua_Integer luaV_pow (lua_Integer x, lua_Integer y) {
378 if (y <= 0) { /* special cases: 0 or negative exponent */ 378 lua_assert(y >= 0);
379 if (y < 0) 379 if (y == 0)
380 luaG_runerror(L, "integer exponentiation with negative exponent");
381 return 1; /* x^0 == 1 */ 380 return 1; /* x^0 == 1 */
382 }
383 else { 381 else {
384 lua_Integer r = 1; 382 lua_Integer r = 1;
385 for (; y > 1; y >>= 1) { 383 for (; y > 1; y >>= 1) {
@@ -765,9 +763,10 @@ void luaV_execute (lua_State *L) {
765 TValue *rb = RKB(i); 763 TValue *rb = RKB(i);
766 TValue *rc = RKC(i); 764 TValue *rc = RKC(i);
767 lua_Number nb; lua_Number nc; 765 lua_Number nb; lua_Number nc;
768 if (ttisinteger(rb) && ttisinteger(rc)) { 766 lua_Integer ic;
769 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 767 if (ttisinteger(rb) && ttisinteger(rc) && (ic = ivalue(rc)) >= 0) {
770 setivalue(ra, luaV_pow(L, ib, ic)); 768 lua_Integer ib = ivalue(rb);
769 setivalue(ra, luaV_pow(ib, ic));
771 } 770 }
772 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 771 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
773 setnvalue(ra, luai_numpow(L, nb, nc)); 772 setnvalue(ra, luai_numpow(L, nb, nc));
diff --git a/lvm.h b/lvm.h
index 669cf391..548fba66 100644
--- a/lvm.h
+++ b/lvm.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.h,v 2.27 2014/04/15 14:28:20 roberto Exp roberto $ 2** $Id: lvm.h,v 2.28 2014/04/15 16:32:49 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -40,7 +40,7 @@ LUAI_FUNC void luaV_execute (lua_State *L);
40LUAI_FUNC void luaV_concat (lua_State *L, int total); 40LUAI_FUNC void luaV_concat (lua_State *L, int total);
41LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y); 41LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y);
42LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y); 42LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y);
43LUAI_FUNC lua_Integer luaV_pow (lua_State *L, lua_Integer x, lua_Integer y); 43LUAI_FUNC lua_Integer luaV_pow (lua_Integer x, lua_Integer y);
44LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y); 44LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y);
45LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb); 45LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb);
46 46