Skip to content

UClass GC较晚时会导致新的UObject使用了老的metatable #514

@jozhn

Description

@jozhn

对于BlueprintGeneratedClass,会被UE GC,但如果这个类在被UE标记之后还没有真正GC时,该类的新的UClass被创建出来,然后创建了新的UObject,会导致新创建的UObject绑定时使用了已有的metatable,从而导致Lua中访问UObject成员时会取到老的property智能指针,从而提示invalid property。

解决办法是在FClassRegistry::PushMetatable中判断ClassDesc中Class的有效性,当无效时Unregister清理掉注册表中失效的metatable,继续执行创建新的metatable。以此保证UObject创建时能拿到有效的metatable。

    bool FClassRegistry::PushMetatable(lua_State* L, const char* MetatableName)
    {
        int Type = luaL_getmetatable(L, MetatableName);
        if (Type == LUA_TTABLE)
        {
            FClassDesc* Ret = Find(MetatableName);
            if (Ret && Ret->IsClass() && !Ret->IsStructValid())
            {
                // unregister invalid metatable
                Unregister(Ret);
            }
            else
            {
                return true;
            }
        }
        //...
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions