Răsfoiți Sursa

no need to check "bad conversion number->int;" in luaL_checkversion,
as now Lua does not use tricks for the conversion, but there is a
need to check the sizes of number types, as they can be different
in two modules

Roberto Ierusalimschy 12 ani în urmă
părinte
comite
66d046833d
2 a modificat fișierele cu 14 adăugiri și 16 ștergeri
  1. 6 12
      lauxlib.c
  2. 8 4
      lauxlib.h

+ 6 - 12
lauxlib.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lauxlib.c,v 1.253 2013/06/14 20:46:40 roberto Exp roberto $
+** $Id: lauxlib.c,v 1.254 2013/06/25 14:05:26 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
 */
 */
@@ -860,7 +860,6 @@ LUALIB_API void luaL_openlib (lua_State *L, const char *libname,
 ** Returns with only the table at the stack.
 ** Returns with only the table at the stack.
 */
 */
 LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
 LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
-  luaL_checkversion(L);
   luaL_checkstack(L, nup, "too many upvalues");
   luaL_checkstack(L, nup, "too many upvalues");
   for (; l->name != NULL; l++) {  /* fill the table with given functions */
   for (; l->name != NULL; l++) {  /* fill the table with given functions */
     int i;
     int i;
@@ -955,20 +954,15 @@ LUALIB_API lua_State *luaL_newstate (void) {
 }
 }
 
 
 
 
-LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver) {
+LUALIB_API void luaL_checkversion_ (lua_State *L, int ver, size_t sz) {
   const lua_Number *v = lua_version(L);
   const lua_Number *v = lua_version(L);
   if (v != lua_version(NULL))
   if (v != lua_version(NULL))
     luaL_error(L, "multiple Lua VMs detected");
     luaL_error(L, "multiple Lua VMs detected");
   else if (*v != ver)
   else if (*v != ver)
-    luaL_error(L, "version mismatch: app. needs %f, Lua core provides %f",
+    luaL_error(L, "version mismatch: app. needs %d, Lua core provides %f",
                   ver, *v);
                   ver, *v);
-  /* check conversions number -> integer types */
-  lua_pushnumber(L, -(lua_Number)0x1234);
-  lua_pushnumber(L, (lua_Number)0x4321);
-  if (lua_tointeger(L, -2) != -0x1234 ||
-      lua_tounsigned(L, -1) != (lua_Unsigned)0x4321)
-    luaL_error(L, "bad conversion number->int;"
-                  " must recompile Lua with proper settings");
-  lua_pop(L, 2);
+  /* check numeric types */
+  if (sz != LUAL_NUMSIZES)
+    luaL_error(L, "core and library have incompatible numeric types");
 }
 }
 
 

+ 8 - 4
lauxlib.h

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lauxlib.h,v 1.120 2011/11/29 15:55:08 roberto Exp roberto $
+** $Id: lauxlib.h,v 1.121 2013/06/25 14:05:26 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
 */
 */
@@ -26,8 +26,11 @@ typedef struct luaL_Reg {
 } luaL_Reg;
 } luaL_Reg;
 
 
 
 
-LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver);
-#define luaL_checkversion(L)	luaL_checkversion_(L, LUA_VERSION_NUM)
+#define LUAL_NUMSIZES	(sizeof(lua_Integer)*16 + sizeof(lua_Number))
+
+LUALIB_API void (luaL_checkversion_) (lua_State *L, int ver, size_t sz);
+#define luaL_checkversion(L)  \
+	  luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES)
 
 
 LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
 LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
 LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
 LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
@@ -108,7 +111,8 @@ LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,
 #define luaL_newlibtable(L,l)	\
 #define luaL_newlibtable(L,l)	\
   lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
   lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
 
 
-#define luaL_newlib(L,l)	(luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
+#define luaL_newlib(L,l)  \
+  (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
 
 
 #define luaL_argcheck(L, cond,numarg,extramsg)	\
 #define luaL_argcheck(L, cond,numarg,extramsg)	\
 		((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))
 		((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))