public static Delegate CreateDelegate(Type t, BaseDynamic dyn) { if (dyn is BaseLua) { var dynlua = dyn as BaseLua; var l = dynlua.L; var refid = dynlua.Refid; if (l != IntPtr.Zero && refid != 0) { using (var lr = new LuaStateRecover(l)) { l.GetField(lua.LUA_REGISTRYINDEX, "___delreg"); if (!l.istable(-1)) { l.pop(1); l.newtable(); // reg l.newtable(); // reg meta l.PushString("k"); // reg meta 'k' l.SetField(-2, "__mode"); // reg meta l.setmetatable(-2); // reg l.pushvalue(-1); // reg reg l.SetField(lua.LUA_REGISTRYINDEX, "___delreg"); // reg } l.getref(refid); // reg func l.gettable(-2); // reg finfo if (!l.istable(-1)) { l.pop(1); // reg l.newtable(); // reg finfo l.pushvalue(-2); // reg finfo reg l.getref(refid); // reg finfo reg func l.pushvalue(-3); // reg finfo reg func finfo l.settable(-3); // reg info reg l.pop(1); //reg info } l.PushLua(t); // reg finfo dtype l.gettable(-2); // reg finfo del IDelegateDynamicWrapper delwrapper = null; if (l.isuserdata(-1)) { var wr = l.GetLua(-1).UnwrapDynamic <WeakReference>(); if (wr != null) { delwrapper = wr.GetWeakReference <IDelegateDynamicWrapper>(); if (delwrapper == null) { wr.ReturnToPool(); } } } if (delwrapper == null) { delwrapper = CreateDelegateImp(t, dyn); if (delwrapper != null) { var wr = ObjectPool.GetWeakReferenceFromPool(delwrapper); l.pop(1); // reg finfo l.PushLua(t); // reg finfo dtype l.PushRawObj(wr); // reg finfo dtype del l.settable(-3); // reg finfo } } if (delwrapper != null) { return(CreateDelegateFromWrapper(t, delwrapper)); } } } } var wrapper = CreateDelegateImp(t, dyn); if (wrapper != null) { return(CreateDelegateFromWrapper(t, wrapper)); } return(null); }
private static Delegate CreateDelegateFromWrapper(Type deltype, IDelegateDynamicWrapper delwrapper) { return(delwrapper.MakeDelegate(deltype)); }