1
0
forked from aniani/vim

patch 9.0.1431: getscriptinfo() loops even when specific SID is given

Problem:    getscriptinfo() loops even when specific SID is given.
Solution:   Only loop when needed.  Give a clearer error message.
            (closes #12207)
This commit is contained in:
zeertzjq
2023-03-30 21:50:37 +01:00
committed by Bram Moolenaar
parent 6400203517
commit 2d68b722e3
3 changed files with 34 additions and 12 deletions

View File

@@ -1299,7 +1299,7 @@ ex_options(
* ":source" and associated commands.
*/
#ifdef FEAT_EVAL
#if defined(FEAT_EVAL) || defined(PROTO)
/*
* Return the address holding the next breakpoint line for a source cookie.
*/
@@ -2096,7 +2096,6 @@ get_script_local_funcs(scid_T sid)
void
f_getscriptinfo(typval_T *argvars, typval_T *rettv)
{
int i;
list_T *l;
char_u *pat = NULL;
regmatch_T regmatch;
@@ -2116,8 +2115,22 @@ f_getscriptinfo(typval_T *argvars, typval_T *rettv)
if (argvars[0].v_type == VAR_DICT)
{
sid = dict_get_number_def(argvars[0].vval.v_dict, "sid", -1);
if (sid == -1)
dictitem_T *sid_di = dict_find(argvars[0].vval.v_dict,
(char_u *)"sid", 3);
if (sid_di != NULL)
{
int error = FALSE;
sid = tv_get_number_chk(&sid_di->di_tv, &error);
if (error)
return;
if (sid <= 0)
{
semsg(e_invalid_value_for_argument_str_str, "sid",
tv_get_string(&sid_di->di_tv));
return;
}
}
else
{
pat = dict_get_string(argvars[0].vval.v_dict, "name", TRUE);
if (pat != NULL)
@@ -2127,7 +2140,8 @@ f_getscriptinfo(typval_T *argvars, typval_T *rettv)
}
}
for (i = 1; i <= script_items.ga_len; ++i)
for (varnumber_T i = sid > 0 ? sid : 1;
(i == sid || sid <= 0) && i <= script_items.ga_len; ++i)
{
scriptitem_T *si = SCRIPT_ITEM(i);
dict_T *d;
@@ -2138,9 +2152,6 @@ f_getscriptinfo(typval_T *argvars, typval_T *rettv)
if (filterpat && !vim_regexec(&regmatch, si->sn_name, (colnr_T)0))
continue;
if (sid != -1 && sid != i)
continue;
if ((d = dict_alloc()) == NULL
|| list_append_dict(l, d) == FAIL
|| dict_add_string(d, "name", si->sn_name) == FAIL
@@ -2151,10 +2162,9 @@ f_getscriptinfo(typval_T *argvars, typval_T *rettv)
si->sn_state == SN_STATE_NOT_LOADED) == FAIL)
return;
// When a filter pattern is specified to return information about only
// specific script(s), also add the script-local variables and
// functions.
if (sid != -1)
// When a script ID is specified, return information about only the
// specified script, and add the script-local variables and functions.
if (sid > 0)
{
dict_T *var_dict;