示例#1
0
    public static Delegate RemoveDelegate(Delegate obj, Delegate dg)
    {
        LuaDelegate remove = dg.Target as LuaDelegate;

        if (remove == null)
        {
            obj = Delegate.Remove(obj, dg);
            return(obj);
        }

        Delegate[] ds = obj.GetInvocationList();

        for (int i = 0; i < ds.Length; i++)
        {
            LuaDelegate ld = ds[i].Target as LuaDelegate;

            if (ld != null && ld == remove)
            {
                obj = Delegate.Remove(obj, ds[i]);
                if (obj != null)
                {
                    obj.AddRef();
                }
                break;
            }
        }

        return(obj);
    }
    static int op_Addition(IntPtr L)
    {
        try
        {
            LuaTypes type = LuaDLL.lua_type(L, 1);

            switch (type)
            {
            case LuaTypes.LUA_TFUNCTION:
                Delegate    arg0 = (Delegate)ToLua.ToObject(L, 2);
                LuaFunction func = ToLua.ToLuaFunction(L, 1);
                Type        t    = arg0.GetType();
                Delegate    arg1 = DelegateFactory.CreateDelegate(t, func);
                Delegate    arg2 = Delegate.Combine(arg0, arg1);
                arg0.AddRef();
                ToLua.Push(L, arg2);
                func.Dispose();
                return(1);

            case LuaTypes.LUA_TNIL:
                LuaDLL.lua_pushvalue(L, 2);
                return(1);

            case LuaTypes.LUA_TUSERDATA:
                Delegate a0  = (Delegate)ToLua.ToObject(L, 1);
                Delegate a1  = ToLua.CheckDelegate(a0.GetType(), L, 2);
                Delegate ret = Delegate.Combine(a0, a1);

                if (LuaDLL.lua_type(L, 2) == LuaTypes.LUA_TFUNCTION)
                {
                    a0.AddRef();    //如果是Lua函数已经加1
                }
                else
                {
                    ret.AddRef();
                }

                ToLua.Push(L, ret);
                return(1);

            default:
                LuaDLL.luaL_typerror(L, 1, "Delegate");
                return(1);
            }
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e));
        }
    }
    static int op_Subtraction(IntPtr L)
    {
        try
        {
            Delegate arg0 = (Delegate)ToLua.ToObject(L, 1);         //不能增加引用计数,否则自身包含的都会增加
            LuaTypes type = LuaDLL.lua_type(L, 2);

            if (type == LuaTypes.LUA_TFUNCTION)
            {
                LuaFunction func = ToLua.ToLuaFunction(L, 2);
                Delegate[]  ds   = arg0.GetInvocationList();

                for (int i = 0; i < ds.Length; i++)
                {
                    LuaDelegate target = ds[i].Target as LuaDelegate;

                    if (target != null && target.func == func && target.self == null)
                    {
                        arg0 = Delegate.Remove(arg0, ds[i]);
                        if (arg0 != null)
                        {
                            arg0.AddRef();                                            //产生新的委托需要增加计数
                        }
                        break;
                    }
                }

                func.Dispose();
                ToLua.Push(L, arg0);
                return(1);
            }
            else
            {
                Delegate arg1 = (Delegate)ToLua.CheckObject(L, 2);
                arg0 = DelegateFactory.RemoveDelegate(arg0, arg1);
                ToLua.Push(L, arg0);

                return(1);
            }
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e));
        }
    }
示例#4
0
    public static Delegate RemoveDelegate(Delegate obj, LuaFunction func)
    {
        Delegate[] ds = obj.GetInvocationList();

        for (int i = 0; i < ds.Length; i++)
        {
            LuaDelegate ld = ds[i].Target as LuaDelegate;

            if (ld != null && ld.func == func)
            {
                obj = Delegate.Remove(obj, ds[i]);
                if (obj != null)
                {
                    obj.AddRef();
                }
                break;
            }
        }

        return(obj);
    }