fix(api): notify dict watchers on nvim_set_var and vim.g setter

Co-authored-by: bfredl <bjorn.linse@gmail.com>
Co-authored-by: Christian Clason <c.clason@uni-graz.at>
This commit is contained in:
smolck
2021-08-14 12:19:05 -05:00
committed by bfredl
parent 1d337d4e2f
commit c7d30c152d
5 changed files with 103 additions and 7 deletions

View File

@@ -369,12 +369,19 @@ int nlua_setvar(lua_State *lstate)
return 0;
}
bool watched = tv_dict_is_watched(dict);
if (del) {
// Delete the key
if (di == NULL) {
// Doesn't exist, nothing to do
return 0;
} else {
// Notify watchers
if (watched) {
tv_dict_watcher_notify(dict, key.data, NULL, &di->di_tv);
}
// Delete the entry
tv_dict_item_remove(dict, di);
}
@@ -388,17 +395,29 @@ int nlua_setvar(lua_State *lstate)
return luaL_error(lstate, "Couldn't convert lua value");
}
typval_T oldtv = TV_INITIAL_VALUE;
if (di == NULL) {
// Need to create an entry
di = tv_dict_item_alloc_len(key.data, key.size);
tv_dict_add(dict, di);
} else {
if (watched) {
tv_copy(&di->di_tv, &oldtv);
}
// Clear the old value
tv_clear(&di->di_tv);
}
// Update the value
tv_copy(&tv, &di->di_tv);
// Notify watchers
if (watched) {
tv_dict_watcher_notify(dict, key.data, &tv, &oldtv);
tv_clear(&oldtv);
}
// Clear the temporary variable
tv_clear(&tv);
}