private static object GetLuaTableObject(this IntPtr l, int index, out bool isUserData) { var pos = l.NormalizeIndex(index); object rv; if (LuaObjCacheSlim.TryGet(l, pos, out rv)) { isUserData = true; return(rv); } isUserData = false; l.checkstack(2); l.pushlightuserdata(LuaConst.LRKEY_TYPE_TRANS); // #trans l.gettable(pos); // trans ILuaTrans trans = null; if (l.isuserdata(-1)) { trans = l.GetLuaLightObject(-1) as ILuaTrans; } l.pop(1); if (trans != null) { isUserData = true; rv = trans.GetLua(l, index); //// Notice the LuaObjCacheSlim.Record should happen when access #tar from a table //if (rv != null && rv.GetType().IsClass) //{ // LuaObjCacheSlim.Record(rv, l.topointer(pos), pos); //} return(rv); } return(null); }
public static void GetLua <T>(this IntPtr l, int index, out T val) { if (l.istable(index)) { l.checkstack(2); l.pushvalue(index); // ud l.pushlightuserdata(LuaConst.LRKEY_TYPE_TRANS); // ud #trans l.gettable(-2); // ud trans ILuaTrans trans = null; if (l.isuserdata(-1)) { trans = l.GetLuaLightObject(-1) as ILuaTrans; } l.pop(2); if (trans != null) { var ttrans = trans as ILuaTrans <T>; if (ttrans != null) { val = ttrans.GetLua(l, index); return; } var mtrans = trans as ILuaTransMulti; if (mtrans != null) { val = mtrans.GetLua <T>(l, index); return; } var raw = trans.GetLua(l, index); if (raw is T) { val = (T)raw; } else { val = default(T); } return; } } { object func; if (typeof(T).IsValueType || typeof(T).IsSealed) { if (typeof(T).IsEnum()) { var ltype = l.type(index); if (ltype == lua.LUA_TNUMBER || ltype == lua.LUA_TSTRING) { var hub = LuaTypeHub.GetTypeHub(typeof(T)) as LuaTypeHub.TypeHubEnumPrecompiled <T>; if (hub != null) { val = hub.GetLuaChecked(l, index); return; } if (ltype == lua.LUA_TNUMBER) { var num = l.tonumber(index); val = (T)Enum.ToObject(typeof(T), (ulong)num); return; } else { var str = l.GetString(index); val = (T)Enum.Parse(typeof(T), str); return; } } } else { LuaPushNative._NativePushLuaFuncs.TryGetValue(typeof(T), out func); ILuaTrans <T> gfunc = func as ILuaTrans <T>; if (gfunc != null) { val = gfunc.GetLua(l, index); return; } } } var raw = GetLua(l, index); if (raw == null) { val = default(T); return; } else { if (raw is T) { val = (T)raw; return; } else if (raw is double) { if (IsNumeric(typeof(T))) { val = (T)Convert.ChangeType(raw, typeof(T)); return; } } else if (raw is LuaWrap.BaseLua) { if (typeof(T).IsSubclassOf(typeof(Delegate))) { val = (T)(object)CapsLuaDelegateGenerator.CreateDelegate(typeof(T), raw as LuaWrap.BaseLua); return; } } } val = default(T); return; } }