示例#1
0
文件: LuaState.cs 项目: WUTiAM/wutLua
        public object Get(string path)
        {
            int oldTop = LuaLib.lua_gettop(L);

            LuaLib.lua_pushvalue(L, LuaIndices.LUA_GLOBALSINDEX);               // |_G

            int startPos = 0;
            int pos;

            do
            {
                pos = path.IndexOf('.', startPos);
                if (pos < 0)
                {
                    pos = path.Length;
                }

                string key = path.Substring(startPos, pos - startPos);

                LuaLib.lua_pushstring(L, key);                                                          // |_G|v1|...|vn-1|kn
                LuaLib.lua_rawget(L, -2);                                                               // |_G|v1|...|vn-1|vn

                startPos = pos + 1;
            } while(startPos < path.Length && !LuaLib.lua_isnil(L, -1));

            object o = ToObject(-1);

            LuaLib.lua_settop(L, oldTop);                                                               // |

            return(o);
        }
示例#2
0
文件: LuaTable.cs 项目: WUTiAM/wutLua
        protected void _SetValue(string key, object value)
        {
            IntPtr L      = _LuaState.L;
            int    oldTop = LuaLib.lua_gettop(L);

            Push();                                             // |t
            _LuaState.PushObject(value);                        // |t|v
            LuaLib.lua_setfield(L, -2, key);                    // |t		// t.k = v

            LuaLib.lua_settop(L, oldTop);                       // |
        }
示例#3
0
文件: LuaTable.cs 项目: WUTiAM/wutLua
        protected void _SetValue(int key, object value)
        {
            IntPtr L      = _LuaState.L;
            int    oldTop = LuaLib.lua_gettop(L);

            Push();                                             // |t
            _LuaState.PushObject(value);                        // |t|v
            LuaLib.lua_rawseti(L, -2, key);                     // |t		// t[k] = v

            LuaLib.lua_settop(L, oldTop);                       // |
        }
示例#4
0
文件: LuaTable.cs 项目: WUTiAM/wutLua
        protected object _GetValue(int key)
        {
            IntPtr L      = _LuaState.L;
            int    oldTop = LuaLib.lua_gettop(L);

            Push();                                                     // |t
            LuaLib.lua_rawgeti(L, -1, key);                             // |t|v
            object value = _LuaState.ToObject(-1);                      // |v

            LuaLib.lua_settop(L, oldTop);                               // |

            return(value);
        }
示例#5
0
文件: LuaTable.cs 项目: WUTiAM/wutLua
        protected object _GetValue(string key)
        {
            IntPtr L      = _LuaState.L;
            int    oldTop = LuaLib.lua_gettop(L);

            Push();                                                     // |t
            LuaLib.lua_pushstring(L, key);                              // |t|k
            LuaLib.lua_gettable(L, -2);                                 // |v
            object value = _LuaState.ToObject(-1);                      // |v

            LuaLib.lua_settop(L, oldTop);                               // |

            return(value);
        }
示例#6
0
文件: LuaTable.cs 项目: WUTiAM/wutLua
        public object RawGet(string key)
        {
            IntPtr L      = _LuaState.L;
            int    oldTop = LuaLib.lua_gettop(L);

            Push();                                                     // |t
            LuaLib.lua_pushstring(L, key);                              // |t|k
            LuaLib.lua_rawget(L, -2);                                   // |v
            object value = _LuaState.ToObject(-1);                      // |v

            LuaLib.lua_settop(L, oldTop);                               // |

            return(value);
        }
示例#7
0
        public object[] Call(params object[] args)
        {
            IntPtr L      = _LuaState.L;
            int    oldTop = LuaLib.lua_gettop(L);

            LuaLib.lua_rawgeti(L, LuaIndices.LUA_REGISTRYINDEX, _RefId);                                // |f

            if (args != null)
            {
                for (int i = 0; i < args.Length; ++i)
                {
                    _LuaState.PushObject(args[i]);                                                                                      // |f|a1|a2|...
                }
            }

            if (LuaLib.lua_pcall(L, args.Length, LuaLib.LUA_MULTRET, 0) != 0)                   // | or |ret1|ret2|... or |err
            {
                string error = LuaLib.lua_tostring(L, -1);
                LuaLib.lua_settop(L, oldTop);                                                                                           // |

                throw new LuaException(error);
            }

            object[] returnObjects = null;

            int currentTop = LuaLib.lua_gettop(L);

            if (currentTop != oldTop)
            {
                var objects = new List <object>();
                for (int i = oldTop + 1; i <= currentTop; ++i)
                {
                    objects.Add(_LuaState.ToObject(i));
                }
                returnObjects = objects.ToArray();

                LuaLib.lua_settop(L, oldTop);                                                                                           // |
            }

            return(returnObjects);
        }
示例#8
0
文件: LuaState.cs 项目: WUTiAM/wutLua
        // -------------------------------------------------------------------------------------------------------------
        // Public interfaces
        // -------------------------------------------------------------------------------------------------------------

        public object[] DoBuffer(byte[] chunk, string chunkName = "chunk")
        {
            int oldTop = LuaLib.lua_gettop(L);

            if (LuaLib.luaL_loadbuffer(L, chunk, chunk.Length, chunkName) != 0)                 // |f or |err
            {
                string error = LuaLib.lua_tostring(L, -1);                                      // |err
                LuaLib.lua_settop(L, oldTop);                                                   // |

                throw new LuaException(error);
            }
            if (LuaLib.lua_pcall(L, 0, LuaLib.LUA_MULTRET, 0) != 0)                                             // | or |ret1|ret2 or |err
            {
                string error = LuaLib.lua_tostring(L, -1);                                                      // |err
                LuaLib.lua_settop(L, oldTop);                                                                   // |

                throw new LuaException(error);
            }

            int top = LuaLib.lua_gettop(L);

            if (top == oldTop)
            {
                return(null);
            }

            var objects = new List <object>();

            for (int i = oldTop + 1; i <= top; ++i)
            {
                objects.Add(ToObject(i));
            }

            LuaLib.lua_pop(L, top - oldTop);

            return(objects.ToArray());
        }
示例#9
0
文件: LuaState.cs 项目: WUTiAM/wutLua
        public void Set(string path, object value)
        {
            int oldTop = LuaLib.lua_gettop(L);

            LuaLib.lua_pushvalue(L, LuaIndices.LUA_GLOBALSINDEX);               // |_G

            int startPos = 0;
            int pos      = path.IndexOf('.');

            while (pos >= 0)
            {
                string key = path.Substring(startPos, pos - startPos);

                LuaLib.lua_pushstring(L, key);                                                          // |_G|k1 or |_G|v1|k2 or |_G|v1|v2|k3 or ...
                LuaLib.lua_rawget(L, -2);                                                               // |_G|v1 or |_G|v1|v2 or |_G|v1|v2|v3 or ...

                if (LuaLib.lua_isnil(L, -1))
                {
                    startPos = path.Length;
                    break;
                }

                startPos = pos + 1;
                pos      = path.IndexOf('.', startPos);
            }

            if (startPos < path.Length)
            {
                string key = path.Substring(startPos, path.Length - startPos);

                PushObject(value);                                                                      // |_G|v1|v2|...|vn-1|o
                LuaLib.lua_setfield(L, -2, key);                                                        // |_G|v1|v2|...|vn-1|		// vn-1.kn = o
            }

            LuaLib.lua_settop(L, oldTop);                                                               // |
        }