aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
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 /lvm.c
parentcbe4998bc29d5b98636f39cad5812c77a4fc2d77 (diff)
downloadlua-e98ba351cebaec72f56acceddd82338cc37c3265.tar.gz
lua-e98ba351cebaec72f56acceddd82338cc37c3265.tar.bz2
lua-e98ba351cebaec72f56acceddd82338cc37c3265.zip
n^-m gives float result (instead of error)
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c17
1 files changed, 8 insertions, 9 deletions
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));