+static void *
+ul_create_userdata(lua_State *L, size_t size, const luaL_Reg *reg, lua_CFunction gc)
+{
+ void *ret = lua_newuserdata(L, size);
+
+ memset(ret, 0, size);
+ lua_createtable(L, 0, 2);
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -2, "__index");
+ lua_pushcfunction(L, gc);
+ lua_setfield(L, -2, "__gc");
+ lua_pushvalue(L, -1);
+ lua_setmetatable(L, -3);
+ lua_pushvalue(L, -2);
+ luaI_openlib(L, NULL, reg, 1);
+ lua_pushvalue(L, -2);
+
+ return ret;
+}
+