Exemplo n.º 1
0
        static int PrintWarning(LuaState luaState)
        {
            // For each argument we'll 'tostring' it
            int n = LuaLib.LuaGetTop(luaState);
            var sb = new StringBuilder("Lua:");

            LuaLib.LuaGetGlobal(luaState, "tostring");

            for( int i = 1; i <= n; i++ )
            {
                LuaLib.LuaPushValue(luaState, -1);  /* function to be called */
                LuaLib.LuaPushValue(luaState, i);   /* value to print */
                LuaLib.LuaPCall(luaState, 1, 1, 0);

                var s = LuaLib.LuaToString(luaState, -1);
                sb.Append(s);

                if(i > 1)
                {
                    sb.Append("\t");
                }

                LuaLib.LuaPop(luaState, 1);  /* pop result */
            }
            UnityEngine.Debug.LogWarning(sb.ToString());
            return 0;
        }
Exemplo n.º 2
0
        public static object[] CallLunaFunction(this Lua lua, string fileName, string function, params object[] args)
        {
            var luaState = lua.LuaState;
            var translator = lua.Translator;
            
            var oldTop = LuaLib.LuaGetTop(luaState);
            LuaLib.LuaGetGlobal(luaState, "CallImportFuncion");

            translator.Push(luaState, fileName);
            translator.Push(luaState, function);
            
            for (var i = 0; i < args.Length; i++)
            {
                translator.Push(luaState, args[i]);
            }
            
            var error = LuaLib.LuaPCall(luaState, 2 + args.Length, -1, 0);
            if (error != 0)
            {
                var curTop = LuaLib.LuaGetTop(luaState);
                if (curTop > oldTop)
                {
                    object err = translator.GetObject(luaState, -1);
                    UnityEngine.Debug.LogError(err);
                }
                
                LuaLib.LuaSetTop(luaState, oldTop);
                return null;
            }
            var ret = translator.PopValues(luaState, oldTop);
            return ret;
        }
Exemplo n.º 3
0
        /*
         * Creates a new table as a global variable or as a field
         * inside an existing table
         */
        public void NewTable(string fullPath)
        {
            string [] path   = FullPathToArray(fullPath);
            int       oldTop = LuaLib.LuaGetTop(luaState);

            if (path.Length == 1)
            {
                LuaLib.LuaNewTable(luaState);
                LuaLib.LuaSetGlobal(luaState, fullPath);
            }
            else
            {
                LuaLib.LuaGetGlobal(luaState, path [0]);

                for (int i = 1; i < path.Length - 1; i++)
                {
                    LuaLib.LuaPushString(luaState, path [i]);
                    LuaLib.LuaGetTable(luaState, -2);
                }

                LuaLib.LuaPushString(luaState, path [path.Length - 1]);
                LuaLib.LuaNewTable(luaState);
                LuaLib.LuaSetTable(luaState, -3);
            }

            LuaLib.LuaSetTop(luaState, oldTop);
        }
Exemplo n.º 4
0
Arquivo: Lua.cs Projeto: bmk10/NLua
        /*
         * Indexer for global variables from the LuaInterpreter
         * Supports navigation of tables by using . operator
         */
        public object this [string fullPath] {
            get {
                object   returnValue = null;
                int      oldTop      = LuaLib.LuaGetTop(luaState);
                string[] path        = fullPath.Split(new char[] { '.' });
                LuaLib.LuaGetGlobal(luaState, path [0]);
                returnValue = translator.GetObject(luaState, -1);
                LuaBase dispose = null;

                if (path.Length > 1)
                {
                    dispose = returnValue as LuaBase;
                    string[] remainingPath = new string[path.Length - 1];
                    Array.Copy(path, 1, remainingPath, 0, path.Length - 1);
                    returnValue = GetObject(remainingPath);
                    if (dispose != null)
                    {
                        dispose.Dispose();
                    }
                }

                LuaLib.LuaSetTop(luaState, oldTop);
                return(returnValue);
            }
            set {
                int      oldTop = LuaLib.LuaGetTop(luaState);
                string[] path   = fullPath.Split(new char[] { '.' });

                if (path.Length == 1)
                {
                    translator.Push(luaState, value);
                    LuaLib.LuaSetGlobal(luaState, fullPath);
                }
                else
                {
                    LuaLib.LuaGetGlobal(luaState, path [0]);
                    string[] remainingPath = new string[path.Length - 1];
                    Array.Copy(path, 1, remainingPath, 0, path.Length - 1);
                    SetObject(remainingPath, value);
                }

                LuaLib.LuaSetTop(luaState, oldTop);

                // Globals auto-complete
                if (value == null)
                {
                    // Remove now obsolete entries
                    globals.Remove(fullPath);
                }
                else
                {
                    // Add new entries
                    if (!globals.Contains(fullPath))
                    {
                        RegisterGlobal(fullPath, value.GetType(), 0);
                    }
                }
            }
        }
