aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-04-16 15:39:37 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-04-16 15:39:37 -0300
commit44358e0206c3ec034a6a06e7ad4dc5e254874201 (patch)
treeb788ec40ad25d4a6722ff5b30812a383a5cd1721
parent07f861385eaa0073af98261ae2919ad9bbce813c (diff)
downloadlua-44358e0206c3ec034a6a06e7ad4dc5e254874201.tar.gz
lua-44358e0206c3ec034a6a06e7ad4dc5e254874201.tar.bz2
lua-44358e0206c3ec034a6a06e7ad4dc5e254874201.zip
extra trim applied to 'replace' argument (in case lua_Unsigned is
larger than 32 bits)
-rw-r--r--lbitlib.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/lbitlib.c b/lbitlib.c
index 8650dc34..faba3c6d 100644
--- a/lbitlib.c
+++ b/lbitlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbitlib.c,v 1.17 2013/02/21 13:44:53 roberto Exp roberto $ 2** $Id: lbitlib.c,v 1.18 2013/03/19 13:19:12 roberto Exp roberto $
3** Standard library for bitwise operations 3** Standard library for bitwise operations
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -19,7 +19,12 @@
19#endif 19#endif
20 20
21 21
22#define ALLONES (~(((~(lua_Unsigned)0) << (LUA_NBITS - 1)) << 1)) 22/* type with (at least) LUA_NBITS bits */
23typedef unsigned long b_uint;
24
25
26#define ALLONES (~(((~(b_uint)0) << (LUA_NBITS - 1)) << 1))
27
23 28
24/* macro to trim extra bits */ 29/* macro to trim extra bits */
25#define trim(x) ((x) & ALLONES) 30#define trim(x) ((x) & ALLONES)
@@ -29,9 +34,6 @@
29#define mask(n) (~((ALLONES << 1) << ((n) - 1))) 34#define mask(n) (~((ALLONES << 1) << ((n) - 1)))
30 35
31 36
32typedef lua_Unsigned b_uint;
33
34
35 37
36static b_uint andaux (lua_State *L) { 38static b_uint andaux (lua_State *L) {
37 int i, n = lua_gettop(L); 39 int i, n = lua_gettop(L);
@@ -165,7 +167,7 @@ static int fieldargs (lua_State *L, int farg, int *width) {
165 167
166static int b_extract (lua_State *L) { 168static int b_extract (lua_State *L) {
167 int w; 169 int w;
168 b_uint r = luaL_checkunsigned(L, 1); 170 b_uint r = trim(luaL_checkunsigned(L, 1));
169 int f = fieldargs(L, 2, &w); 171 int f = fieldargs(L, 2, &w);
170 r = (r >> f) & mask(w); 172 r = (r >> f) & mask(w);
171 lua_pushunsigned(L, r); 173 lua_pushunsigned(L, r);