lua-users home
lua-l archive

Re: Faster checking of userdata

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Fabio Mascarenhas wrote:
>
> A safe alternative, that does not use strcmp, [...]
I think one of the fastest methods is to store the metatable
as an upvalue in all Cclosures that make use of the userdata
and then use lua_rawequal for checking:
void *
my_checkudata(lua_State *L, int idx, int metaidx /*not rel*/)
{
 if (lua_getmetatable(L, idx))
 {
 int ok = lua_rawequal(L, -1, metaidx);
 lua_pop(L, 1);
 if (ok)
 return lua_touserdata(L, idx);
 }
 return NULL;
}
#define META_FOO lua_upvalueindex(1)
 struct foo *p = my_checkudata(L, META_FOO);
 ...
 struct foo *p = lua_newuserdata(L, sizeof foo);
 lua_pushvalue(L, META_FOO);
 lua_setmetatable(L, -2);
 ...
All operations are cheap - no table lookups or string handling.
Of course this method has a downside: managing which closures
need which upvalues may become a nuisance...
Ciao, ET.

AltStyle によって変換されたページ (->オリジナル) /