# HG changeset patch # User Bram Moolenaar # Date 1628350203 -7200 # Node ID dc25589bfec004bbff2be7fa309d12363d482b65 # Parent 99ea34936e334a6c89cf07d78ab6415d49e274bb patch 8.2.3311: Vim9: check for DO_NOT_FREE_CNT is very slow Commit: https://github.com/vim/vim/commit/dae453f3397a26a53301d7327e6ed43e8b392035 Author: Bram Moolenaar Date: Sat Aug 7 17:20:16 2021 +0200 patch 8.2.3311: Vim9: check for DO_NOT_FREE_CNT is very slow Problem: Vim9: check for DO_NOT_FREE_CNT is very slow. Solution: Move to a separate function so it can be skipped by setting $TEST_SKIP_PAT. diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim --- a/src/testdir/runtest.vim +++ b/src/testdir/runtest.vim @@ -13,6 +13,9 @@ " For csh: " setenv TEST_FILTER Test_channel " +" If the environment variable $TEST_SKIP_PAT is set then test functions +" matching this pattern will be skipped. It's the opposite of $TEST_FILTER. +" " While working on a test you can make $TEST_NO_RETRY non-empty to not retry: " export TEST_NO_RETRY=yes " @@ -329,13 +332,17 @@ func FinishTesting() if s:done == 0 if s:filtered > 0 - let message = "NO tests match $TEST_FILTER: '" .. $TEST_FILTER .. "'" + if $TEST_FILTER != '' + let message = "NO tests match $TEST_FILTER: '" .. $TEST_FILTER .. "'" + else + let message = "ALL tests match $TEST_SKIP_PAT: '" .. $TEST_SKIP_PAT .. "'" + endif else let message = 'NO tests executed' endif else if s:filtered > 0 - call add(s:messages, "Filtered " .. s:filtered .. " tests with $TEST_FILTER") + call add(s:messages, "Filtered " .. s:filtered .. " tests with $TEST_FILTER and $TEST_SKIP_PAT") endif let message = 'Executed ' . s:done . (s:done > 1 ? ' tests' : ' test') endif @@ -461,6 +468,12 @@ endif " Execute the tests in alphabetical order. for g:testfunc in sort(s:tests) + if $TEST_SKIP_PAT != '' && g:testfunc =~ $TEST_SKIP_PAT + call add(s:messages, g:testfunc .. ' matches $TEST_SKIP_PAT') + let s:filtered += 1 + continue + endif + " Silence, please! set belloff=all let prev_error = '' diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -2832,14 +2832,47 @@ def Test_expr7_namespace() assert_equal('some', get(t:, 'some_var', 'xxx')) assert_equal('xxx', get(t:, 'no_var', 'xxx')) unlet t:some_var - + END + CheckDefAndScriptSuccess(lines) +enddef + +def Test_expr7_namespace_loop_def() + var lines =<< trim END # check using g: in a for loop more than DO_NOT_FREE_CNT times + var exists = 0 + var exists_not = 0 for i in range(100000) if has_key(g:, 'does-not-exist') + exists += 1 + else + exists_not += 1 endif endfor + assert_equal(0, exists) + assert_equal(100000, exists_not) END - CheckDefAndScriptSuccess(lines) + CheckDefSuccess(lines) +enddef + +" NOTE: this is known to be slow. To skip use: +" :let $TEST_SKIP_PAT = 'Test_expr7_namespace_loop_script' +def Test_expr7_namespace_loop_script() + var lines =<< trim END + vim9script + # check using g: in a for loop more than DO_NOT_FREE_CNT times + var exists = 0 + var exists_not = 0 + for i in range(100000) + if has_key(g:, 'does-not-exist') + exists += 1 + else + exists_not += 1 + endif + endfor + assert_equal(0, exists) + assert_equal(100000, exists_not) + END + CheckScriptSuccess(lines) enddef def Test_expr7_parens() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3311, +/**/ 3310, /**/ 3309,