Skip to content

Commit 04c4c57

Browse files
yegappanbrammool
authored andcommitted
patch 9.0.0335: checks for Dictionary argument often give a vague error
Problem: Checks for Dictionary argument often give a vague error message. Solution: Give a useful error message. (Yegappan Lakshmanan, closes #11009)
1 parent f240395 commit 04c4c57

32 files changed

Lines changed: 124 additions & 179 deletions

src/channel.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,11 +1392,8 @@ channel_open_func(typval_T *argvars)
13921392

13931393
address = tv_get_string(&argvars[0]);
13941394
if (argvars[1].v_type != VAR_UNKNOWN
1395-
&& (argvars[1].v_type != VAR_DICT || argvars[1].vval.v_dict == NULL))
1396-
{
1397-
emsg(_(e_invalid_argument));
1395+
&& check_for_nonnull_dict_arg(argvars, 1) == FAIL)
13981396
return NULL;
1399-
}
14001397

14011398
if (*address == NUL)
14021399
{
@@ -4601,11 +4598,9 @@ ch_expr_common(typval_T *argvars, typval_T *rettv, int eval)
46014598
if (rettv_dict_alloc(rettv) == FAIL)
46024599
return;
46034600

4604-
if (argvars[1].v_type != VAR_DICT)
4605-
{
4606-
semsg(_(e_dict_required_for_argument_nr), 2);
4601+
if (check_for_dict_arg(argvars, 1) == FAIL)
46074602
return;
4608-
}
4603+
46094604
d = argvars[1].vval.v_dict;
46104605
di = dict_find(d, (char_u *)"id", -1);
46114606
if (di != NULL && di->di_tv.v_type != VAR_NUMBER)

src/dict.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1578,11 +1578,9 @@ f_has_key(typval_T *argvars, typval_T *rettv)
15781578
|| check_for_string_or_number_arg(argvars, 1) == FAIL))
15791579
return;
15801580

1581-
if (argvars[0].v_type != VAR_DICT)
1582-
{
1583-
emsg(_(e_dictionary_required));
1581+
if (check_for_dict_arg(argvars, 0) == FAIL)
15841582
return;
1585-
}
1583+
15861584
if (argvars[0].vval.v_dict == NULL)
15871585
return;
15881586

src/errors.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3318,3 +3318,5 @@ EXTERN char e_cannot_specify_both_type_and_types[]
33183318
EXTERN char e_can_only_use_left_padding_when_column_is_zero[]
33193319
INIT(= N_("E1296: Can only use left padding when column is zero"));
33203320
#endif
3321+
EXTERN char e_non_null_dict_required_for_argument_nr[]
3322+
INIT(= N_("E1297: Non-NULL Dictionary required for argument %d"));

src/evalfunc.c

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3277,11 +3277,9 @@ f_call(typval_T *argvars, typval_T *rettv)
32773277

32783278
if (argvars[2].v_type != VAR_UNKNOWN)
32793279
{
3280-
if (argvars[2].v_type != VAR_DICT)
3281-
{
3282-
emsg(_(e_dictionary_required));
3280+
if (check_for_dict_arg(argvars, 2) == FAIL)
32833281
return;
3284-
}
3282+
32853283
selfdict = argvars[2].vval.v_dict;
32863284
}
32873285

