lua-users home
lua-l archive

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


Roberto Ierusalimschy <>:
> > Is there a reason not to include the ability to read the number of
> > uservalues associated with a userdata
> > (lua_getiuservalue()/lua_setiuservalue()) into the API?
> No specific reason except the usual (to avoid bloating the API with
> functions seldom used.)

Speaking of which, it looks like luaL_checkudata/luaL_testudata are
quite often used, but also quite inefficient (if the rest of the
method runs fast), which seems to cause the somewhat strange benchmark
results I sent earlier. It looks up a metatable by name, then it gets
the actual one, compares them and pops both. Tuple-related benchmarks
look much better if I drop the metatable check.

A more efficient lower-level API could be, say, lua_testmetatable(L,
idx_tested, idx_of_metatable) which would return e.g. 1 if the value
at the idx_tested index has the metatable supplied at idx_of_metatable
(all done via pointer comparisons, no metatable pushing/popping), 0 if
it has no metatable at all, and -1 if it has a metatable but it's
different from the supplied one. The method would have the expected
metatable as an upvalue.

Best regards,