示例#1
0
        public object toObject(int index)
        {
            if (index >= 1)
            {
                IntPtr l      = L;
                int    oldTop = LuaDLL.lua_gettop(l);
                LuaDLL.lua_getref(l, valueref);
                LuaDLL.lua_rawgeti(l, -1, index);
                int    p           = LuaDLL.lua_absindex(l, -1);
                object returnValue = LuaObject.checkObj(l, p);
                LuaDLL.lua_settop(l, oldTop);
                return(returnValue);
            }

            return(null);
        }
示例#2
0
        static internal object checkVar(IntPtr l, int p)
        {
            LuaTypes type = LuaDLL.lua_type(l, p);

            switch (type)
            {
            case LuaTypes.LUA_TNUMBER:
            {
                return(LuaDLL.lua_tonumber(l, p));
            }

            case LuaTypes.LUA_TSTRING:
            {
                return(LuaDLL.lua_tostring(l, p));
            }

            case LuaTypes.LUA_TBOOLEAN:
            {
                return(LuaDLL.lua_toboolean(l, p));
            }

            case LuaTypes.LUA_TFUNCTION:
            {
                LuaDLL.lua_pushvalue(l, p);
                int         r = LuaDLL.luaL_ref(l, LuaIndexes.LUA_REGISTRYINDEX);
                LuaFunction v = new LuaFunction(l, r);
                return(v);
            }

            case LuaTypes.LUA_TTABLE:
            {
                LuaDLL.lua_pushvalue(l, p);
                int      r = LuaDLL.luaL_ref(l, LuaIndexes.LUA_REGISTRYINDEX);
                LuaTable v = new LuaTable(l, r);
                return(v);
            }

            case LuaTypes.LUA_TUSERDATA:
                return(LuaObject.checkObj(l, p));

            default:
                return(null);
            }
        }
示例#3
0
        static public object checkVar(IntPtr l, int p)
        {
            LuaTypes type = LuaDLL.lua_type(l, p);

            switch (type)
            {
            case LuaTypes.LUA_TNUMBER:
            {
                return(LuaDLL.lua_tonumber(l, p));
            }

            case LuaTypes.LUA_TSTRING:
            {
                return(LuaDLL.lua_tostring(l, p));
            }

            case LuaTypes.LUA_TBOOLEAN:
            {
                return(LuaDLL.lua_toboolean(l, p));
            }

            case LuaTypes.LUA_TFUNCTION:
            {
                LuaFunction v;
                LuaObject.checkType(l, p, out v);
                return(v);
            }

            case LuaTypes.LUA_TTABLE:
            {
                if (isLuaValueType(l, p))
                {
#if !SLUA_STANDALONE
                    if (luaTypeCheck(l, p, "Vector2"))
                    {
                        Vector2 v;
                        checkType(l, p, out v);
                        return(v);
                    }
                    else if (luaTypeCheck(l, p, "Vector3"))
                    {
                        Vector3 v;
                        checkType(l, p, out v);
                        return(v);
                    }
                    else if (luaTypeCheck(l, p, "Vector4"))
                    {
                        Vector4 v;
                        checkType(l, p, out v);
                        return(v);
                    }
                    else if (luaTypeCheck(l, p, "Quaternion"))
                    {
                        Quaternion v;
                        checkType(l, p, out v);
                        return(v);
                    }
                    else if (luaTypeCheck(l, p, "Color"))
                    {
                        Color c;
                        checkType(l, p, out c);
                        return(c);
                    }
#endif
                    Logger.LogError("unknown lua value type");
                    return(null);
                }
                else if (isLuaClass(l, p))
                {
                    return(checkObj(l, p));
                }
                else
                {
                    LuaTable v;
                    checkType(l, p, out v);
                    return(v);
                }
            }

            case LuaTypes.LUA_TUSERDATA:
                return(LuaObject.checkObj(l, p));

            case LuaTypes.LUA_TTHREAD:
            {
                LuaThread lt;
                LuaObject.checkType(l, p, out lt);
                return(lt);
            }

            default:
                return(null);
            }
        }
