aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSmallJoker <mk939@ymail.com>2021-01-20 16:58:59 +0100
committersfan5 <sfan5@live.de>2021-03-01 12:14:41 +0100
commit3a2f55bc19bec1cb3f76d0edc30208a1eff11925 (patch)
tree66128fa22316df01fefb8b7b02d6bef0e36125ca
parentc401a06f8a669d1fd4194010ccf23d7043d70fb1 (diff)
downloadminetest-3a2f55bc19bec1cb3f76d0edc30208a1eff11925.tar.gz
minetest-3a2f55bc19bec1cb3f76d0edc30208a1eff11925.tar.bz2
minetest-3a2f55bc19bec1cb3f76d0edc30208a1eff11925.zip
Settings: Push groups in to_table as well
-rw-r--r--src/script/lua_api/l_settings.cpp33
-rw-r--r--src/settings.h2
2 files changed, 27 insertions, 8 deletions
diff --git a/src/script/lua_api/l_settings.cpp b/src/script/lua_api/l_settings.cpp
index bcbaf15fa..85df8ab34 100644
--- a/src/script/lua_api/l_settings.cpp
+++ b/src/script/lua_api/l_settings.cpp
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "lua_api/l_settings.h"
#include "lua_api/l_internal.h"
#include "cpp_api/s_security.h"
+#include "threading/mutex_auto_lock.h"
#include "util/string.h" // FlagDesc
#include "settings.h"
#include "noise.h"
@@ -253,20 +254,36 @@ int LuaSettings::l_write(lua_State* L)
return 1;
}
-// to_table(self) -> {[key1]=value1,...}
-int LuaSettings::l_to_table(lua_State* L)
+static void push_settings_table(lua_State *L, const Settings *settings)
{
- NO_MAP_LOCK_REQUIRED;
- LuaSettings* o = checkobject(L, 1);
-
- std::vector<std::string> keys = o->m_settings->getNames();
-
+ std::vector<std::string> keys = settings->getNames();
lua_newtable(L);
for (const std::string &key : keys) {
- lua_pushstring(L, o->m_settings->get(key).c_str());
+ std::string value;
+ Settings *group = nullptr;
+
+ if (settings->getNoEx(key, value)) {
+ lua_pushstring(L, value.c_str());
+ } else if (settings->getGroupNoEx(key, group)) {
+ // Recursively push tables
+ push_settings_table(L, group);
+ } else {
+ // Impossible case (multithreading) due to MutexAutoLock
+ continue;
+ }
+
lua_setfield(L, -2, key.c_str());
}
+}
+
+// to_table(self) -> {[key1]=value1,...}
+int LuaSettings::l_to_table(lua_State* L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ LuaSettings* o = checkobject(L, 1);
+ MutexAutoLock(o->m_settings->m_mutex);
+ push_settings_table(L, o->m_settings);
return 1;
}
diff --git a/src/settings.h b/src/settings.h
index b5e859ee0..e22d949d3 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -239,6 +239,8 @@ private:
// Allow TestSettings to run sanity checks using private functions.
friend class TestSettings;
+ // For sane mutex locking when iterating
+ friend class LuaSettings;
void updateNoLock(const Settings &other);
void clearNoLock();