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