| 141 | } |
| 142 | |
| 143 | void FDelegateRegistry::Bind(lua_State* L, int32 Index, FScriptDelegate* Delegate, UObject* SelfObject) |
| 144 | { |
| 145 | check(lua_type(L, Index) == LUA_TFUNCTION); |
| 146 | const auto LuaFunction = lua_topointer(L, Index); |
| 147 | auto& Info = Delegates.FindChecked(Delegate); |
| 148 | if (!Info.Owner.IsValid()) |
| 149 | Info.Owner = SelfObject; |
| 150 | |
| 151 | const auto DelegatePair = FLuaDelegatePair(SelfObject, LuaFunction); |
| 152 | const auto Cached = CachedHandlers.Find(DelegatePair); |
| 153 | if (Cached && Cached->IsValid()) |
| 154 | { |
| 155 | (*Cached)->BindTo(Delegate); |
| 156 | Info.Handlers.Add(*Cached); |
| 157 | return; |
| 158 | } |
| 159 | |
| 160 | lua_pushvalue(L, Index); |
| 161 | const auto Ref = luaL_ref(L, LUA_REGISTRYINDEX); |
| 162 | const auto Handler = CreateHandler(Ref, Info.Owner.Get(), SelfObject); |
| 163 | Handler->BindTo(Delegate); |
| 164 | Env->AutoObjectReference.Add(Handler); |
| 165 | CachedHandlers.Add(DelegatePair, Handler); |
| 166 | Info.Handlers.Add(Handler); |
| 167 | } |
| 168 | |
| 169 | void FDelegateRegistry::Unbind(void* Delegate) |
| 170 | { |
nothing calls this directly
no test coverage detected