diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c index 7950038ce..f987bb054 100644 --- a/src/hlua_fcn.c +++ b/src/hlua_fcn.c @@ -9,43 +9,40 @@ #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; + int ret; /* Check if the stack entry is an array. */ if (!lua_istable(L, ud)) - WILL_LJMP(luaL_argerror(L, ud, NULL)); + luaL_argerror(L, ud, NULL); + + /* pop the metatable of the referencecd object. */ + if (!lua_getmetatable(L, ud)) + luaL_argerror(L, ud, NULL); + + /* pop the expected metatable. */ + lua_rawgeti(L, LUA_REGISTRYINDEX, class_ref); + /* Check if the metadata have the expected type. */ - if (!hlua_metaistype(L, ud, class_ref)) - WILL_LJMP(luaL_argerror(L, ud, NULL)); + ret = lua_rawequal(L, -1, -2); + lua_pop(L, 2); + if (!ret) + 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)); + luaL_argerror(L, ud, NULL); + /* Remove the entry returned by lua_rawgeti(). */ lua_pop(L, 1); + /* Return the associated struct. */ return p; }