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 | |
parent | 12bd01c56710d957e28bea41aab9f9b98182e72b (diff) | |
download | lua-27d9219cf3649a195fdf7a2211efcb704cf3bffc.tar.gz lua-27d9219cf3649a195fdf7a2211efcb704cf3bffc.tar.bz2 lua-27d9219cf3649a195fdf7a2211efcb704cf3bffc.zip |
no more integer exponentiation
-rw-r--r-- | lobject.c | 8 | ||||
-rw-r--r-- | lvm.c | 25 | ||||
-rw-r--r-- | lvm.h | 3 |
3 files changed, 6 insertions, 30 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.c,v 2.83 2014/04/30 16:48:44 roberto Exp roberto $ | 2 | ** $Id: lobject.c,v 2.84 2014/05/01 18:18:06 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,6 @@ 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(v1, v2); | ||
81 | case LUA_OPIDIV: return luaV_div(L, v1, v2); | 80 | case LUA_OPIDIV: return luaV_div(L, v1, v2); |
82 | case LUA_OPBAND: return intop(&, v1, v2); | 81 | case LUA_OPBAND: return intop(&, v1, v2); |
83 | case LUA_OPBOR: return intop(|, v1, v2); | 82 | case LUA_OPBOR: return intop(|, v1, v2); |
@@ -123,7 +122,7 @@ void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, | |||
123 | } | 122 | } |
124 | else break; /* go to the end */ | 123 | else break; /* go to the end */ |
125 | } | 124 | } |
126 | case LUA_OPDIV: { /* operates only on floats */ | 125 | case LUA_OPDIV: case LUA_OPPOW: { /* operate only on floats */ |
127 | lua_Number n1; lua_Number n2; | 126 | lua_Number n1; lua_Number n2; |
128 | if (tonumber(p1, &n1) && tonumber(p2, &n2)) { | 127 | if (tonumber(p1, &n1) && tonumber(p2, &n2)) { |
129 | setfltvalue(res, numarith(L, op, n1, n2)); | 128 | setfltvalue(res, numarith(L, op, n1, n2)); |
@@ -133,8 +132,7 @@ void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, | |||
133 | } | 132 | } |
134 | default: { /* other operations */ | 133 | default: { /* other operations */ |
135 | lua_Number n1; lua_Number n2; | 134 | lua_Number n1; lua_Number n2; |
136 | if (ttisinteger(p1) && ttisinteger(p2) && | 135 | if (ttisinteger(p1) && ttisinteger(p2)) { |
137 | (op != LUA_OPPOW || ivalue(p2) >= 0)) { | ||
138 | setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2))); | 136 | setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2))); |
139 | return; | 137 | return; |
140 | } | 138 | } |
@@ -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)); } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.h,v 2.28 2014/04/15 16:32:49 roberto Exp roberto $ | 2 | ** $Id: lvm.h,v 2.29 2014/04/27 14:41:11 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,6 @@ LUAI_FUNC void luaV_execute (lua_State *L); | |||
40 | LUAI_FUNC void luaV_concat (lua_State *L, int total); | 40 | LUAI_FUNC void luaV_concat (lua_State *L, int total); |
41 | LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y); | 41 | LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y); |
42 | LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y); | 42 | LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y); |
43 | LUAI_FUNC lua_Integer luaV_pow (lua_Integer x, lua_Integer y); | ||
44 | LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y); | 43 | LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y); |
45 | LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb); | 44 | LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb); |
46 | 45 | ||