summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-02-24 12:27:31 +0100
committerBram Moolenaar <Bram@vim.org>2021-02-24 12:27:31 +0100
commit1bd3cb201983859d86d644eef9e98cd3e9de7261 (patch)
treeee3f13fbf143ddcfa42ea83d7ef094c15ac98e4f
parent7d41410a455ba62128655beb91c35d3fba299287 (diff)
patch 8.2.2549: crash after using "g:" in a for loopv8.2.2549
Problem: Crash after using "g:" in a for loop. Solution: Increment the reference count. (closes #7892)
-rw-r--r--src/testdir/test_vim9_expr.vim6
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c1
3 files changed, 9 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index 3e69a0dd46..cda1ffdb4f 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -2545,6 +2545,12 @@ def Test_expr7_namespace()
assert_equal('some', get(t:, 'some_var', 'xxx'))
assert_equal('xxx', get(t:, 'no_var', 'xxx'))
unlet t:some_var
+
+ # check using g: in a for loop more than DO_NOT_FREE_CNT times
+ for i in range(100000)
+ if has_key(g:, 'does-not-exist')
+ endif
+ endfor
enddef
def Test_expr7_parens()
diff --git a/src/version.c b/src/version.c
index 3d52e4967c..ff82645516 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2549,
+/**/
2548,
/**/
2547,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 232f0471ea..e20c71105d 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1771,6 +1771,7 @@ call_def_function(
tv->v_type = VAR_DICT;
tv->v_lock = 0;
tv->vval.v_dict = d;
+ ++d->dv_refcount;
++ectx.ec_stack.ga_len;
}
break;