aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/buffer.c
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2019-06-15 15:59:45 +0200
committerGitHub <noreply@github.com>2019-06-15 15:59:45 +0200
commit2f1a653a845680efab1a27f6411e36e8cd2f3696 (patch)
treefa562d5f83dbeb611d91cdf780bc1ce1e75a4408 /src/nvim/api/buffer.c
parent93f8c2793cf5020d6fca00b6f10e4a158578034f (diff)
parent64cdf9f78a9bfd4d08a9d9bf2df48a4b2f296190 (diff)
downloadrneovim-2f1a653a845680efab1a27f6411e36e8cd2f3696.tar.gz
rneovim-2f1a653a845680efab1a27f6411e36e8cd2f3696.tar.bz2
rneovim-2f1a653a845680efab1a27f6411e36e8cd2f3696.zip
Merge pull request #10231 from bfredl/bufcb_end
api/lua: add on_detach to nvim_buf_attach
Diffstat (limited to 'src/nvim/api/buffer.c')
-rw-r--r--src/nvim/api/buffer.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c
index 81b3851c53..b0b65545ab 100644
--- a/src/nvim/api/buffer.c
+++ b/src/nvim/api/buffer.c
@@ -12,6 +12,7 @@
#include "nvim/api/buffer.h"
#include "nvim/api/private/helpers.h"
#include "nvim/api/private/defs.h"
+#include "nvim/lua/executor.h"
#include "nvim/vim.h"
#include "nvim/buffer.h"
#include "nvim/charset.h"
@@ -137,24 +138,38 @@ Boolean nvim_buf_attach(uint64_t channel_id,
if (is_lua && strequal("on_lines", k.data)) {
if (v->type != kObjectTypeLuaRef) {
api_set_error(err, kErrorTypeValidation, "callback is not a function");
- return false;
+ goto error;
}
cb.on_lines = v->data.luaref;
v->data.integer = LUA_NOREF;
} else if (is_lua && strequal("on_changedtick", k.data)) {
if (v->type != kObjectTypeLuaRef) {
api_set_error(err, kErrorTypeValidation, "callback is not a function");
- return false;
+ goto error;
}
cb.on_changedtick = v->data.luaref;
v->data.integer = LUA_NOREF;
+ } else if (is_lua && strequal("on_detach", k.data)) {
+ if (v->type != kObjectTypeLuaRef) {
+ api_set_error(err, kErrorTypeValidation, "callback is not a function");
+ goto error;
+ }
+ cb.on_detach = v->data.luaref;
+ v->data.integer = LUA_NOREF;
} else {
api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data);
- return false;
+ goto error;
}
}
return buf_updates_register(buf, channel_id, cb, send_buffer);
+
+error:
+ // TODO(bfredl): ASAN build should check that the ref table is empty?
+ executor_free_luaref(cb.on_lines);
+ executor_free_luaref(cb.on_changedtick);
+ executor_free_luaref(cb.on_detach);
+ return false;
}
/// Deactivates buffer-update events on the channel.