diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-04-27 11:41:11 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-04-27 11:41:11 -0300 |
commit | e98ba351cebaec72f56acceddd82338cc37c3265 (patch) | |
tree | ed72629b9b4002fea51848d49b8b56310ca37d8d /lvm.c | |
parent | cbe4998bc29d5b98636f39cad5812c77a4fc2d77 (diff) | |
download | lua-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.c | 17 |
1 files changed, 8 insertions, 9 deletions
@@ -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 | ||
377 | lua_Integer luaV_pow (lua_State *L, lua_Integer x, lua_Integer y) { | 377 | lua_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)); |