void lupb_msg_registertypes(lua_State *L) { lupb_setfuncs(L, lupb_msg_toplevel_m); lupb_register_type(L, LUPB_ARENA, NULL, lupb_arena_mm); lupb_register_type(L, LUPB_MSGCLASS, NULL, lupb_msgclass_mm); lupb_register_type(L, LUPB_MSGFACTORY, lupb_msgfactory_m, lupb_msgfactory_mm); lupb_register_type(L, LUPB_ARRAY, NULL, lupb_array_mm); lupb_register_type(L, LUPB_MAP, NULL, lupb_map_mm); lupb_register_type(L, LUPB_MSG, NULL, lupb_msg_mm); lupb_alloc_initsingleton(L); }
void lupb_register_type(lua_State *L, const char *name, const luaL_Reg *m, const luaL_Reg *mm) { luaL_newmetatable(L, name); if (mm) { lupb_setfuncs(L, mm); } if (m) { /* Methods go in the mt's __index method. This implies that you can' * implement __index and also have methods. */ lua_getfield(L, -1, "__index"); lupb_assert(L, lua_isnil(L, -1)); lua_pop(L, 1); lua_createtable(L, 0, 0); lupb_setfuncs(L, m); lua_setfield(L, -2, "__index"); } lua_pop(L, 1); /* The mt. */ }