@@ -4501,9 +4499,8 @@ common_function(typval_T *argvars, typval_T *rettv, int is_funcref)
45014499
arg_idx = 1;
45024500
if (dict_idx > 0)
45034501
{
4504-
if (argvars[dict_idx].v_type != VAR_DICT)
4502+
if (check_for_dict_arg(argvars, dict_idx) == FAIL)
45054503
{
4506-
emsg(_(e_expected_dict));
45074504
vim_free(name);
45084505
goto theend;
45094506
}
@@ -9291,15 +9288,9 @@ f_setcharsearch(typval_T *argvars, typval_T *rettv UNUSED)
92919288
dictitem_T *di;
92929289
char_u *csearch;
92939290

9294-
if (in_vim9script() && check_for_dict_arg(argvars, 0) == FAIL)
9291+
if (check_for_dict_arg(argvars, 0) == FAIL)
92959292
return;
92969293

9297-
if (argvars[0].v_type != VAR_DICT)
9298-
{
9299-
emsg(_(e_dictionary_required));
9300-
return;
9301-
}
9302-
93039294
if ((d = argvars[0].vval.v_dict) != NULL)
93049295
{
93059296
csearch = dict_get_string(d, "char", FALSE);
@@ -9637,11 +9628,8 @@ f_settagstack(typval_T *argvars, typval_T *rettv)
96379628
return;
96389629

96399630
// second argument: dict with items to set in the tag stack
9640-
if (argvars[1].v_type != VAR_DICT)
9641-
{
9642-
emsg(_(e_dictionary_required));
9631+
if (check_for_dict_arg(argvars, 1) == FAIL)
96439632
return;
9644-
}
96459633
d = argvars[1].vval.v_dict;
96469634
if (d == NULL)
96479635
return;

src/evalwindow.c

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,11 +1009,8 @@ f_win_splitmove(typval_T *argvars, typval_T *rettv)
10091009
dict_T *d;
10101010
dictitem_T *di;
10111011

1012-
if (argvars[2].v_type != VAR_DICT || argvars[2].vval.v_dict == NULL)
1013-
{
1014-
emsg(_(e_invalid_argument));
1012+
if (check_for_nonnull_dict_arg(argvars, 2) == FAIL)
10151013
return;
1016-
}
10171014

10181015
d = argvars[2].vval.v_dict;
10191016
if (dict_get_bool(d, "vertical", FALSE))
@@ -1227,50 +1224,45 @@ f_winrestview(typval_T *argvars, typval_T *rettv UNUSED)
12271224
{
12281225
dict_T *dict;
12291226

1230-
if (in_vim9script() && check_for_dict_arg(argvars, 0) == FAIL)
1227+
if (check_for_nonnull_dict_arg(argvars, 0) == FAIL)
12311228
return;
12321229

1233-
if (argvars[0].v_type != VAR_DICT
1234-
|| (dict = argvars[0].vval.v_dict) == NULL)
1235-
emsg(_(e_invalid_argument));
1236-
else
1230+
dict = argvars[0].vval.v_dict;
1231+
if (dict_has_key(dict, "lnum"))
1232+
curwin->w_cursor.lnum = (linenr_T)dict_get_number(dict, "lnum");
1233+
if (dict_has_key(dict, "col"))
1234+
curwin->w_cursor.col = (colnr_T)dict_get_number(dict, "col");
1235+
if (dict_has_key(dict, "coladd"))
1236+
curwin->w_cursor.coladd = (colnr_T)dict_get_number(dict, "coladd");
1237+
if (dict_has_key(dict, "curswant"))
12371238
{
1238-
if (dict_has_key(dict, "lnum"))
1239-
curwin->w_cursor.lnum = (linenr_T)dict_get_number(dict, "lnum");
1240-
if (dict_has_key(dict, "col"))
1241-
curwin->w_cursor.col = (colnr_T)dict_get_number(dict, "col");
1242-
if (dict_has_key(dict, "coladd"))
1243-
curwin->w_cursor.coladd = (colnr_T)dict_get_number(dict, "coladd");
1244-
if (dict_has_key(dict, "curswant"))
1245-
{
1246-
curwin->w_curswant = (colnr_T)dict_get_number(dict, "curswant");
1247-
curwin->w_set_curswant = FALSE;
1248-
}
1239+
curwin->w_curswant = (colnr_T)dict_get_number(dict, "curswant");
1240+
curwin->w_set_curswant = FALSE;
1241+
}
12491242

1250-
if (dict_has_key(dict, "topline"))
1251-
set_topline(curwin, (linenr_T)dict_get_number(dict, "topline"));
1243+
if (dict_has_key(dict, "topline"))
1244+
set_topline(curwin, (linenr_T)dict_get_number(dict, "topline"));
12521245
#ifdef FEAT_DIFF
1253-
if (dict_has_key(dict, "topfill"))
1254-
curwin->w_topfill = (int)dict_get_number(dict, "topfill");
1246+
if (dict_has_key(dict, "topfill"))
1247+
curwin->w_topfill = (int)dict_get_number(dict, "topfill");
12551248
#endif
1256-
if (dict_has_key(dict, "leftcol"))
1257-
curwin->w_leftcol = (colnr_T)dict_get_number(dict, "leftcol");
1258-
if (dict_has_key(dict, "skipcol"))
1259-
curwin->w_skipcol = (colnr_T)dict_get_number(dict, "skipcol");
1260-
1261-
check_cursor();
1262-
win_new_height(curwin, curwin->w_height);
1263-
win_new_width(curwin, curwin->w_width);
1264-
changed_window_setting();
1265-
1266-
if (curwin->w_topline <= 0)
1267-
curwin->w_topline = 1;
1268-
if (curwin->w_topline > curbuf->b_ml.ml_line_count)
1269-
curwin->w_topline = curbuf->b_ml.ml_line_count;
1249+
if (dict_has_key(dict, "leftcol"))
1250+
curwin->w_leftcol = (colnr_T)dict_get_number(dict, "leftcol");
1251+
if (dict_has_key(dict, "skipcol"))
1252+
curwin->w_skipcol = (colnr_T)dict_get_number(dict, "skipcol");
1253+
1254+
check_cursor();
1255+
win_new_height(curwin, curwin->w_height);
1256+
win_new_width(curwin, curwin->w_width);
1257+
changed_window_setting();
1258+
1259+
if (curwin->w_topline <= 0)
1260+
curwin->w_topline = 1;
1261+
if (curwin->w_topline > curbuf->b_ml.ml_line_count)
1262+
curwin->w_topline = curbuf->b_ml.ml_line_count;
12701263
#ifdef FEAT_DIFF
1271-
check_topfill(curwin, TRUE);
1264+
check_topfill(curwin, TRUE);
12721265
#endif
1273-
}
12741266
}
12751267

12761268
/*

src/list.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2236,11 +2236,8 @@ parse_sort_uniq_args(typval_T *argvars, sortinfo_T *info)
22362236
if (argvars[2].v_type != VAR_UNKNOWN)
22372237
{
22382238
// optional third argument: {dict}
2239-
if (argvars[2].v_type != VAR_DICT)
2240-
{
2241-
emsg(_(e_dictionary_required));
2239+
if (check_for_dict_arg(argvars, 2) == FAIL)
22422240
return FAIL;
2243-
}
22442241
info->item_compare_selfdict = argvars[2].vval.v_dict;
22452242
}
22462243

src/map.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2635,11 +2635,8 @@ f_mapset(typval_T *argvars, typval_T *rettv UNUSED)
26352635
return;
26362636
is_abbr = (int)tv_get_bool(&argvars[1]);
26372637

2638-
if (argvars[2].v_type != VAR_DICT)
2639-
{
2640-
emsg(_(e_dictionary_required));
2638+
if (check_for_dict_arg(argvars, 2) == FAIL)
26412639
return;
2642-
}
26432640
d = argvars[2].vval.v_dict;
26442641
}
26452642
mode = get_map_mode_string(which, is_abbr);

src/popupwin.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,11 +2016,8 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
20162016
emsg(_(e_buffer_number_text_or_list_required));
20172017
return NULL;
20182018
}
2019-
if (argvars[1].v_type != VAR_DICT || argvars[1].vval.v_dict == NULL)
2020-
{
2021-
emsg(_(e_dictionary_required));
2019+
if (check_for_nonnull_dict_arg(argvars, 1) == FAIL)
20222020
return NULL;
2023-
}
20242021
d = argvars[1].vval.v_dict;
20252022
}
20262023

@@ -2928,11 +2925,8 @@ f_popup_move(typval_T *argvars, typval_T *rettv UNUSED)
29282925
if (wp == NULL)
29292926
return; // invalid {id}
29302927

2931-
if (argvars[1].v_type != VAR_DICT || argvars[1].vval.v_dict == NULL)
2932-
{
2933-
emsg(_(e_dictionary_required));
2928+
if (check_for_nonnull_dict_arg(argvars, 1) == FAIL)
29342929
return;
2935-
}
29362930
dict = argvars[1].vval.v_dict;
29372931

29382932
apply_move_options(wp, dict);
@@ -2963,11 +2957,8 @@ f_popup_setoptions(typval_T *argvars, typval_T *rettv UNUSED)
29632957
if (wp == NULL)
29642958
return; // invalid {id}
29652959

2966-
if (argvars[1].v_type != VAR_DICT || argvars[1].vval.v_dict == NULL)
2967-
{
2968-
emsg(_(e_dictionary_required));
2960+
if (check_for_nonnull_dict_arg(argvars, 1) == FAIL)
29692961
return;
2970-
}
29712962
dict = argvars[1].vval.v_dict;
29722963
old_firstline = wp->w_firstline;
29732964

src/proto/typval.pro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ int check_for_blob_arg(typval_T *args, int idx);
2222
int check_for_list_arg(typval_T *args, int idx);
2323
int check_for_opt_list_arg(typval_T *args, int idx);
2424
int check_for_dict_arg(typval_T *args, int idx);
25+
int check_for_nonnull_dict_arg(typval_T *args, int idx);
2526
int check_for_opt_dict_arg(typval_T *args, int idx);
2627
int check_for_chan_or_job_arg(typval_T *args, int idx);
2728
int check_for_opt_chan_or_job_arg(typval_T *args, int idx);

src/search.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ searchit(
764764
col = at_first_line && (options & SEARCH_COL) ? pos->col
765765
: (colnr_T)0;
766766
nmatched = vim_regexec_multi(&regmatch, win, buf,
767-
lnum, col, timed_out);
767+
lnum, col, timed_out);
768768
// vim_regexec_multi() may clear "regprog"
769769
if (regmatch.regprog == NULL)
770770
break;
@@ -1072,11 +1072,11 @@ searchit(
10721072
* twice.
10731073
*/
10741074
if (!p_ws || stop_lnum != 0 || got_int
1075-
|| called_emsg > called_emsg_before || *timed_out
1075+
|| called_emsg > called_emsg_before || *timed_out
10761076
#ifdef FEAT_SEARCH_EXTRA
1077-
|| break_loop
1077+
|| break_loop
10781078
#endif
1079-
|| found || loop)
1079+
|| found || loop)
10801080
break;
10811081

