static FUNC_UNUSED obj_udata *obj_udata_luacheck_internal(lua_State *L, int _index, void **obj, obj_type *type, int not_delete) { obj_udata *ud; base_caster_t caster = NULL; /* make sure it's a userdata value. */ ud = (obj_udata *)lua_touserdata(L, _index); if(ud != NULL) { /* check object type by comparing metatables. */ if(lua_getmetatable(L, _index)) { if(obj_udata_is_compatible(L, ud, obj, &(caster), type)) { lua_pop(L, 2); /* pop both metatables. */ /* apply caster function if needed. */ if(caster != NULL && *obj != NULL) { caster(obj); } /* check object pointer. */ if(*obj == NULL) { if(not_delete) { luaL_error(L, "null %s", type->name); /* object was garbage collected? */ } return NULL; } return ud; } } } if(not_delete) { luaL_typerror(L, _index, type->name); /* is not a userdata value. */ } return NULL; }
static FUNC_UNUSED obj_udata *obj_udata_luacheck_internal(lua_State *L, int _index, void **obj, obj_type *type, int not_delete) { obj_udata *ud; base_caster_t caster = NULL; /* make sure it's a userdata value. */ ud = (obj_udata *)lua_touserdata(L, _index); if(ud != NULL) { /* check object type by comparing metatables. */ if(lua_getmetatable(L, _index)) { if(obj_udata_is_compatible(L, ud, obj, &(caster), type)) { lua_pop(L, 2); /* pop both metatables. */ /* apply caster function if needed. */ if(caster != NULL && *obj != NULL) { caster(obj); } /* check object pointer. */ if(*obj == NULL) { if(not_delete) { luaL_error(L, "null %s", type->name); /* object was garbage collected? */ } return NULL; } return ud; } } } else if(!lua_isnoneornil(L, _index)) { /* handle cdata. */ /* get private table. */ lua_pushlightuserdata(L, obj_udata_private_key); lua_rawget(L, LUA_REGISTRYINDEX); /* private table. */ /* get cdata type check function from private table. */ lua_pushlightuserdata(L, type); lua_rawget(L, -2); /* check for function. */ if(!lua_isnil(L, -1)) { /* pass cdata value to type checking function. */ lua_pushvalue(L, _index); lua_call(L, 1, 1); if(!lua_isnil(L, -1)) { /* valid type get pointer from cdata. */ lua_pop(L, 2); *obj = *(void **)lua_topointer(L, _index); return ud; } lua_pop(L, 2); } else { lua_pop(L, 1); } } if(not_delete) { luaL_typerror(L, _index, type->name); /* is not a userdata value. */ } return NULL; }