Ejemplo n.º 1
0
        private static Type GetLuaTableObjectType(this IntPtr l, int index, out bool isUserData)
        {
            isUserData = false;
            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)
            {
                isUserData = true;
                return(trans.GetType(l, index));
            }
            return(null);
        }
Ejemplo n.º 2
0
 public static int ClrFuncUnwrap(IntPtr l)
 {
     if (l.istable(1))
     {
         l.pushlightuserdata(LuaConst.LRKEY_TYPE_TRANS); // #trans
         l.gettable(1);                                  // trans
         ILuaTrans trans = null;
         if (l.isuserdata(-1))
         {
             trans = l.GetLuaLightObject(-1) as ILuaTrans;
         }
         l.pop(1);
         ILuaNative nsub = trans as ILuaNative;
         if (nsub != null)
         {
             nsub.Unwrap(l, 1);
             return(1);
         }
     }
     l.PushLua(l.GetLua(1));
     return(1);
 }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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;
            }
        }