Exemplo n.º 5
0
Arquivo: Lua.cs Projeto: zwwl0801/NLua
        /// <summary>
        /// <para>Return a debug.traceback() call result (a multi-line string, containing a full stack trace, including C calls.</para>
        /// <para>Note: it won't return anything unless the interpreter is in the middle of execution - that is, it only makes sense to call it from a method called from Lua, or during a coroutine yield.</para>
        /// </summary>
        public string GetDebugTraceback()
        {
            int oldTop = LuaLib.LuaGetTop(luaState);

            LuaLib.LuaGetGlobal(luaState, "debug");        // stack: debug
            LuaLib.LuaGetField(luaState, -1, "traceback"); // stack: debug,traceback
            LuaLib.LuaRemove(luaState, -2);                // stack: traceback
            LuaLib.LuaPCall(luaState, 0, -1, 0);
            return(translator.PopValues(luaState, oldTop)[0] as string);
        }
Exemplo n.º 6
0
Arquivo: Lua.cs Projeto: zwwl0801/NLua
        /// <summary>
        /// Push a debug.traceback reference onto the stack, for a pcall function to use as error handler. (Remember to increment any top-of-stack markers!)
        /// </summary>
        private int PushDebugTraceback(LuaState luaState, int argcount)
        {
            LuaLib.LuaGetGlobal(luaState, "debug");
            LuaLib.LuaGetField(luaState, -1, "traceback");
            LuaLib.LuaRemove(luaState, -2);
            int errindex = -argcount - 2;

            LuaLib.LuaInsert(luaState, errindex);
            return(errindex);
        }
Exemplo n.º 7
0
        public static void SetReadFile(Lua lua)
        {
            if (ReadFileFunction == null)
                ReadFileFunction = new LuaNativeFunction(ReadFile);

            LuaLib.LuaGetGlobal(lua.LuaState, "io");
            LuaLib.LuaPushString(lua.LuaState, "readfile");
            LuaLib.LuaPushStdCallCFunction(lua.LuaState, ReadFileFunction);
            LuaLib.LuaSetTable(lua.LuaState, -3);
            LuaLib.LuaPop(lua.LuaState, 1);
        }
Exemplo n.º 8
0
        public static void CheckStack(this Lua lua)
        {
            var luaState = lua.LuaState;
            var top = LuaLib.LuaGetTop(luaState);
            if (top == 0)
                return;

            LuaLib.LuaPushString(luaState, "Script stack leak!");
            LuaLib.LuaInsert(luaState, 1);
            
            LuaLib.LuaPushNumber(luaState, top);
            LuaLib.LuaInsert(luaState, 1);
            
            LuaLib.LuaGetGlobal(luaState, "print");
            LuaLib.LuaInsert(luaState, 1);

            LuaLib.LuaPCall(luaState, top + 2, 0, 0);
            LuaLib.LuaSetTop(luaState, 0);
        }
Exemplo n.º 9
0
Arquivo: Lua.cs Projeto: bmk10/NLua
 void Init()
 {
     LuaLib.LuaPushString(luaState, "LUAINTERFACE LOADED");
     LuaLib.LuaPushBoolean(luaState, true);
     LuaLib.LuaSetTable(luaState, (int)LuaIndexes.Registry);
     if (_StatePassed == false)
     {
         LuaLib.LuaNewTable(luaState);
         LuaLib.LuaSetGlobal(luaState, "luanet");
     }
     LuaLib.LuaNetPushGlobalTable(luaState);
     LuaLib.LuaGetGlobal(luaState, "luanet");
     LuaLib.LuaPushString(luaState, "getmetatable");
     LuaLib.LuaGetGlobal(luaState, "getmetatable");
     LuaLib.LuaSetTable(luaState, -3);
     LuaLib.LuaNetPopGlobalTable(luaState);
     translator = new ObjectTranslator(this, luaState);
     ObjectTranslatorPool.Instance.Add(luaState, translator);
     LuaLib.LuaNetPopGlobalTable(luaState);
 }