Skip to content

Commit

Permalink
Settings: Push groups in to_table as well
Browse files Browse the repository at this point in the history
  • Loading branch information
SmallJoker authored and sfan5 committed Mar 1, 2021
1 parent c401a06 commit 3a2f55b
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 8 deletions.
33 changes: 25 additions & 8 deletions src/script/lua_api/l_settings.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
}

Expand Down
2 changes: 2 additions & 0 deletions src/settings.h
Expand Up @@ -239,6 +239,8 @@ class Settings {

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

0 comments on commit 3a2f55b

Please sign in to comment.