mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	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 vim/vim#12207)
2d68b722e3
			
			
This commit is contained in:
		| @@ -2398,8 +2398,18 @@ void f_getscriptinfo(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) | |||||||
|  |  | ||||||
|   char *pat = NULL; |   char *pat = NULL; | ||||||
|   if (argvars[0].v_type == VAR_DICT) { |   if (argvars[0].v_type == VAR_DICT) { | ||||||
|     sid = tv_dict_get_number_def(argvars[0].vval.v_dict, "sid", -1); |     dictitem_T *sid_di = tv_dict_find(argvars[0].vval.v_dict, S_LEN("sid")); | ||||||
|     if (sid == -1) { |     if (sid_di != NULL) { | ||||||
|  |       bool error = false; | ||||||
|  |       sid = tv_get_number_chk(&sid_di->di_tv, &error); | ||||||
|  |       if (error) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |       if (sid <= 0) { | ||||||
|  |         semsg(e_invargNval, "sid", tv_get_string(&sid_di->di_tv)); | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|       pat = tv_dict_get_string(argvars[0].vval.v_dict, "name", true); |       pat = tv_dict_get_string(argvars[0].vval.v_dict, "name", true); | ||||||
|       if (pat != NULL) { |       if (pat != NULL) { | ||||||
|         regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); |         regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); | ||||||
| @@ -2410,7 +2420,8 @@ void f_getscriptinfo(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   for (int 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); |     scriptitem_T *si = SCRIPT_ITEM(i); | ||||||
|  |  | ||||||
|     if (si->sn_name == NULL) { |     if (si->sn_name == NULL) { | ||||||
| @@ -2421,10 +2432,6 @@ void f_getscriptinfo(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) | |||||||
|       continue; |       continue; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (sid != -1 && sid != i) { |  | ||||||
|       continue; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     dict_T *d = tv_dict_alloc(); |     dict_T *d = tv_dict_alloc(); | ||||||
|     tv_list_append_dict(l, d); |     tv_list_append_dict(l, d); | ||||||
|     tv_dict_add_str(d, S_LEN("name"), si->sn_name); |     tv_dict_add_str(d, S_LEN("name"), si->sn_name); | ||||||
| @@ -2433,10 +2440,9 @@ void f_getscriptinfo(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) | |||||||
|     // Vim9 autoload script (:h vim9-autoload), not applicable to Nvim. |     // Vim9 autoload script (:h vim9-autoload), not applicable to Nvim. | ||||||
|     tv_dict_add_bool(d, S_LEN("autoload"), false); |     tv_dict_add_bool(d, S_LEN("autoload"), false); | ||||||
|  |  | ||||||
|     // When a filter pattern is specified to return information about only |     // When a script ID is specified, return information about only the | ||||||
|     // specific script(s), also add the script-local variables and |     // specified script, and add the script-local variables and functions. | ||||||
|     // functions. |     if (sid > 0) { | ||||||
|     if (sid != -1) { |  | ||||||
|       dict_T *var_dict = tv_dict_copy(NULL, &si->sn_vars->sv_dict, true, get_copyID()); |       dict_T *var_dict = tv_dict_copy(NULL, &si->sn_vars->sv_dict, true, get_copyID()); | ||||||
|       tv_dict_add_dict(d, S_LEN("variables"), var_dict); |       tv_dict_add_dict(d, S_LEN("variables"), var_dict); | ||||||
|       tv_dict_add_list(d, S_LEN("functions"), get_script_local_funcs((scid_T)sid)); |       tv_dict_add_list(d, S_LEN("functions"), get_script_local_funcs((scid_T)sid)); | ||||||
|   | |||||||
| @@ -93,6 +93,16 @@ func Test_getscriptinfo() | |||||||
|   call assert_fails("echo getscriptinfo('foobar')", 'E1206:') |   call assert_fails("echo getscriptinfo('foobar')", 'E1206:') | ||||||
|  |  | ||||||
|   call assert_fails("echo getscriptinfo({'sid': []})", 'E745:') |   call assert_fails("echo getscriptinfo({'sid': []})", 'E745:') | ||||||
|  |   call assert_fails("echo getscriptinfo({'sid': {}})", 'E728:') | ||||||
|  |   call assert_fails("echo getscriptinfo({'sid': 0})", 'E475:') | ||||||
|  |   call assert_fails("echo getscriptinfo({'sid': -1})", 'E475:') | ||||||
|  |   call assert_fails("echo getscriptinfo({'sid': -999})", 'E475:') | ||||||
|  |  | ||||||
|  |   echo getscriptinfo({'sid': '1'}) | ||||||
|  |   " call assert_fails("vim9cmd echo getscriptinfo({'sid': '1'})", 'E1030:') | ||||||
|  |  | ||||||
|  |   let max_sid = max(map(getscriptinfo(), { k, v -> v.sid })) | ||||||
|  |   call assert_equal([], getscriptinfo({'sid': max_sid + 1})) | ||||||
|  |  | ||||||
|   call delete('X22script91') |   call delete('X22script91') | ||||||
| endfunc | endfunc | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 zeertzjq
					zeertzjq