neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 1ca2247639424994890ef70ab34f2bffa23ddd9f
parent a10a23aae91a8356b36ac63f0917a556cfcaf976
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Sat, 13 Aug 2022 17:52:04 +0800

vim-patch:8.2.0823: Vim9: script reload test is disabled

Problem:    Vim9: script reload test is disabled.
Solution:   Compile a function in the context of the script where it was
            defined.  Set execution stack for compiled function.  Add a test
            that an error is reported for the right file/function.
https://github.com/vim/vim/commit/25e0f5863e9010a75a1ff0d04e8f886403968755

Omit stack_top_is_ufunc(): only used by Vim9 script.

Diffstat:
Msrc/nvim/eval/userfunc.c | 2+-
Msrc/nvim/ex_eval.c | 21+++++++++++++++++----
Msrc/nvim/ex_eval_defs.h | 6++++--
Msrc/nvim/runtime.c | 4++--
4 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/src/nvim/eval/userfunc.c b/src/nvim/eval/userfunc.c @@ -1015,7 +1015,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett sandbox++; } - estack_push_ufunc(ETYPE_UFUNC, fp, 1); + estack_push_ufunc(fp, 1); if (p_verbose >= 12) { ++no_wait_return; verbose_enter_scroll(); diff --git a/src/nvim/ex_eval.c b/src/nvim/ex_eval.c @@ -275,6 +275,11 @@ bool cause_errthrow(const char *mesg, bool severe, bool *ignore) (*msg_list)->throw_msg = tmsg; } } + + // Get the source name and lnum now, it may change before + // reaching do_errthrow(). + elem->sfile = estack_sfile(); + elem->slnum = SOURCING_LNUM; } return true; } @@ -289,6 +294,7 @@ static void free_msglist(msglist_T *l) while (messages != NULL) { next = messages->next; xfree(messages->msg); + xfree(messages->sfile); xfree(messages); messages = next; } @@ -478,11 +484,18 @@ static int throw_exception(void *value, except_type_T type, char *cmdname) } excp->type = type; - excp->throw_name = estack_sfile(); - if (excp->throw_name == NULL) { - excp->throw_name = xstrdup(""); + if (type == ET_ERROR && ((msglist_T *)value)->sfile != NULL) { + msglist_T *entry = (msglist_T *)value; + excp->throw_name = entry->sfile; + entry->sfile = NULL; + excp->throw_lnum = entry->slnum; + } else { + excp->throw_name = estack_sfile(); + if (excp->throw_name == NULL) { + excp->throw_name = xstrdup(""); + } + excp->throw_lnum = SOURCING_LNUM; } - excp->throw_lnum = SOURCING_LNUM; if (p_verbose >= 13 || debug_break_level > 0) { int save_msg_silent = msg_silent; diff --git a/src/nvim/ex_eval_defs.h b/src/nvim/ex_eval_defs.h @@ -38,11 +38,13 @@ enum { /// A list of error messages that can be converted to an exception. "throw_msg" /// is only set in the first element of the list. Usually, it points to the /// original message stored in that element, but sometimes it points to a later -/// message in the list. See cause_errthrow() below. +/// message in the list. See cause_errthrow(). typedef struct msglist msglist_T; struct msglist { - char *msg; ///< original message + char *msg; ///< original message, allocated char *throw_msg; ///< msg to throw: usually original one + char *sfile; ///< value from estack_sfile(), allocated + linenr_T slnum; ///< line number for "sfile" msglist_T *next; ///< next of several messages in a row }; diff --git a/src/nvim/runtime.c b/src/nvim/runtime.c @@ -80,9 +80,9 @@ estack_T *estack_push(etype_T type, char *name, linenr_T lnum) } /// Add a user function to the execution stack. -void estack_push_ufunc(etype_T type, ufunc_T *ufunc, linenr_T lnum) +void estack_push_ufunc(ufunc_T *ufunc, linenr_T lnum) { - estack_T *entry = estack_push(type, + estack_T *entry = estack_push(ETYPE_UFUNC, (char *)(ufunc->uf_name_exp != NULL ? ufunc->uf_name_exp : ufunc->uf_name), lnum);