浏览代码

new type lua_Unsigned and corresponding projection/injection functions

Roberto Ierusalimschy 14 年之前
父节点
当前提交
c6b64ffe65
共有 6 个文件被更改,包括 66 次插入22 次删除
  1. 28 1
      lapi.c
  2. 16 1
      lauxlib.c
  3. 4 1
      lauxlib.h
  4. 9 16
      lbitlib.c
  5. 2 2
      lmathlib.c
  6. 7 1
      lua.h

+ 28 - 1
lapi.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lapi.c,v 2.137 2010/09/07 19:35:04 roberto Exp roberto $
+** $Id: lapi.c,v 2.138 2010/10/25 19:01:37 roberto Exp roberto $
 ** Lua API
 ** Lua API
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -347,6 +347,23 @@ LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum) {
 }
 }
 
 
 
 
+LUA_API lua_Unsigned lua_tounsignedx (lua_State *L, int idx, int *isnum) {
+  TValue n;
+  const TValue *o = index2addr(L, idx);
+  if (tonumber(o, &n)) {
+    lua_Unsigned res;
+    lua_Number num = nvalue(o);
+    lua_number2uint(res, num);
+    if (isnum) *isnum = 1;
+    return res;
+  }
+  else {
+    if (isnum) *isnum = 0;
+    return 0;
+  }
+}
+
+
 LUA_API int lua_toboolean (lua_State *L, int idx) {
 LUA_API int lua_toboolean (lua_State *L, int idx) {
   const TValue *o = index2addr(L, idx);
   const TValue *o = index2addr(L, idx);
   return !l_isfalse(o);
   return !l_isfalse(o);
@@ -452,6 +469,16 @@ LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
 }
 }
 
 
 
 
+LUA_API void lua_pushunsigned (lua_State *L, lua_Unsigned u) {
+  lua_Number n;
+  lua_lock(L);
+  n = lua_uint2number(u);
+  setnvalue(L->top, n);
+  api_incr_top(L);
+  lua_unlock(L);
+}
+
+
 LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) {
 LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) {
   TString *ts;
   TString *ts;
   lua_lock(L);
   lua_lock(L);

+ 16 - 1
lauxlib.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lauxlib.c,v 1.221 2010/10/01 18:53:00 roberto Exp roberto $
+** $Id: lauxlib.c,v 1.222 2010/10/25 19:01:37 roberto Exp roberto $
 ** Auxiliary functions for building Lua libraries
 ** Auxiliary functions for building Lua libraries
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -330,11 +330,26 @@ LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) {
 }
 }
 
 
 
 
+LUALIB_API lua_Unsigned luaL_checkunsigned (lua_State *L, int narg) {
+  int isnum;
+  lua_Unsigned d = lua_tounsignedx(L, narg, &isnum);
+  if (!isnum)
+    tag_error(L, narg, LUA_TNUMBER);
+  return d;
+}
+
+
 LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,
 LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,
                                                       lua_Integer def) {
                                                       lua_Integer def) {
   return luaL_opt(L, luaL_checkinteger, narg, def);
   return luaL_opt(L, luaL_checkinteger, narg, def);
 }
 }
 
 
+
+LUALIB_API lua_Unsigned luaL_optunsigned (lua_State *L, int narg,
+                                                        lua_Unsigned def) {
+  return luaL_opt(L, luaL_checkunsigned, narg, def);
+}
+
 /* }====================================================== */
 /* }====================================================== */
 
 
 
 

+ 4 - 1
lauxlib.h

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lauxlib.h,v 1.107 2010/06/30 17:40:27 roberto Exp roberto $
+** $Id: lauxlib.h,v 1.108 2010/07/02 11:38:13 roberto Exp roberto $
 ** Auxiliary functions for building Lua libraries
 ** Auxiliary functions for building Lua libraries
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -44,6 +44,9 @@ LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);
 LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);
 LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);
 LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
 LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
                                           lua_Integer def);
                                           lua_Integer def);
