mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-29 06:40:59 +01:00
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.
This commit is contained in:
parent
1550d5d035
commit
9e7e3ea991
@ -1,6 +1,7 @@
|
|||||||
#ifndef _PROTO_HLUA_FCN_H
|
#ifndef _PROTO_HLUA_FCN_H
|
||||||
#define _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);
|
int hlua_fcn_reg_core_fcn(lua_State *L);
|
||||||
|
|
||||||
#endif /* _PROTO_HLUA_FCN_H */
|
#endif /* _PROTO_HLUA_FCN_H */
|
||||||
|
|||||||
41
src/hlua.c
41
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));
|
WILL_LJMP(luaL_error(L, "'%s' needs %d arguments", fcn, nb));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return true if the data in stack[<ud>] is an object of
|
|
||||||
* type <class_ref>.
|
|
||||||
*/
|
|
||||||
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
|
/* This fucntion push an error string prefixed by the file name
|
||||||
* and the line number where the error is encountered.
|
* and the line number where the error is encountered.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -9,6 +9,47 @@
|
|||||||
|
|
||||||
#include <common/time.h>
|
#include <common/time.h>
|
||||||
|
|
||||||
|
/* Return true if the data in stack[<ud>] is an object of
|
||||||
|
* type <class_ref>.
|
||||||
|
*/
|
||||||
|
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. */
|
/* This function return the current date at epoch format in milliseconds. */
|
||||||
int hlua_now(lua_State *L)
|
int hlua_now(lua_State *L)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user