예제 #1
0
        internal int DoTraceback(LuaState state)
        {
            // if err is not a string, just pass it on (the stack is local to the function)
            // I spent a solid hour of debugging non stop only to fix the issue with this one line
            // (the issue was that nlua would throw exception objects and this thing would inappropriately
            // stringify them btw, if you're interested)
            if (!LuaLib.LuaIsString(state, -1))
            {
                return(LuaLib.LuaGetTop(state));
            }

            var error = LuaLib.LuaToString(state, -1);

            LuaLib.LuaPop(state, 1);

            LuaLib.LuaNewTable(state); // t

            LuaLib.LuaPushString(state, "__etgmod_error");
            LuaLib.LuaPushBoolean(state, true);
            LuaLib.LuaSetTable(state, -3);

            LuaLib.LuaPushString(state, "msg");          // k
            LuaLib.LuaPushString(state, error);          // v
            LuaLib.LuaSetTable(state, -3);               // t[k] = v

            LuaLib.LuaPushString(state, "traceback");    // k
            LuaLib.LuaLTraceback(state, state, null, 0); // v
            LuaLib.LuaSetTable(state, -3);               // t[k] = v

            return(1);                                   // t is left
        }
예제 #2
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);
        }
예제 #3
0
 public void PushDictionaryAsTable <A, B>(LuaState luaState, Dictionary <A, B> dict)
 {
     LuaLib.LuaNewTable(luaState);             //-0 +1
     foreach (var kv in dict)
     {
         Push(luaState, kv.Key);                 //-0 +1
         Push(luaState, kv.Value);               //-0 +1
         LuaLib.LuaSetTable(luaState, -3);       //-0 +1
     }
 }
예제 #4
0
        /*
         * Creates a new table
         */
        public LuaTable NewTable()
        {
            int oldTop = LuaLib.LuaGetTop(luaState);

            LuaLib.LuaNewTable(luaState);
            var table = (LuaTable)Pop();

            LuaLib.LuaSetTop(luaState, oldTop);
            return(table);
        }
예제 #5
0
 /*
  * Sets up the list of objects in the Lua side
  */
 private void CreateLuaObjectList(LuaState luaState)
 {
     LuaLib.LuaPushString(luaState, "luaNet_objects");
     LuaLib.LuaNewTable(luaState);
     LuaLib.LuaNewTable(luaState);
     LuaLib.LuaPushString(luaState, "__mode");
     LuaLib.LuaPushString(luaState, "v");
     LuaLib.LuaSetTable(luaState, -3);
     LuaLib.LuaSetMetatable(luaState, -2);
     LuaLib.LuaSetTable(luaState, (int)LuaIndexes.Registry);
 }
예제 #6
0
 public static LuaTable NewTable(this Lua lua)
 {
     var L = lua.LuaState;
     int oldTop = LuaLib.LuaGetTop(L);
     
     LuaLib.LuaNewTable(L);
     LuaTable returnVal = (LuaTable)lua.Translator.GetObject(L, -1);
     
     LuaLib.LuaSetTop(L,oldTop);
     return returnVal;
 }
예제 #7
0
        /*
         * Pushes a new object into the Lua stack with the provided
         * metatable
         */
        private void PushNewObject(LuaState luaState, object o, int index, string metatable)
        {
            if (metatable == "luaNet_metatable")
            {
                string assemblyQualifiedName = CacheReflection.GetAssemblyQualifiedName(o.GetType());

                // Gets or creates the metatable for the object's type
                LuaLib.LuaLGetMetatable(luaState, assemblyQualifiedName);

                if (LuaLib.LuaIsNil(luaState, -1))
                {
                    LuaLib.LuaSetTop(luaState, -2);
                    LuaLib.LuaLNewMetatable(luaState, assemblyQualifiedName);
                    LuaLib.LuaPushString(luaState, "cache");
                    LuaLib.LuaNewTable(luaState);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushLightUserData(luaState, LuaLib.LuaNetGetTag());
                    LuaLib.LuaPushNumber(luaState, 1);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushString(luaState, "__index");
                    LuaLib.LuaPushString(luaState, "luaNet_indexfunction");
                    LuaLib.LuaRawGet(luaState, (int)LuaIndexes.Registry);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushString(luaState, "__gc");
                    LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.GcFunction);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushString(luaState, "__tostring");
                    LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.ToStringFunction);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushString(luaState, "__newindex");
                    LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.NewIndexFunction);
                    LuaLib.LuaRawSet(luaState, -3);
                    // Bind C# operator with Lua metamethods (__add, __sub, __mul)
                    RegisterOperatorsFunctions(luaState, o.GetType());
                    RegisterCallMethodForDelegate(luaState, o);
                }
            }
            else
            {
                LuaLib.LuaLGetMetatable(luaState, metatable);
            }

            // Stores the object index in the Lua list and pushes the
            // index into the Lua stack
            LuaLib.LuaLGetMetatable(luaState, "luaNet_objects");
            LuaLib.LuaNetNewUData(luaState, index);
            LuaLib.LuaPushValue(luaState, -3);
            LuaLib.LuaRemove(luaState, -4);
            LuaLib.LuaSetMetatable(luaState, -2);
            LuaLib.LuaPushValue(luaState, -1);
            LuaLib.LuaRawSetI(luaState, -3, index);
            LuaLib.LuaRemove(luaState, -2);
        }