10821082
/*
@@ -4095,11 +4095,8 @@ f_searchcount(typval_T *argvars, typval_T *rettv)
40954095
listitem_T *li;
40964096
int error = FALSE;
40974097

4098-
if (argvars[0].v_type != VAR_DICT || argvars[0].vval.v_dict == NULL)
4099-
{
4100-
emsg(_(e_dictionary_required));
4098+
if (check_for_nonnull_dict_arg(argvars, 0) == FAIL)
41014099
return;
4102-
}
41034100
dict = argvars[0].vval.v_dict;
41044101
di = dict_find(dict, (char_u *)"timeout", -1);
41054102
if (di != NULL)
@@ -4815,11 +4812,8 @@ do_fuzzymatch(typval_T *argvars, typval_T *rettv, int retmatchpos)
48154812
dict_T *d;
48164813
dictitem_T *di;
48174814

4818-
if (argvars[2].v_type != VAR_DICT || argvars[2].vval.v_dict == NULL)
4819-
{
4820-
emsg(_(e_dictionary_required));
4815+
if (check_for_nonnull_dict_arg(argvars, 2) == FAIL)
48214816
return;
4822-
}
48234817

48244818
// To search a dict, either a callback function or a key can be
48254819
// specified.

0 commit comments

Comments
 (0)