diff --git a/Assets/XLua/Src/ObjectTranslator.cs b/Assets/XLua/Src/ObjectTranslator.cs index 4f4a7af4d69335cc08970fb88e22ccebc0399639..86d4ee700e941abeb46712bbc080ccceacd46ddb 100644 --- a/Assets/XLua/Src/ObjectTranslator.cs +++ b/Assets/XLua/Src/ObjectTranslator.cs @@ -569,6 +569,9 @@ namespace XLua LuaAPI.xlua_pushasciistring(L, "tofunction"); LuaAPI.lua_pushstdcallcfunction(L, StaticLuaCallbacks.ToFunction); LuaAPI.lua_rawset(L, -3); + LuaAPI.xlua_pushasciistring(L, "release"); + LuaAPI.lua_pushstdcallcfunction(L, StaticLuaCallbacks.ReleaseCsObject); + LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_createtable(L, 1, 4); // 4 for __gc, __tostring, __index, __newindex @@ -1217,6 +1220,15 @@ namespace XLua return getCsObj(L, index, LuaAPI.xlua_tocsobj_fast(L,index)); } + internal void ReleaseCSObj(RealStatePtr L, int index) + { + int udata = LuaAPI.xlua_tocsobj_safe(L, index); + if (udata != -1) + { + objects.Replace(udata, null); + } + } + List fix_cs_functions = new List(); internal LuaCSFunction GetFixCSFunction(int index) diff --git a/Assets/XLua/Src/StaticLuaCallbacks.cs b/Assets/XLua/Src/StaticLuaCallbacks.cs index 2f9184b5822d2f29739d7a53fb5b7c3bcec4b867..8c99a723278e4314c10807ee9356c8ca70498aa4 100644 --- a/Assets/XLua/Src/StaticLuaCallbacks.cs +++ b/Assets/XLua/Src/StaticLuaCallbacks.cs @@ -29,7 +29,7 @@ namespace XLua internal LuaCSFunction StaticCSFunctionWraper, FixCSFunctionWraper; internal LuaCSFunction DelegateCtor; - + public StaticLuaCallbacks() { GcMeta = new LuaCSFunction(StaticLuaCallbacks.LuaGC); @@ -94,7 +94,7 @@ namespace XLua LuaCSFunction func = (LuaCSFunction)translator.FastGetCSObj(L, LuaAPI.xlua_upvalueindex(1)); return func(L); } - catch(Exception e) + catch (Exception e) { return LuaAPI.luaL_error(L, "c# exception in StaticCSFunction:" + e); } @@ -1079,5 +1079,20 @@ namespace XLua return LuaAPI.luaL_error(L, "c# exception in ToFunction: " + e); } } + + [MonoPInvokeCallback(typeof(LuaCSFunction))] + public static int ReleaseCsObject(RealStatePtr L) + { + try + { + ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); + translator.ReleaseCSObj(L, 1); + return 0; + } + catch (Exception e) + { + return LuaAPI.luaL_error(L, "c# exception in ReleaseCsObject: " + e); + } + } } } \ No newline at end of file