diff options
-rw-r--r-- | lvm.c | 17 | ||||
-rw-r--r-- | lvm.h | 4 |
2 files changed, 11 insertions, 10 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 2.166 2013/04/26 19:51:17 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.167 2013/04/29 17:12:50 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 | */ |
@@ -327,7 +327,7 @@ lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y) { | |||
327 | lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y) { | 327 | lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y) { |
328 | if (cast_unsigned(y) + 1 <= 1U) { /* special cases: -1 or 0 */ | 328 | if (cast_unsigned(y) + 1 <= 1U) { /* special cases: -1 or 0 */ |
329 | if (y == 0) | 329 | if (y == 0) |
330 | luaG_runerror(L, "attempt to divide by zero (in '%%')"); | 330 | luaG_runerror(L, "attempt to perform 'n%%0'"); |
331 | else /* -1 */ | 331 | else /* -1 */ |
332 | return 0; /* avoid overflow with 0x80000... */ | 332 | return 0; /* avoid overflow with 0x80000... */ |
333 | } | 333 | } |
@@ -346,11 +346,10 @@ lua_Integer luaV_pow (lua_Integer x, lua_Integer y) { | |||
346 | lua_assert(y >= 0); | 346 | lua_assert(y >= 0); |
347 | if (y == 0) return r; | 347 | if (y == 0) return r; |
348 | for (; y > 1; y >>= 1) { | 348 | for (; y > 1; y >>= 1) { |
349 | if (y & 1) | 349 | if (y & 1) r = intop(*, r, x); |
350 | r = cast_integer(cast_unsigned(r) * cast_unsigned(x)); | 350 | x = intop(*, x, x); |
351 | x = cast_integer(cast_unsigned(x) * cast_unsigned(x)); | ||
352 | } | 351 | } |
353 | r = cast_integer(cast_unsigned(r) * cast_unsigned(x)); | 352 | r = intop(*, r, x); |
354 | return r; | 353 | return r; |
355 | } | 354 | } |
356 | 355 | ||
@@ -594,7 +593,7 @@ void luaV_execute (lua_State *L) { | |||
594 | lua_Number nb; lua_Number nc; | 593 | lua_Number nb; lua_Number nc; |
595 | if (ttisinteger(rb) && ttisinteger(rc)) { | 594 | if (ttisinteger(rb) && ttisinteger(rc)) { |
596 | lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); | 595 | lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); |
597 | setivalue(ra, cast_integer(cast_unsigned(ib) + cast_unsigned(ic))); | 596 | setivalue(ra, intop(+, ib, ic)); |
598 | } | 597 | } |
599 | else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { | 598 | else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { |
600 | setnvalue(ra, luai_numadd(L, nb, nc)); | 599 | setnvalue(ra, luai_numadd(L, nb, nc)); |
@@ -607,7 +606,7 @@ void luaV_execute (lua_State *L) { | |||
607 | lua_Number nb; lua_Number nc; | 606 | lua_Number nb; lua_Number nc; |
608 | if (ttisinteger(rb) && ttisinteger(rc)) { | 607 | if (ttisinteger(rb) && ttisinteger(rc)) { |
609 | lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); | 608 | lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); |
610 | setivalue(ra, cast_integer(cast_unsigned(ib) - cast_unsigned(ic))); | 609 | setivalue(ra, intop(-, ib, ic)); |
611 | } | 610 | } |
612 | else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { | 611 | else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { |
613 | setnvalue(ra, luai_numsub(L, nb, nc)); | 612 | setnvalue(ra, luai_numsub(L, nb, nc)); |
@@ -620,7 +619,7 @@ void luaV_execute (lua_State *L) { | |||
620 | lua_Number nb; lua_Number nc; | 619 | lua_Number nb; lua_Number nc; |
621 | if (ttisinteger(rb) && ttisinteger(rc)) { | 620 | if (ttisinteger(rb) && ttisinteger(rc)) { |
622 | lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); | 621 | lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); |
623 | setivalue(ra, cast_integer(cast_unsigned(ib) * cast_unsigned(ic))); | 622 | setivalue(ra, intop(*, ib, ic)); |
624 | } | 623 | } |
625 | else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { | 624 | else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { |
626 | setnvalue(ra, luai_nummul(L, nb, nc)); | 625 | setnvalue(ra, luai_nummul(L, nb, nc)); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.h,v 2.21 2013/04/26 16:03:50 roberto Exp roberto $ | 2 | ** $Id: lvm.h,v 2.22 2013/04/29 17:12:50 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 | */ |
@@ -21,6 +21,8 @@ | |||
21 | #define tointeger(o,i) \ | 21 | #define tointeger(o,i) \ |
22 | (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger_(o,i)) | 22 | (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger_(o,i)) |
23 | 23 | ||
24 | #define intop(op,v1,v2) \ | ||
25 | cast_integer(cast_unsigned(v1) op cast_unsigned(v2)) | ||
24 | 26 | ||
25 | #define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2) | 27 | #define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2) |
26 | 28 | ||