aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2023-08-09 21:15:03 +0200
committerGitHub <noreply@github.com>2023-08-09 21:15:03 +0200
commit8f9b2652fbe298ecde9dcc9603808c772db05531 (patch)
tree7b29301430661b5e416e8d043002531c878d72a2 /src
parent68f12e7fcb1fb8b95ca0b1207683d929574c0555 (diff)
parentdbcba26bf1e4ec717dc488b73351f8a9bb93ff26 (diff)
downloadrneovim-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.c35
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) {