From: Thierry Fournier Date: Wed, 27 Jan 2016 08:55:30 +0000 (+0100) Subject: MINOR: lua: move common function X-Git-Tag: v1.7-dev2~100 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9e7e3ea991bc8b4fb16b268d2268747059ddd993;p=thirdparty%2Fhaproxy.git MINOR: lua: move common function This patch moves the function hlua_checkudata which check that an object contains the expected class_reference as metatable. This function is commonly used by all the lua functions. The function hlua_metatype is also moved. --- diff --git a/include/proto/hlua_fcn.h b/include/proto/hlua_fcn.h index 37d07ffa05..179d40cc3c 100644 --- a/include/proto/hlua_fcn.h +++ b/include/proto/hlua_fcn.h @@ -1,6 +1,7 @@ #ifndef _PROTO_HLUA_FCN_H #define _PROTO_HLUA_FCN_H +void *hlua_checkudata(lua_State *L, int ud, int class_ref); int hlua_fcn_reg_core_fcn(lua_State *L); #endif /* _PROTO_HLUA_FCN_H */ diff --git a/src/hlua.c b/src/hlua.c index b4b8980e55..11117205d8 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -306,47 +306,6 @@ __LJMP static inline void check_args(lua_State *L, int nb, char *fcn) WILL_LJMP(luaL_error(L, "'%s' needs %d arguments", fcn, nb)); } -/* Return true if the data in stack[] is an object of - * type . - */ -static int hlua_metaistype(lua_State *L, int ud, int class_ref) -{ - if (!lua_getmetatable(L, ud)) - return 0; - - lua_rawgeti(L, LUA_REGISTRYINDEX, class_ref); - if (!lua_rawequal(L, -1, -2)) { - lua_pop(L, 2); - return 0; - } - - lua_pop(L, 2); - return 1; -} - -/* Return an object of the expected type, or throws an error. */ -__LJMP static void *hlua_checkudata(lua_State *L, int ud, int class_ref) -{ - void *p; - - /* Check if the stack entry is an array. */ - if (!lua_istable(L, ud)) - WILL_LJMP(luaL_argerror(L, ud, NULL)); - /* Check if the metadata have the expected type. */ - if (!hlua_metaistype(L, ud, class_ref)) - WILL_LJMP(luaL_argerror(L, ud, NULL)); - /* Push on the stack at the entry [0] of the table. */ - lua_rawgeti(L, ud, 0); - /* Check if this entry is userdata. */ - p = lua_touserdata(L, -1); - if (!p) - WILL_LJMP(luaL_argerror(L, ud, NULL)); - /* Remove the entry returned by lua_rawgeti(). */ - lua_pop(L, 1); - /* Return the associated struct. */ - return p; -} - /* This fucntion push an error string prefixed by the file name * and the line number where the error is encountered. */ diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c index a35ccfafe0..7950038cef 100644 --- a/src/hlua_fcn.c +++ b/src/hlua_fcn.c @@ -9,6 +9,47 @@ #include +/* Return true if the data in stack[] is an object of + * type . + */ +static int hlua_metaistype(lua_State *L, int ud, int class_ref) +{ + if (!lua_getmetatable(L, ud)) + return 0; + + lua_rawgeti(L, LUA_REGISTRYINDEX, class_ref); + if (!lua_rawequal(L, -1, -2)) { + lua_pop(L, 2); + return 0; + } + + lua_pop(L, 2); + return 1; +} + +/* Return an object of the expected type, or throws an error. */ +void *hlua_checkudata(lua_State *L, int ud, int class_ref) +{ + void *p; + + /* Check if the stack entry is an array. */ + if (!lua_istable(L, ud)) + WILL_LJMP(luaL_argerror(L, ud, NULL)); + /* Check if the metadata have the expected type. */ + if (!hlua_metaistype(L, ud, class_ref)) + WILL_LJMP(luaL_argerror(L, ud, NULL)); + /* Push on the stack at the entry [0] of the table. */ + lua_rawgeti(L, ud, 0); + /* Check if this entry is userdata. */ + p = lua_touserdata(L, -1); + if (!p) + WILL_LJMP(luaL_argerror(L, ud, NULL)); + /* Remove the entry returned by lua_rawgeti(). */ + lua_pop(L, 1); + /* Return the associated struct. */ + return p; +} + /* This function return the current date at epoch format in milliseconds. */ int hlua_now(lua_State *L) {