mirror of
https://github.com/lua/lua
synced 2024-11-25 22:29:39 +03:00
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
This commit is contained in:
parent
15fdbd26fe
commit
66d046833d
18
lauxlib.c
18
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
|
||||
** 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.
|
||||
*/
|
||||
LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
|
||||
luaL_checkversion(L);
|
||||
luaL_checkstack(L, nup, "too many upvalues");
|
||||
for (; l->name != NULL; l++) { /* fill the table with given functions */
|
||||
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);
|
||||
if (v != lua_version(NULL))
|
||||
luaL_error(L, "multiple Lua VMs detected");
|
||||
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);
|
||||
/* 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");
|
||||
}
|
||||
|
||||
|
12
lauxlib.h
12
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
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -26,8 +26,11 @@ typedef struct 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_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) \
|
||||
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) \
|
||||
((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))
|
||||
|
Loading…
Reference in New Issue
Block a user