コード例 #1
0
        public static bool NewTable(ScriptState luaState, string fullPath)
        {
            var runtime   = LuaRuntimePool.GetRuntime(luaState);
            var oldTop    = LuaCore.GetTop(luaState);
            var paths     = GetSearchPaths(fullPath);
            var tableName = paths[0];

            if (paths.Length > 1)
            {
                LuaCore.GetGlobal(luaState, paths[0]);
                if (!TableNotFound(runtime, luaState, -1, paths[0]))
                {
                    return(false);
                }
                for (int i = 1; i < paths.Length - 1; i++)
                {
                    LuaCore.PushString(luaState, paths[i]);
                    LuaCore.GetTable(luaState, -2);
                    if (!TableNotFound(runtime, luaState, -1, paths[i]))
                    {
                        return(false);
                    }
                }
                tableName = paths[paths.Length - 1];
            }
            LuaCore.CreateTable(luaState);
            LuaCore.SetGlobal(luaState, tableName);
            LuaCore.SetTop(luaState, oldTop);
            return(true);
        }
コード例 #2
0
        public static void SearchSetLuaObjectEx(ScriptState luaState, string fullPath, object o, string metatableName)
        {
            var oldTop  = LuaCore.GetTop(luaState);
            var runtime = LuaRuntimePool.GetRuntime(luaState);
            var paths   = GetSearchPaths(fullPath);

            if (paths.Length == 1)
            {
                runtime.ObjectMgr.PushObjectEx(luaState, o, metatableName);
                LuaCore.SetGlobal(luaState, paths[0]);
            }
            else
            {
                LuaCore.GetGlobal(luaState, paths[0]);
                for (int i = 1; i < paths.Length - 1; i++)
                {
                    LuaCore.PushString(luaState, paths[i]);
                    LuaCore.GetTable(luaState, -2);
                }
                LuaCore.PushString(luaState, paths[paths.Length - 1]);
                runtime.ObjectMgr.PushObjectEx(luaState, o, metatableName);
                LuaCore.SetTable(luaState, -3);
            }
            LuaCore.SetTop(luaState, oldTop);
        }
コード例 #3
0
        public IList <object> Call(params object[] args)
        {
            var topIndex = LuaCore.GetTop(_luaState);

            var runtime = LuaRuntimePool.GetRuntime(_luaState);

            if (_func != null)
            {
                DataHelper.PushObject(_luaState, _func);
            }
            else
            {
                LuaCore.GlobalRawGet(_luaState, _reference);
            }
            foreach (var arg in args)
            {
                DataHelper.PushObject(_luaState, arg);
            }
            if (LuaCore.Call(_luaState, args.Length, -1, 0) == 0)
            {
                return(runtime.ObjectMgr.PopResults(_luaState, topIndex));
            }
            runtime.ThrowExceptionFromError(_luaState, topIndex);
            return(null);
        }
コード例 #4
0
            private static IList <object> GetCtorArguments(ScriptState luaState)
            {
                var            n    = LuaCore.GetTop(luaState);
                IList <object> args = new List <object>(n);

                for (int i = 1; i <= n; i++)
                {
                    args.Add(DataHelper.GetObject(luaState, i));
                }
                return(args);
            }
コード例 #5
0
ファイル: MethodWrapper.cs プロジェクト: HarryCU/QwLua
        private int Call(ScriptState luaState)
        {
            var finder  = Finder;
            var runtime = LuaRuntimePool.GetRuntime(luaState);

            object instance = null;
            int    argIndex = 1;

            if (!finder.IsStatic)
            {
                instance = DataHelper.GetObject(luaState, 1);
                argIndex = 2;
            }
            var            n        = LuaCore.GetTop(luaState);
            IList <object> args     = new List <object>(argIndex);
            IList <object> argTypes = new List <object>(argIndex);

            for (; argIndex <= n; argIndex++)
            {
                var arg = DataHelper.GetObject(luaState, argIndex);
                args.Add(arg);
                argTypes.Add(arg == null ? typeof(object) : arg.GetType());
            }
            var m = finder.Search(argTypes);

            if (m == null)
            {
                string memberKey = finder.CreateKey(argTypes);
                runtime.ThrowError("未能找到" + memberKey + "的方法!");
            }
            argTypes.Clear();
            object result = null;

            try
            {
                if (m != null)
                {
                    result = m.Invoke(instance, args.ToArray());
                }
            }
            catch (Exception ex)
            {
                runtime.ThrowError(ex);
            }
            finally
            {
                args.Clear();
            }
            DataHelper.PushObject(luaState, result);
            return(1);
        }
コード例 #6
0
        private int Call(ScriptState luaState)
        {
            var            runtime = LuaRuntimePool.GetRuntime(luaState);
            var            n       = LuaCore.GetTop(luaState);
            IList <object> args    = new List <object>(n);

            for (int i = 1; i <= n; i++)
            {
                args.Add(DataHelper.GetObject(luaState, i));
            }
            object result = null;

            try
            {
                result = _func(args);
            }
            catch (Exception ex)
            {
                runtime.ThrowError(ex);
            }
            DataHelper.PushObject(luaState, result);
            return(1);
        }
コード例 #7
0
        public static void SearchSetLuaObject(ScriptState luaState, string fullPath, object o)
        {
            var oldTop = LuaCore.GetTop(luaState);
            var paths  = GetSearchPaths(fullPath);

            if (paths.Length == 1)
            {
                DataHelper.PushObject(luaState, o);
                LuaCore.SetGlobal(luaState, paths[0]);
            }
            else
            {
                LuaCore.GetGlobal(luaState, paths[0]);
                for (int i = 1; i < paths.Length - 1; i++)
                {
                    LuaCore.PushString(luaState, paths[i]);
                    LuaCore.GetTable(luaState, -2);
                }
                LuaCore.PushString(luaState, paths[paths.Length - 1]);
                DataHelper.PushObject(luaState, o);
                LuaCore.SetTable(luaState, -3);
            }
            LuaCore.SetTop(luaState, oldTop);
        }
コード例 #8
0
        public static object SearchLuaObject(ScriptState luaState, string fullPath)
        {
            var oldTop = LuaCore.GetTop(luaState);
            var paths  = GetSearchPaths(fullPath);

            LuaCore.GetGlobal(luaState, paths[0]);
            var result = DataHelper.GetObject(luaState, -1);

            if (paths.Length > 1)
            {
                for (int i = 1; i < paths.Length; i++)
                {
                    LuaCore.PushString(luaState, paths[i]);
                    LuaCore.GetTable(luaState, -2);
                    result = DataHelper.GetObject(luaState, -1);
                    if (result == null)
                    {
                        break;
                    }
                }
            }
            LuaCore.SetTop(luaState, oldTop);
            return(result);
        }