summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-08-14 14:01:05 +0200
committerBram Moolenaar <Bram@vim.org>2021-08-14 14:01:05 +0200
commit88c89c77229e725ab2613b022249e2f506d82b82 (patch)
tree13d6d797ce01be15745d0b61b46ad8bdb23c4a5f
parent78a9c2e670d29349404b346e0aa90264cab19e9b (diff)
downloadvim-git-88c89c77229e725ab2613b022249e2f506d82b82.tar.gz
patch 8.2.3341: Vim9: function call aborted despite try/catchv8.2.3341
Problem: Vim9: function call aborted despite try/catch. (Naohiro Ono) Solution: Ignore error caught by try/catch. (closes #8755)
-rw-r--r--src/evalvars.c3
-rw-r--r--src/globals.h4
-rw-r--r--src/message.c2
-rw-r--r--src/testdir/test_vim9_func.vim46
-rw-r--r--src/testdir/vim9.vim2
-rw-r--r--src/time.c4
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c12
8 files changed, 63 insertions, 12 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index 721b688d5..86a669404 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1193,7 +1193,8 @@ list_arg_vars(exarg_T *eap, char_u *arg, int *first)
if (!VIM_ISWHITE(*arg) && !ends_excmd(*arg))
{
emsg_severe = TRUE;
- semsg(_(e_trailing_arg), arg);
+ if (!error)
+ semsg(_(e_trailing_arg), arg);
break;
}
}
diff --git a/src/globals.h b/src/globals.h
index f09ad482f..6d9741b6a 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -238,8 +238,8 @@ EXTERN int did_emsg_def; // set by emsg() when emsg_silent
EXTERN int did_emsg_cumul; // cumulative did_emsg, increased
// when did_emsg is reset.
EXTERN int called_vim_beep; // set if vim_beep() is called
-EXTERN int did_uncaught_emsg; // emsg() was called and did not
- // cause an exception
+EXTERN int uncaught_emsg; // number of times emsg() was
+ // called and did show a message
#endif
EXTERN int did_emsg_syntax; // did_emsg set because of a
// syntax error
diff --git a/src/message.c b/src/message.c
index 23b84fa83..bb0dbb2bd 100644
--- a/src/message.c
+++ b/src/message.c
@@ -733,7 +733,7 @@ emsg_core(char_u *s)
flush_buffers(FLUSH_MINIMAL); // flush internal buffers
++did_emsg; // flag for DoOneCmd()
#ifdef FEAT_EVAL
- did_uncaught_emsg = TRUE;
+ ++uncaught_emsg;
#endif
}
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index f8d3f59b2..cc7132aac 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -160,6 +160,52 @@ def Test_autoload_names()
delete(dir, 'rf')
enddef
+def Test_autoload_error_in_script()
+ var dir = 'Xdir/autoload'
+ mkdir(dir, 'p')
+
+ var lines =<< trim END
+ func scripterror#function()
+ let g:called_function = 'yes'
+ endfunc
+ let 0 = 1
+ END
+ writefile(lines, dir .. '/scripterror.vim')
+
+ var save_rtp = &rtp
+ exe 'set rtp=' .. getcwd() .. '/Xdir'
+
+ g:called_function = 'no'
+ # The error in the autoload script cannot be checked with assert_fails(), use
+ # CheckDefSuccess() instead of CheckDefFailure()
+ try
+ CheckDefSuccess(['scripterror#function()'])
+ catch
+ assert_match('E121: Undefined variable: 0', v:exception)
+ endtry
+ assert_equal('no', g:called_function)
+
+ lines =<< trim END
+ func scriptcaught#function()
+ let g:called_function = 'yes'
+ endfunc
+ try
+ let 0 = 1
+ catch
+ let g:caught = v:exception
+ endtry
+ END
+ writefile(lines, dir .. '/scriptcaught.vim')
+
+ g:called_function = 'no'
+ CheckDefSuccess(['scriptcaught#function()'])
+ assert_match('E121: Undefined variable: 0', g:caught)
+ assert_equal('yes', g:called_function)
+
+ &rtp = save_rtp
+ delete(dir, 'rf')
+enddef
+
def CallRecursive(n: number): number
return CallRecursive(n + 1)
enddef
diff --git a/src/testdir/vim9.vim b/src/testdir/vim9.vim
index 742a0932b..a40b444b3 100644
--- a/src/testdir/vim9.vim
+++ b/src/testdir/vim9.vim
@@ -12,10 +12,10 @@ func CheckDefSuccess(lines)
try
exe 'so ' .. fname
call Func()
- delfunc! Func
finally
call chdir(cwd)
call delete(fname)
+ delfunc! Func
endtry
endfunc
diff --git a/src/time.c b/src/time.c
index ecd884f0f..ab1269198 100644
--- a/src/time.c
+++ b/src/time.c
@@ -520,6 +520,7 @@ check_due_timer(void)
int save_timer_busy = timer_busy;
int save_vgetc_busy = vgetc_busy;
int save_did_emsg = did_emsg;
+ int prev_uncaught_emsg = uncaught_emsg;
int save_called_emsg = called_emsg;
int save_must_redraw = must_redraw;
int save_trylevel = trylevel;
@@ -536,7 +537,6 @@ check_due_timer(void)
vgetc_busy = 0;
called_emsg = 0;
did_emsg = FALSE;
- did_uncaught_emsg = FALSE;
must_redraw = 0;
trylevel = 0;
did_throw = FALSE;
@@ -555,7 +555,7 @@ check_due_timer(void)
did_one = TRUE;
timer_busy = save_timer_busy;
vgetc_busy = save_vgetc_busy;
- if (did_uncaught_emsg)
+ if (uncaught_emsg > prev_uncaught_emsg)
++timer->tr_emsg_count;
did_emsg = save_did_emsg;
called_emsg = save_called_emsg;
diff --git a/src/version.c b/src/version.c
index 87c315a7c..e49611216 100644
--- 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 */
/**/
+ 3341,
+/**/
3340,
/**/
3339,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 04d5e5f27..4562a08bf 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -844,12 +844,13 @@ may_restore_cmdmod(funclocal_T *funclocal)
}
/*
- * Return TRUE if an error was given or CTRL-C was pressed.
+ * Return TRUE if an error was given (not caught in try/catch) or CTRL-C was
+ * pressed.
*/
static int
-vim9_aborting(int prev_called_emsg)
+vim9_aborting(int prev_uncaught_emsg)
{
- return called_emsg > prev_called_emsg || got_int || did_throw;
+ return uncaught_emsg > prev_uncaught_emsg || got_int || did_throw;
}
/*
@@ -882,12 +883,13 @@ call_by_name(
if (ufunc == NULL)
{
- int called_emsg_before = called_emsg;
+ int prev_uncaught_emsg = uncaught_emsg;
if (script_autoload(name, TRUE))
// loaded a package, search for the function again
ufunc = find_func(name, FALSE, NULL);
- if (vim9_aborting(called_emsg_before))
+
+ if (vim9_aborting(prev_uncaught_emsg))
return FAIL; // bail out if loading the script caused an error
}