private static int LuaMetaDelegateInvoke(IntPtr l)
        {
            var oldtop = l.gettop();

            try
            {
                IDelegateLuaWrapper wrap = null;
                l.pushlightuserdata(LuaConst.LRKEY_DEL_WRAP); // #wrap
                l.rawget(1);                                  // wrap
                if (l.IsUserData(-1))
                {
                    wrap = l.GetLuaRawObject(-1) as IDelegateLuaWrapper;
                    l.pop(1); // X
                }
                else
                {
                    l.pop(1); // X
                    var del = l.GetLua(1) as Delegate;
                    wrap = CreateDelegateImp(del.GetType(), null);
                    wrap.SetDelegate(del);
                    l.pushlightuserdata(LuaConst.LRKEY_DEL_WRAP); // #wrap
                    l.PushLuaRawObject(wrap);                     // #wrap wrap
                    l.rawset(1);                                  // X
                }
                if (wrap != null)
                {
                    wrap.CallByLua(l);
                }
                return(l.gettop() - oldtop);
            }
            catch (Exception e)
            {
                l.LogError(e.ToString());
                l.settop(oldtop);
                return(0);
            }
        }
        public static Delegate CreateDelegate(Type t, BaseLua dyn)
        {
            {
                var dynlua = dyn as Capstones.LuaWrap.BaseLua;
                var l      = dynlua.L;
                var refid  = dynlua.Refid;
                if (l != IntPtr.Zero && refid != 0)
                {
                    using (var lr = new LuaStateRecover(l))
                    {
                        l.checkstack(5);
                        l.pushlightuserdata(LuaConst.LRKEY_DEL_CACHE); // #reg
                        l.gettable(lua.LUA_REGISTRYINDEX);             // reg
                        if (!l.istable(-1))
                        {
                            l.pop(1);                                      // X

                            l.newtable();                                  // reg
                            l.newtable();                                  // reg meta
                            l.PushString(LuaConst.LS_COMMON_K);            // reg meta 'k'
                            l.SetField(-2, LuaConst.LS_META_KEY_MODE);     // reg meta
                            l.setmetatable(-2);                            // reg
                            l.pushlightuserdata(LuaConst.LRKEY_DEL_CACHE); // reg #reg
                            l.pushvalue(-2);                               // reg #reg reg
                            l.settable(lua.LUA_REGISTRYINDEX);             // 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
                        IDelegateLuaWrapper delwrapper = null;
                        if (l.isuserdata(-1))
                        {
                            var wr = l.GetLua <WeakReference>(-1);
                            if (wr != null)
                            {
                                delwrapper = wr.GetWeakReference <IDelegateLuaWrapper>();
                                if (delwrapper == null)
                                {
                                    wr.ReturnToPool();
                                }
                            }
                        }
                        if (delwrapper == null)
                        {
                            delwrapper = CreateDelegateImp(t, dyn);
                            if (delwrapper != null)
                            {
                                var wr = ObjectPool.WeakReferencePool.GetFromPool(delwrapper);
                                l.pop(1);               // reg finfo
                                l.PushLua(t);           // reg finfo dtype
                                l.PushLuaRawObject(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, IDelegateLuaWrapper delwrapper)
 {
     return(delwrapper.MakeDelegate(deltype));
 }