mirror of
https://github.com/neovim/neovim.git
synced 2025-09-14 23:38:17 +00:00
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.
25e0f5863e
Omit stack_top_is_ufunc(): only used by Vim9 script.
This commit is contained in:
@@ -1015,7 +1015,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett
|
|||||||
sandbox++;
|
sandbox++;
|
||||||
}
|
}
|
||||||
|
|
||||||
estack_push_ufunc(ETYPE_UFUNC, fp, 1);
|
estack_push_ufunc(fp, 1);
|
||||||
if (p_verbose >= 12) {
|
if (p_verbose >= 12) {
|
||||||
++no_wait_return;
|
++no_wait_return;
|
||||||
verbose_enter_scroll();
|
verbose_enter_scroll();
|
||||||
|
@@ -275,6 +275,11 @@ bool cause_errthrow(const char *mesg, bool severe, bool *ignore)
|
|||||||
(*msg_list)->throw_msg = tmsg;
|
(*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;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -289,6 +294,7 @@ static void free_msglist(msglist_T *l)
|
|||||||
while (messages != NULL) {
|
while (messages != NULL) {
|
||||||
next = messages->next;
|
next = messages->next;
|
||||||
xfree(messages->msg);
|
xfree(messages->msg);
|
||||||
|
xfree(messages->sfile);
|
||||||
xfree(messages);
|
xfree(messages);
|
||||||
messages = next;
|
messages = next;
|
||||||
}
|
}
|
||||||
@@ -478,11 +484,18 @@ static int throw_exception(void *value, except_type_T type, char *cmdname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
excp->type = type;
|
excp->type = type;
|
||||||
|
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();
|
excp->throw_name = estack_sfile();
|
||||||
if (excp->throw_name == NULL) {
|
if (excp->throw_name == NULL) {
|
||||||
excp->throw_name = xstrdup("");
|
excp->throw_name = xstrdup("");
|
||||||
}
|
}
|
||||||
excp->throw_lnum = SOURCING_LNUM;
|
excp->throw_lnum = SOURCING_LNUM;
|
||||||
|
}
|
||||||
|
|
||||||
if (p_verbose >= 13 || debug_break_level > 0) {
|
if (p_verbose >= 13 || debug_break_level > 0) {
|
||||||
int save_msg_silent = msg_silent;
|
int save_msg_silent = msg_silent;
|
||||||
|
@@ -38,11 +38,13 @@ enum {
|
|||||||
/// A list of error messages that can be converted to an exception. "throw_msg"
|
/// 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
|
/// 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
|
/// 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;
|
typedef struct msglist msglist_T;
|
||||||
struct msglist {
|
struct msglist {
|
||||||
char *msg; ///< original message
|
char *msg; ///< original message, allocated
|
||||||
char *throw_msg; ///< msg to throw: usually original one
|
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
|
msglist_T *next; ///< next of several messages in a row
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -80,9 +80,9 @@ estack_T *estack_push(etype_T type, char *name, linenr_T lnum)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Add a user function to the execution stack.
|
/// 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
|
(char *)(ufunc->uf_name_exp != NULL
|
||||||
? ufunc->uf_name_exp : ufunc->uf_name),
|
? ufunc->uf_name_exp : ufunc->uf_name),
|
||||||
lnum);
|
lnum);
|
||||||
|
Reference in New Issue
Block a user