diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-05-12 18:22:05 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-05-12 18:22:05 -0300 |
commit | 27d9219cf3649a195fdf7a2211efcb704cf3bffc (patch) | |
tree | c7dbf7d2ffdca97e0907fbd6083514e784f4dc0b /lvm.c | |
parent | 12bd01c56710d957e28bea41aab9f9b98182e72b (diff) | |
download | lua-27d9219cf3649a195fdf7a2211efcb704cf3bffc.tar.gz lua-27d9219cf3649a195fdf7a2211efcb704cf3bffc.tar.bz2 lua-27d9219cf3649a195fdf7a2211efcb704cf3bffc.zip |
no more integer exponentiation
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 25 |
1 files changed, 2 insertions, 23 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 2.206 2014/05/09 14:20:52 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.207 2014/05/12 19:13:32 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 | */ |
@@ -480,22 +480,6 @@ lua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) { | |||
480 | } | 480 | } |
481 | 481 | ||
482 | 482 | ||
483 | lua_Integer luaV_pow (lua_Integer m, lua_Integer n) { | ||
484 | lua_assert(n >= 0); | ||
485 | if (n == 0) | ||
486 | return 1; /* m^0 == 1 */ | ||
487 | else { | ||
488 | lua_Integer r = 1; | ||
489 | for (; n > 1; n >>= 1) { | ||
490 | if (n & 1) r = intop(*, r, m); | ||
491 | m = intop(*, m, m); | ||
492 | } | ||
493 | r = intop(*, r, m); | ||
494 | return r; | ||
495 | } | ||
496 | } | ||
497 | |||
498 | |||
499 | /* number of bits in an integer */ | 483 | /* number of bits in an integer */ |
500 | #define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) | 484 | #define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) |
501 | 485 | ||
@@ -869,12 +853,7 @@ void luaV_execute (lua_State *L) { | |||
869 | TValue *rb = RKB(i); | 853 | TValue *rb = RKB(i); |
870 | TValue *rc = RKC(i); | 854 | TValue *rc = RKC(i); |
871 | lua_Number nb; lua_Number nc; | 855 | lua_Number nb; lua_Number nc; |
872 | lua_Integer ic; | 856 | if (tonumber(rb, &nb) && tonumber(rc, &nc)) { |
873 | if (ttisinteger(rb) && ttisinteger(rc) && (ic = ivalue(rc)) >= 0) { | ||
874 | lua_Integer ib = ivalue(rb); | ||
875 | setivalue(ra, luaV_pow(ib, ic)); | ||
876 | } | ||
877 | else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { | ||
878 | setfltvalue(ra, luai_numpow(L, nb, nc)); | 857 | setfltvalue(ra, luai_numpow(L, nb, nc)); |
879 | } | 858 | } |
880 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); } | 859 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); } |