示例#4
0
        static public object checkVar(IntPtr l, int p)
        {
            LuaTypes type = LuaDLL.lua_type(l, p);

            switch (type)
            {
            case LuaTypes.LUA_TNUMBER:
            {
                return(LuaDLL.lua_tonumber(l, p));
            }

            case LuaTypes.LUA_TSTRING:
            {
                return(LuaDLL.lua_tostring(l, p));
            }

            case LuaTypes.LUA_TBOOLEAN:
            {
                return(LuaDLL.lua_toboolean(l, p));
            }

            case LuaTypes.LUA_TFUNCTION:
            {
                LuaDLL.lua_pushvalue(l, p);
                int         r = LuaDLL.luaL_ref(l, LuaIndexes.LUA_REGISTRYINDEX);
                LuaFunction v = new LuaFunction(l, r);
                return(v);
            }

            case LuaTypes.LUA_TTABLE:
            {
                if (isLuaValueType(l, p))
                {
                    if (luaTypeCheck(l, p, "Vector2"))
                    {
                        Vector2 v;
                        checkType(l, p, out v);
                        return(v);
                    }
                    else if (luaTypeCheck(l, p, "Vector3"))
                    {
                        Vector3 v;
                        checkType(l, p, out v);
                        return(v);
                    }
                    else if (luaTypeCheck(l, p, "Vector4"))
                    {
                        Vector4 v;
                        checkType(l, p, out v);
                        return(v);
                    }
                    else if (luaTypeCheck(l, p, "Quaternion"))
                    {
                        Quaternion v;
                        checkType(l, p, out v);
                        return(v);
                    }
                    else if (luaTypeCheck(l, p, "Color"))
                    {
                        Color c;
                        checkType(l, p, out c);
                        return(c);
                    }
                    LuaDLL.luaL_error(l, "unknown lua value type");
                    return(null);
                }
                else if (isLuaClass(l, p))
                {
                    return(checkObj(l, p));
                }
                else
                {
                    LuaDLL.lua_pushvalue(l, p);
                    int      r = LuaDLL.luaL_ref(l, LuaIndexes.LUA_REGISTRYINDEX);
                    LuaTable v = new LuaTable(l, r);
                    return(v);
                }
            }

            case LuaTypes.LUA_TUSERDATA:
                return(LuaObject.checkObj(l, p));

            default:
                return(null);
            }
        }
示例#5
0
        public static int UserdataToLuaTab(IntPtr l)
        {
            try
            {
                if (LuaDLL.lua_type(l, 1) == LuaTypes.LUA_TUSERDATA)
                {
                    object o  = LuaObject.checkObj(l, 1);
                    Type   ot = o.GetType();

                    if (ot.IsArray)
                    {
                        pushValue(l, true);
                        LuaDLL.lua_newtable(l); //...,true, tab

                        Array tmp = o as Array;

                        for (int i = 0; i < tmp.Length; ++i)
                        {
                            LuaDLL.lua_pushinteger(l, i + 1);      //...,true, tab, index
                            LuaObject.pushVar(l, tmp.GetValue(i)); //...,true, tab, index, value
                            LuaDLL.lua_rawset(l, -3);              //..., true, tab
                        }

                        return(2);
                    }

                    bool isList = ot.IsGenericType && ot.GetGenericTypeDefinition() == typeof(List <>);

                    if (isList)
                    {
                        pushValue(l, true);
                        LuaDLL.lua_newtable(l); //...,true, tab

                        IList tmp = o as IList;

                        for (int i = 0; i < tmp.Count; ++i)
                        {
                            LuaDLL.lua_pushinteger(l, i + 1); //...,true, tab, index
                            LuaObject.pushVar(l, tmp[i]);     //...,true, tab, index, value
                            LuaDLL.lua_rawset(l, -3);         //..., true, tab
                        }

                        return(2);
                    }

                    bool isDict = ot.IsGenericType && ot.GetGenericTypeDefinition() == typeof(Dictionary <,>);

                    if (isDict)
                    {
                        pushValue(l, true);
                        LuaDLL.lua_newtable(l); //...,true, tab
                        IDictionary dict = o as IDictionary;

                        foreach (object key in dict.Keys)
                        {
                            object value = dict[key];
                            LuaObject.pushVar(l, key);   //...,true, tab, index
                            LuaObject.pushVar(l, value); //...,true, tab, index, value
                            LuaDLL.lua_rawset(l, -3);    //..., true, tab
                        }

                        return(2);
                    }
                }

                pushValue(l, false);
                LuaDLL.lua_pushnil(l);
                return(2);
            }
            catch (Exception e)
            {
                return(LuaObject.error(l, e));
            }
        }