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); }
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); // | }
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); // | }
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); }
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); }
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); }
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); }
// ------------------------------------------------------------------------------------------------------------- // 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()); }
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); // | }