From 994bea5a6b85f4dec1d3329f31435827d1549d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?johnche=28=E8=BD=A6=E9=9B=84=E7=94=9F=29?= Date: Tue, 28 Nov 2017 10:43:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0xlua.release=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E4=B8=BB=E5=8A=A8=E8=A7=A3=E9=99=A4lua?= =?UTF-8?q?=E5=AF=B9c#=E6=9F=90=E5=AF=B9=E8=B1=A1=E7=9A=84=E5=BC=95?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/XLua/Src/ObjectTranslator.cs | 12 ++++++++++++ Assets/XLua/Src/StaticLuaCallbacks.cs | 19 +++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Assets/XLua/Src/ObjectTranslator.cs b/Assets/XLua/Src/ObjectTranslator.cs index 4f4a7af..86d4ee7 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 2f9184b..8c99a72 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 -- GitLab