public string TosToString(bool popStack, bool noExpand, Dictionary <IntPtr, bool> printedTables) { LuaType type = BBLua.lua_type(this.L, -1); string result; switch (type) { case LuaType.Nil: result = "nil"; break; case LuaType.Boolean: result = BBLua.lua_toboolean(this.L, -1).ToString(); break; case LuaType.Number: result = BBLua.lua_tonumber(this.L, -1).ToString(); break; case LuaType.String: result = "\"" + BBLua.lua_tostring(this.L, -1) + "\""; break; case LuaType.Function: result = GetTosFunctionInfo(); break; case LuaType.Table: if (noExpand) { goto default; } IntPtr tblPtr = BBLua.lua_topointer(this.L, -1); if (printedTables.ContainsKey(tblPtr)) { result = "<Table, recursion>"; break; } result = "{"; BBLua.lua_pushnil(this.L); while (BBLua.lua_next(this.L, -2) != 0) { printedTables.Add(tblPtr, true); string val = IndentMultiLine(TosToString(true, false, printedTables)); string key = TosToString(false, true, printedTables); printedTables.Remove(tblPtr); if (key[0] == '\"') { string rawString = key.Substring(1, key.Length - 2); if (alphaNumeric.IsMatch(rawString)) { result += "\n " + rawString + " = " + val + ","; } else { result += "\n [" + key + "] = " + val + ","; } } else { result += "\n [" + key + "] = " + val + ","; } } result += "\n}"; break; case LuaType.UserData: case LuaType.LightUserData: IntPtr ptr = BBLua.lua_touserdata(this.L, -1); result = "<" + type.ToString() + ", at 0x" + ptr.ToInt32().ToString("X") + ">"; break; default: result = "<" + type.ToString() + ">"; break; } if (popStack) { BBLua.lua_settop(this.L, -2); } return(result); }