public static LuaRef CreateClass(LuaRef module, string name, Type classType, Type superClass, LuaNativeFunction dctor) { LuaRef classref = module.RawGet <LuaRef, string>(name); if (classref) { return(classref); } var meta = LunaNative.create_class(module.State, module, name, classType, dctor); if (superClass != null) { LuaRef registry = new LuaRef(module.State, LUA_REGISTRYINDEX); int superClassID = SharpObject.TypeID(superClass); LuaRef super = registry.RawGet <LuaRef>(superClassID); meta.RawSet(LunaNative.___super, super); } return(meta); }
public static LuaRef create_class(lua_State L, LuaRef parentModule, string name, Type classType, LuaNativeFunction dctor) { int moduleRef = parentModule.Ref; int classId = SharpObject.TypeID(classType); #if C_API int metaRef = luna_create_class(L, moduleRef, name, classId, dctor.ToFunctionPointer()); var meta = new LuaRef(metaRef, L); #else string fullName = GetFullName(parentModule, name); LuaRef meta = LuaRef.CreateTable(L); meta.SetMetaTable(meta); meta.RawSet("__index", (LuaNativeFunction)class_index); meta.RawSet("__newindex", (LuaNativeFunction)class_newindex); meta.RawSet(___getters, LuaRef.CreateTable(L)); meta.RawSet(___setters, LuaRef.CreateTable(L)); meta.RawSet(___type, fullName); if (dctor != null) { meta.RawSet("__gc", dctor); } if (classId != 0) { LuaRef registry = LuaRef.Registry(L); registry.RawSet(classId, meta); } parentModule.RawSet(name, meta); #endif meta.RawSet("type", classType); return(meta); }