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