Mercurial > vim
diff src/vim9execute.c @ 22621:576a69fc0066 v8.2.1859
patch 8.2.1859: Vim9: crash in unpack assignment
Commit: https://github.com/vim/vim/commit/352134bbfbff4831a3f6a3383d9e2d8660016243
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Oct 17 22:04:08 2020 +0200
patch 8.2.1859: Vim9: crash in unpack assignment
Problem: Vim9: crash in unpack assignment.
Solution: Make sure an error message is turned into an exception.
(closes #7159)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 17 Oct 2020 22:15:03 +0200 |
parents | 048a3033d19c |
children | 672ee41a6a3b |
line wrap: on
line diff
--- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -830,6 +830,8 @@ call_def_function( int breakcheck_count = 0; int called_emsg_before = called_emsg; int save_suppress_errthrow = suppress_errthrow; + msglist_T **saved_msg_list = NULL; + msglist_T *private_msg_list = NULL; // Get pointer to item in the stack. #define STACK_TV(idx) (((typval_T *)ectx.ec_stack.ga_data) + idx) @@ -982,6 +984,11 @@ call_def_function( current_sctx = ufunc->uf_script_ctx; current_sctx.sc_version = SCRIPT_VERSION_VIM9; + // Use a specific location for storing error messages to be converted to an + // exception. + saved_msg_list = msg_list; + msg_list = &private_msg_list; + // Do turn errors into exceptions. suppress_errthrow = FALSE; @@ -2819,6 +2826,19 @@ failed: estack_pop(); current_sctx = save_current_sctx; + if (*msg_list != NULL && saved_msg_list != NULL) + { + msglist_T **plist = saved_msg_list; + + // Append entries from the current msg_list (uncaught exceptions) to + // the saved msg_list. + while (*plist != NULL) + plist = &(*plist)->next; + + *plist = *msg_list; + } + msg_list = saved_msg_list; + failed_early: // Free all local variables, but not arguments. for (idx = 0; idx < ectx.ec_stack.ga_len; ++idx)