+LUALIB_API lua_Unsigned (luaL_checkunsigned) (lua_State *L, int numArg);
+LUALIB_API lua_Unsigned (luaL_optunsigned) (lua_State *L, int numArg,
+                                            lua_Unsigned def);
 
 
 LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
 LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
 LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);
 LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);

+ 9 - 16
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
 ** Standard library for bitwise operations
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -21,14 +21,7 @@ typedef LUA_INT32 b_int;
 typedef unsigned LUA_INT32 b_uint;
 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) {
 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) {
 static int b_and (lua_State *L) {
   b_uint r = andaux(L);
   b_uint r = andaux(L);
-  lua_pushnumber(L, lua_uint2number(r));
+  lua_pushunsigned(L, r);
   return 1;
   return 1;
 }
 }
 
 
@@ -59,7 +52,7 @@ static int b_or (lua_State *L) {
   b_uint r = 0;
   b_uint r = 0;
   for (i = 1; i <= n; i++)
   for (i = 1; i <= n; i++)
     r |= getuintarg(L, i);
     r |= getuintarg(L, i);
-  lua_pushnumber(L, lua_uint2number(r));
+  lua_pushunsigned(L, r);
   return 1;
   return 1;
 }
 }
 
 
@@ -69,14 +62,14 @@ static int b_xor (lua_State *L) {
   b_uint r = 0;
   b_uint r = 0;
   for (i = 1; i <= n; i++)
   for (i = 1; i <= n; i++)
     r ^= getuintarg(L, i);
     r ^= getuintarg(L, i);
-  lua_pushnumber(L, lua_uint2number(r));
+  lua_pushunsigned(L, r);
   return 1;
   return 1;
 }
 }
 
 
 
 
 static int b_not (lua_State *L) {
 static int b_not (lua_State *L) {
   b_uint r = ~getuintarg(L, 1);
   b_uint r = ~getuintarg(L, 1);
-  lua_pushnumber(L, lua_uint2number(r));
+  lua_pushunsigned(L, r);
   return 1;
   return 1;
 }
 }
 
 
@@ -91,7 +84,7 @@ static int b_shift (lua_State *L, b_uint r, int i) {
     if (i >= NBITS) r = 0;
     if (i >= NBITS) r = 0;
     else r <<= i;
     else r <<= i;
   }
   }
-  lua_pushnumber(L, lua_uint2number(r));
+  lua_pushunsigned(L, r);
   return 1;
   return 1;
 }
 }
 
 
@@ -115,7 +108,7 @@ static int b_arshift (lua_State *L) {
     if (i >= NBITS) r = 0xffffffff;
     if (i >= NBITS) r = 0xffffffff;
     else
     else
       r = (r >> i) | ~(~(b_uint)0 >> i);  /* add signal bit */
       r = (r >> i) | ~(~(b_uint)0 >> i);  /* add signal bit */
-    lua_pushnumber(L, lua_uint2number(r));
+    lua_pushunsigned(L, r);
     return 1;
     return 1;
   }
   }
 }
 }
@@ -125,7 +118,7 @@ static int b_rot (lua_State *L, int i) {
   b_uint r = getuintarg(L, 1);
   b_uint r = getuintarg(L, 1);
   i &= (NBITS - 1);  /* i = i % NBITS */
   i &= (NBITS - 1);  /* i = i % NBITS */
   r = (r << i) | (r >> (NBITS - i));
   r = (r << i) | (r >> (NBITS - i));
-  lua_pushnumber(L, lua_uint2number(r));
+  lua_pushunsigned(L, r);
   return 1;
   return 1;
 }
 }
 
 

