mirror of
https://github.com/neovim/neovim.git
synced 2024-12-23 12:45:17 -07:00
Merge pull request #27030 from neovim/backport-27029-to-release-0.9
[Backport release-0.9] vim-patch:8.1.1968: crash when using nested map()
This commit is contained in:
commit
f58c613508
@ -978,17 +978,19 @@ bool is_compatht(const hashtab_T *ht)
|
||||
}
|
||||
|
||||
/// Prepare v: variable "idx" to be used.
|
||||
/// Save the current typeval in "save_tv".
|
||||
/// Save the current typeval in "save_tv" and clear it.
|
||||
/// When not used yet add the variable to the v: hashtable.
|
||||
void prepare_vimvar(int idx, typval_T *save_tv)
|
||||
{
|
||||
*save_tv = vimvars[idx].vv_tv;
|
||||
vimvars[idx].vv_str = NULL; // don't free it now
|
||||
if (vimvars[idx].vv_type == VAR_UNKNOWN) {
|
||||
hash_add(&vimvarht, vimvars[idx].vv_di.di_key);
|
||||
}
|
||||
}
|
||||
|
||||
/// Restore v: variable "idx" to typeval "save_tv".
|
||||
/// Note that the v: variable must have been cleared already.
|
||||
/// When no longer defined, remove the variable from the v: hashtable.
|
||||
void restore_vimvar(int idx, typval_T *save_tv)
|
||||
{
|
||||
|
@ -54,6 +54,15 @@ func Test_filter_map_list_expr_funcref()
|
||||
call assert_equal([0, 2, 4, 6], map([1, 2, 3, 4], function('s:filter4')))
|
||||
endfunc
|
||||
|
||||
func Test_filter_map_nested()
|
||||
let x = {"x":10}
|
||||
let r = map(range(2), 'filter(copy(x), "1")')
|
||||
call assert_equal([x, x], r)
|
||||
|
||||
let r = map(copy(x), 'filter(copy(x), "1")')
|
||||
call assert_equal({"x": x}, r)
|
||||
endfunc
|
||||
|
||||
" dict with funcref
|
||||
func Test_filter_map_dict_expr_funcref()
|
||||
let dict = {"foo": 1, "bar": 2, "baz": 3}
|
||||
|
@ -1964,6 +1964,10 @@ func Test_readdir()
|
||||
let files = readdir('Xdir', {x -> len(add(l, x)) == 2 ? -1 : 1})
|
||||
call assert_equal(1, len(files))
|
||||
|
||||
" Nested readdir() must not crash
|
||||
let files = readdir('Xdir', 'readdir("Xdir", "1") != []')
|
||||
call sort(files)->assert_equal(['bar.txt', 'dir', 'foo.txt'])
|
||||
|
||||
eval 'Xdir'->delete('rf')
|
||||
endfunc
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user