aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.lua3
-rw-r--r--src/nvim/eval/funcs.h1
-rw-r--r--src/nvim/generators/gen_eval.lua7
-rw-r--r--src/nvim/lua/executor.c12
4 files changed, 18 insertions, 5 deletions
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua
index d7a17d6e15..3db0d27018 100644
--- a/src/nvim/eval.lua
+++ b/src/nvim/eval.lua
@@ -10,6 +10,7 @@
-- Defaults to BASE_NONE (function cannot be used as a method).
-- func Name of the C function which implements the VimL function. Defaults to
-- `f_{funcname}`.
+-- fast Function can run in |api-fast| events. Defaults to false.
local varargs = function(nr)
return {nr}
@@ -205,7 +206,7 @@ return {
hlID={args=1, base=1},
hlexists={args=1, base=1},
hostname={},
- iconv={args=3, base=1},
+ iconv={args=3, base=1, fast=true},
indent={args=1, base=1},
index={args={2, 4}, base=1},
input={args={1, 3}, base=1},
diff --git a/src/nvim/eval/funcs.h b/src/nvim/eval/funcs.h
index 4ab4c8f800..5f8d81c989 100644
--- a/src/nvim/eval/funcs.h
+++ b/src/nvim/eval/funcs.h
@@ -19,6 +19,7 @@ typedef struct {
uint8_t min_argc; ///< Minimal number of arguments.
uint8_t max_argc; ///< Maximal number of arguments.
uint8_t base_arg; ///< Method base arg # (1-indexed), BASE_NONE or BASE_LAST.
+ bool fast; ///< Can be run in |api-fast| events
VimLFunc func; ///< Function implementation.
FunPtr data; ///< Userdata for function implementation.
} EvalFuncDef;
diff --git a/src/nvim/generators/gen_eval.lua b/src/nvim/generators/gen_eval.lua
index f094a04c07..c72249161b 100644
--- a/src/nvim/generators/gen_eval.lua
+++ b/src/nvim/generators/gen_eval.lua
@@ -61,10 +61,11 @@ for _, name in ipairs(neworder) do
local base = def.base or "BASE_NONE"
local func = def.func or ('f_' .. name)
local data = def.data or "NULL"
- hashpipe:write((' { "%s", %s, %s, %s, &%s, (FunPtr)%s },\n')
- :format(name, args[1], args[2], base, func, data))
+ local fast = def.fast and 'true' or 'false'
+ hashpipe:write((' { "%s", %s, %s, %s, %s, &%s, (FunPtr)%s },\n')
+ :format(name, args[1], args[2], base, fast, func, data))
end
-hashpipe:write(' { NULL, 0, 0, BASE_NONE, NULL, NULL },\n')
+hashpipe:write(' { NULL, 0, 0, BASE_NONE, false, NULL, NULL },\n')
hashpipe:write("};\n\n")
hashpipe:write(hashfun)
hashpipe:close()
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index 9758cee0a5..c2d76e3ce8 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -916,12 +916,22 @@ int nlua_in_fast_event(lua_State *lstate)
return 1;
}
+static bool viml_func_is_fast(const char *name)
+{
+ const EvalFuncDef *const fdef = find_internal_func((const char *)name);
+ if (fdef) {
+ return fdef->fast;
+ }
+ // Not a vimL function
+ return false;
+}
+
int nlua_call(lua_State *lstate)
{
Error err = ERROR_INIT;
size_t name_len;
const char *name = luaL_checklstring(lstate, 1, &name_len);
- if (!nlua_is_deferred_safe()) {
+ if (!nlua_is_deferred_safe() && !viml_func_is_fast(name)) {
return luaL_error(lstate, e_luv_api_disabled, "vimL function");
}