+ 2 - 2
lmathlib.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lmathlib.c,v 1.74 2009/11/24 12:05:44 roberto Exp roberto $
+** $Id: lmathlib.c,v 1.75 2010/07/02 11:38:13 roberto Exp roberto $
 ** Standard mathematical library
 ** Standard mathematical library
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -220,7 +220,7 @@ static int math_random (lua_State *L) {
 
 
 
 
 static int math_randomseed (lua_State *L) {
 static int math_randomseed (lua_State *L) {
-  srand(luaL_checkint(L, 1));
+  srand(luaL_checkunsigned(L, 1));
   (void)rand(); /* discard first value to avoid undesirable correlations */
   (void)rand(); /* discard first value to avoid undesirable correlations */
   return 0;
   return 0;
 }
 }

+ 7 - 1
lua.h

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lua.h,v 1.273 2010/07/25 15:18:19 roberto Exp roberto $
+** $Id: lua.h,v 1.274 2010/09/03 14:14:01 roberto Exp roberto $
 ** Lua - A Scripting Language
 ** Lua - A Scripting Language
 ** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
 ** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
 ** See Copyright Notice at the end of this file
 ** See Copyright Notice at the end of this file
@@ -106,6 +106,9 @@ typedef LUA_NUMBER lua_Number;
 /* type for integer functions */
 /* type for integer functions */
 typedef LUA_INTEGER lua_Integer;
 typedef LUA_INTEGER lua_Integer;
 
 
+/* unsigned integer type */
+typedef unsigned LUA_INT32 lua_Unsigned;
+
 
 
 
 
 /*
 /*
@@ -159,6 +162,7 @@ LUA_API const char     *(lua_typename) (lua_State *L, int tp);
 
 
 LUA_API lua_Number      (lua_tonumberx) (lua_State *L, int idx, int *isnum);
 LUA_API lua_Number      (lua_tonumberx) (lua_State *L, int idx, int *isnum);
 LUA_API lua_Integer     (lua_tointegerx) (lua_State *L, int idx, int *isnum);
 LUA_API lua_Integer     (lua_tointegerx) (lua_State *L, int idx, int *isnum);
+LUA_API lua_Unsigned    (lua_tounsignedx) (lua_State *L, int idx, int *isnum);
 LUA_API int             (lua_toboolean) (lua_State *L, int idx);
 LUA_API int             (lua_toboolean) (lua_State *L, int idx);
 LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);
 LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);
 LUA_API size_t          (lua_rawlen) (lua_State *L, int idx);
 LUA_API size_t          (lua_rawlen) (lua_State *L, int idx);
@@ -196,6 +200,7 @@ LUA_API int   (lua_compare) (lua_State *L, int idx1, int idx2, int op);
 LUA_API void        (lua_pushnil) (lua_State *L);
 LUA_API void        (lua_pushnil) (lua_State *L);
 LUA_API void        (lua_pushnumber) (lua_State *L, lua_Number n);
 LUA_API void        (lua_pushnumber) (lua_State *L, lua_Number n);
 LUA_API void        (lua_pushinteger) (lua_State *L, lua_Integer n);
 LUA_API void        (lua_pushinteger) (lua_State *L, lua_Integer n);
+LUA_API void        (lua_pushunsigned) (lua_State *L, lua_Unsigned n);
 LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t l);
 LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t l);
 LUA_API const char *(lua_pushstring) (lua_State *L, const char *s);
 LUA_API const char *(lua_pushstring) (lua_State *L, const char *s);
 LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,
 LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,
@@ -303,6 +308,7 @@ LUA_API void      (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);
 
 
 #define lua_tonumber(L,i)	lua_tonumberx(L,i,NULL)
 #define lua_tonumber(L,i)	lua_tonumberx(L,i,NULL)
 #define lua_tointeger(L,i)	lua_tointegerx(L,i,NULL)
 #define lua_tointeger(L,i)	lua_tointegerx(L,i,NULL)
+#define lua_tounsigned(L,i)	lua_tounsignedx(L,i,NULL)
 
 
 #define lua_pop(L,n)		lua_settop(L, -(n)-1)
 #define lua_pop(L,n)		lua_settop(L, -(n)-1)