예제 #8
0
        private int RegisterTableInternal(LuaState luaState)
        {
            if (LuaLib.LuaType(luaState, 1) == LuaTypes.Table)
            {
                var    luaTable       = GetTable(luaState, 1);
                string superclassName = LuaLib.LuaToString(luaState, 2).ToString();

                if (superclassName != null)
                {
                    var klass = FindType(superclassName);

                    if (klass != null)
                    {
                        // Creates and pushes the object in the stack, setting
                        // it as the  metatable of the first argument
                        object obj = CodeGeneration.Instance.GetClassInstance(klass, luaTable);
                        PushObject(luaState, obj, "luaNet_metatable");
                        LuaLib.LuaNewTable(luaState);
                        LuaLib.LuaPushString(luaState, "__index");
                        LuaLib.LuaPushValue(luaState, -3);
                        LuaLib.LuaSetTable(luaState, -3);
                        LuaLib.LuaPushString(luaState, "__newindex");
                        LuaLib.LuaPushValue(luaState, -3);
                        LuaLib.LuaSetTable(luaState, -3);
                        LuaLib.LuaSetMetatable(luaState, 1);
                        // Pushes the object again, this time as the base field
                        // of the table and with the luaNet_searchbase metatable
                        LuaLib.LuaPushString(luaState, "base");
                        int index = AddObject(obj);
                        PushNewObject(luaState, obj, index, "luaNet_searchbase");
                        LuaLib.LuaRawSet(luaState, 1);
                    }
                    else
                    {
                        ThrowError(luaState, "register_table: can not find superclass '" + superclassName + "'");
                    }
                }
                else
                {
                    ThrowError(luaState, "register_table: superclass name can not be null");
                }
            }
            else
            {
                ThrowError(luaState, "register_table: first arg is not a table");
            }

            return(0);
        }
예제 #9
0
        /*
         * Pushes a new object into the Lua stack with the provided
         * metatable
         */
        private void PushNewObject(LuaState luaState, object o, int index, string metatable)
        {
            if (metatable == "luaNet_metatable")
            {
                // Gets or creates the metatable for the object's type
                LuaLib.LuaLGetMetatable(luaState, o.GetType().AssemblyQualifiedName);

                if (LuaLib.LuaIsNil(luaState, -1))
                {
                    LuaLib.LuaSetTop(luaState, -2);
                    LuaLib.LuaLNewMetatable(luaState, o.GetType().AssemblyQualifiedName);
                    LuaLib.LuaPushString(luaState, "cache");
                    LuaLib.LuaNewTable(luaState);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushLightUserData(luaState, LuaLib.LuaNetGetTag());
                    LuaLib.LuaPushNumber(luaState, 1);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushString(luaState, "__index");
                    LuaLib.LuaPushString(luaState, "luaNet_indexfunction");
                    LuaLib.LuaRawGet(luaState, (int)LuaIndexes.Registry);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushString(luaState, "__gc");
                    LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.gcFunction);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushString(luaState, "__tostring");
                    LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.toStringFunction);
                    LuaLib.LuaRawSet(luaState, -3);
                    LuaLib.LuaPushString(luaState, "__newindex");
                    LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.newindexFunction);
                    LuaLib.LuaRawSet(luaState, -3);
                }
            }
            else
            {
                LuaLib.LuaLGetMetatable(luaState, metatable);
            }

            // Stores the object index in the Lua list and pushes the
            // index into the Lua stack
            LuaLib.LuaLGetMetatable(luaState, "luaNet_objects");
            LuaLib.LuaNetNewUData(luaState, index);
            LuaLib.LuaPushValue(luaState, -3);
            LuaLib.LuaRemove(luaState, -4);
            LuaLib.LuaSetMetatable(luaState, -2);
            LuaLib.LuaPushValue(luaState, -1);
            LuaLib.LuaRawSetI(luaState, -3, index);
            LuaLib.LuaRemove(luaState, -2);
        }
예제 #10
0
파일: Lua.cs 프로젝트: 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);
 }