Having an extra layer of indirection via some global index of
userdatas seems a terrible idea.
It would have to be paid by *every* userdata access.
Lua don't need access userdata, only C function needs. If you call lua_touserdata to access userdata, an simple extra layer is not more expensive.
And all the userdata with __gc metamethod are already in a seperated list.