LUA_INLINE bool CppBindClassBase::buildMetaTable(LuaRef& meta, LuaRef& parent, const char* name, void* static_id, void* clazz_id, void* const_id) { LuaRef ref = parent.rawget<LuaRef>(name); if (ref != nullptr) { meta = ref; return false; } auto L = parent.state(); std::string type_name = "class<" + CppBindModule::getFullName(parent, name) + ">"; LuaRef type_const = LuaRef::fromPointer(L, const_id); LuaRef type_clazz = LuaRef::fromPointer(L, clazz_id); LuaRef type_static = LuaRef::fromPointer(L, static_id); LuaRef clazz_const = LuaRef::createTable(L); clazz_const.setMetaTable(clazz_const); clazz_const.rawset("__index", &CppBindClassMetaMethod::index); clazz_const.rawset("__newindex", &CppBindClassMetaMethod::newIndex); clazz_const.rawset("___getters", LuaRef::createTable(L)); clazz_const.rawset("___setters", LuaRef::createTable(L)); clazz_const.rawset("___type", "const_" + type_name); clazz_const.rawset("___const", clazz_const); clazz_const.rawset(CppBindClassMetaMethod::signature(), type_const); LuaRef clazz = LuaRef::createTable(L); clazz.setMetaTable(clazz); clazz.rawset("__index", &CppBindClassMetaMethod::index); clazz.rawset("__newindex", &CppBindClassMetaMethod::newIndex); clazz.rawset("___getters", clazz_const.rawget<LuaRef>("___getters")); clazz.rawset("___setters", LuaRef::createTable(L)); clazz.rawset("___type", type_name); clazz.rawset("___const", clazz_const); clazz.rawset(CppBindClassMetaMethod::signature(), type_clazz); LuaRef clazz_static = LuaRef::createTable(L); clazz_static.setMetaTable(clazz_static); clazz_static.rawset("__index", &CppBindClassMetaMethod::index); clazz_static.rawset("__newindex", &CppBindClassMetaMethod::newIndex); clazz_static.rawset("___getters", LuaRef::createTable(L)); clazz_static.rawset("___setters", LuaRef::createTable(L)); clazz_static.rawset("___type", "static_" + type_name); clazz_static.rawset("___class", clazz); clazz_static.rawset("___const", clazz_const); clazz_static.rawset("___parent", parent); clazz_static.rawset(CppBindClassMetaMethod::signature(), type_static); LuaRef registry(L, LUA_REGISTRYINDEX); registry.rawset(type_clazz, clazz); registry.rawset(type_const, clazz_const); registry.rawset(type_static, clazz_static); parent.rawset(name, clazz_static); meta = clazz_static; return true; }
LUA_INLINE CppBindModule CppBindModule::beginModule(const char* name) { LuaRef ref = m_meta.rawget(name); if (ref != nullptr) return CppBindModule(ref); lua_State* L = state(); std::string type_name = "module<" + getFullName(m_meta, name) + ">"; LuaRef module = LuaRef::createTable(L); module.setMetaTable(module); module.rawset("__index", &CppBindModuleMetaMethod::index); module.rawset("__newindex", &CppBindModuleMetaMethod::newIndex); module.rawset("___getters", LuaRef::createTable(L)); module.rawset("___setters", LuaRef::createTable(L)); module.rawset("___type", type_name); module.rawset("___module", m_meta); m_meta.rawset(name, module); return CppBindModule(module); }