aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/lua/executor.c
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2024-02-24 10:17:20 +0100
committerbfredl <bjorn.linse@gmail.com>2024-02-25 11:20:06 +0100
commit77e928fd3e92f35182237b663437d7ebde7ebde7 (patch)
treed516508d050cbd7f1d25682e1764fe214e9282e9 /src/nvim/lua/executor.c
parent0fcbda59871ebc5fc91cac7fa430a4a93f6698c2 (diff)
downloadrneovim-77e928fd3e92f35182237b663437d7ebde7ebde7.tar.gz
rneovim-77e928fd3e92f35182237b663437d7ebde7ebde7.tar.bz2
rneovim-77e928fd3e92f35182237b663437d7ebde7ebde7.zip
refactor(fileio): remove API shell layer encouraging unnecessary allocations
Functions like file_open_new() and file_open_fd_new() which just is a wrapper around the real functions but with an extra xmalloc/xfree around is an anti-pattern. If the caller really needs to allocate a FileDescriptor as a heap object, it can do that directly. FileDescriptor by itself is pretty much a pointer, or rather two: the OS fd index and a pointer to a buffer. So most of the time an extra pointer layer is just wasteful. In the case of scriptin[curscript] in getchar.c, curscript used to mean in practice: N+1 open scripts when curscript>0 zero or one open scripts when curscript==0 Which means scriptin[0] had to be compared to NULL to disambiguate the curscript=0 case. Instead, use curscript==-1 to mean that are no script, then all pointer comparisons dissappear and we can just use an array of structs without extra pointers.
Diffstat (limited to 'src/nvim/lua/executor.c')
-rw-r--r--src/nvim/lua/executor.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index 58f329b76f..3859dd922a 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -1828,7 +1828,11 @@ bool nlua_exec_file(const char *path)
lua_getglobal(lstate, "loadfile");
lua_pushstring(lstate, path);
} else {
- FileDescriptor *stdin_dup = file_open_stdin();
+ FileDescriptor stdin_dup;
+ int error = file_open_stdin(&stdin_dup);
+ if (error) {
+ return false;
+ }
StringBuilder sb = KV_INITIAL_VALUE;
kv_resize(sb, 64);
@@ -1837,7 +1841,7 @@ bool nlua_exec_file(const char *path)
if (got_int) { // User canceled.
return false;
}
- ptrdiff_t read_size = file_read(stdin_dup, IObuff, 64);
+ ptrdiff_t read_size = file_read(&stdin_dup, IObuff, 64);
if (read_size < 0) { // Error.
return false;
}
@@ -1849,7 +1853,7 @@ bool nlua_exec_file(const char *path)
}
}
kv_push(sb, NUL);
- file_free(stdin_dup, false);
+ file_close(&stdin_dup, false);
lua_getglobal(lstate, "loadstring");
lua_pushstring(lstate, sb.items);