diff options
author | bfredl <bjorn.linse@gmail.com> | 2023-08-09 21:15:03 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-09 21:15:03 +0200 |
commit | 8f9b2652fbe298ecde9dcc9603808c772db05531 (patch) | |
tree | 7b29301430661b5e416e8d043002531c878d72a2 /src | |
parent | 68f12e7fcb1fb8b95ca0b1207683d929574c0555 (diff) | |
parent | dbcba26bf1e4ec717dc488b73351f8a9bb93ff26 (diff) | |
download | rneovim-8f9b2652fbe298ecde9dcc9603808c772db05531.tar.gz rneovim-8f9b2652fbe298ecde9dcc9603808c772db05531.tar.bz2 rneovim-8f9b2652fbe298ecde9dcc9603808c772db05531.zip |
Merge pull request #24633 from bfredl/luabool2
fix(api): revert unintended change of optional bool params
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/lua/converter.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/nvim/lua/converter.c b/src/nvim/lua/converter.c index 2df6458198..385ac11546 100644 --- a/src/nvim/lua/converter.c +++ b/src/nvim/lua/converter.c @@ -849,6 +849,9 @@ Integer nlua_pop_Integer(lua_State *lstate, Error *err) /// Convert lua value to boolean /// +/// Despite the name of the function, this uses lua semantics for booleans. +/// thus `err` is never set as any lua value can be co-erced into a lua bool +/// /// Always pops one value from the stack. Boolean nlua_pop_Boolean(lua_State *lstate, Error *err) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT @@ -858,6 +861,36 @@ Boolean nlua_pop_Boolean(lua_State *lstate, Error *err) return ret; } +/// Convert lua value to boolean +/// +/// This follows API conventions for a Boolean value, compare api_object_to_bool +/// +/// Always pops one value from the stack. +Boolean nlua_pop_Boolean_strict(lua_State *lstate, Error *err) + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT +{ + Boolean ret = false; + switch (lua_type(lstate, -1)) { + case LUA_TBOOLEAN: + ret = lua_toboolean(lstate, -1); + break; + + case LUA_TNUMBER: + ret = (lua_tonumber(lstate, -1) != 0); + break; + + case LUA_TNIL: + ret = false; + break; + + default: + api_set_error(err, kErrorTypeValidation, "not a boolean"); + } + + lua_pop(lstate, 1); + return ret; +} + /// Check whether typed table on top of the stack has given type /// /// @param[in] lstate Lua state. @@ -1318,7 +1351,7 @@ void nlua_pop_keydict(lua_State *L, void *retval, FieldHashfn hashy, char **err_ } else if (field->type == kObjectTypeInteger) { *(Integer *)mem = nlua_pop_Integer(L, err); } else if (field->type == kObjectTypeBoolean) { - *(Boolean *)mem = nlua_pop_Boolean(L, err); + *(Boolean *)mem = nlua_pop_Boolean_strict(L, err); } else if (field->type == kObjectTypeString) { *(String *)mem = nlua_pop_String(L, err); } else if (field->type == kObjectTypeFloat) { |