From c6b64ffe65549b179bfa565e8329430857e335ee Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 25 Oct 2010 18:31:11 -0200 Subject: new type lua_Unsigned and corresponding projection/injection functions --- lbitlib.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) (limited to 'lbitlib.c') diff --git a/lbitlib.c b/lbitlib.c index 3bebccd5..7d7de63c 100644 --- a/lbitlib.c +++ b/lbitlib.c @@ -1,5 +1,5 @@ /* -** $Id: lbitlib.c,v 1.6 2010/07/02 12:01:53 roberto Exp roberto $ +** $Id: lbitlib.c,v 1.7 2010/10/25 14:32:36 roberto Exp roberto $ ** Standard library for bitwise operations ** See Copyright Notice in lua.h */ @@ -21,14 +21,7 @@ typedef LUA_INT32 b_int; typedef unsigned LUA_INT32 b_uint; -static b_uint getuintarg (lua_State *L, int arg) { - b_uint r; - int isnum; - lua_Number x = lua_tonumberx(L, arg, &isnum); - if (!isnum) luaL_typeerror(L, arg, "number"); - lua_number2uint(r, x); - return r; -} +#define getuintarg(L,arg) luaL_checkunsigned(L,arg) static b_uint andaux (lua_State *L) { @@ -42,7 +35,7 @@ static b_uint andaux (lua_State *L) { static int b_and (lua_State *L) { b_uint r = andaux(L); - lua_pushnumber(L, lua_uint2number(r)); + lua_pushunsigned(L, r); return 1; } @@ -59,7 +52,7 @@ static int b_or (lua_State *L) { b_uint r = 0; for (i = 1; i <= n; i++) r |= getuintarg(L, i); - lua_pushnumber(L, lua_uint2number(r)); + lua_pushunsigned(L, r); return 1; } @@ -69,14 +62,14 @@ static int b_xor (lua_State *L) { b_uint r = 0; for (i = 1; i <= n; i++) r ^= getuintarg(L, i); - lua_pushnumber(L, lua_uint2number(r)); + lua_pushunsigned(L, r); return 1; } static int b_not (lua_State *L) { b_uint r = ~getuintarg(L, 1); - lua_pushnumber(L, lua_uint2number(r)); + lua_pushunsigned(L, r); return 1; } @@ -91,7 +84,7 @@ static int b_shift (lua_State *L, b_uint r, int i) { if (i >= NBITS) r = 0; else r <<= i; } - lua_pushnumber(L, lua_uint2number(r)); + lua_pushunsigned(L, r); return 1; } @@ -115,7 +108,7 @@ static int b_arshift (lua_State *L) { if (i >= NBITS) r = 0xffffffff; else r = (r >> i) | ~(~(b_uint)0 >> i); /* add signal bit */ - lua_pushnumber(L, lua_uint2number(r)); + lua_pushunsigned(L, r); return 1; } } @@ -125,7 +118,7 @@ static int b_rot (lua_State *L, int i) { b_uint r = getuintarg(L, 1); i &= (NBITS - 1); /* i = i % NBITS */ r = (r << i) | (r >> (NBITS - i)); - lua_pushnumber(L, lua_uint2number(r)); + lua_pushunsigned(L, r); return 1; } -- cgit v1.2.3-55-g6feb