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));
 }