changeset 28315:62cc3b60493b v8.2.4683

patch 8.2.4683: verbose check with dict_find() to see if a key is present Commit: https://github.com/vim/vim/commit/4829c1c9e9095a3303caec9af7d02f6547f6df0e Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Mon Apr 4 15:16:54 2022 +0100 patch 8.2.4683: verbose check with dict_find() to see if a key is present Problem: Verbose check with dict_find() to see if a key is present. Solution: Add dict_has_key(). (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/10074)
author Bram Moolenaar <Bram@vim.org>
date Mon, 04 Apr 2022 16:30:04 +0200
parents 7bc5b23adf8f
children 6ce57599817a
files src/channel.c src/dict.c src/evalwindow.c src/filepath.c src/highlight.c src/json.c src/match.c src/popupwin.c src/proto/dict.pro src/quickfix.c src/search.c src/sign.c src/tag.c src/terminal.c src/testing.c src/textprop.c src/time.c src/version.c
diffstat 18 files changed, 95 insertions(+), 84 deletions(-) [+]
line wrap: on
line diff
--- a/src/channel.c
+++ b/src/channel.c
@@ -4460,8 +4460,7 @@ ch_expr_common(typval_T *argvars, typval
 	}
 
 	if (argvars[2].v_type == VAR_DICT)
-	    if (dict_find(argvars[2].vval.v_dict, (char_u *)"callback", -1)
-									!= NULL)
+	    if (dict_has_key(argvars[2].vval.v_dict, "callback"))
 		callback_present = TRUE;
 
 	if (eval || callback_present)
@@ -4482,7 +4481,7 @@ ch_expr_common(typval_T *argvars, typval
 	    if (di != NULL)
 		id = di->di_tv.vval.v_number;
 	}
-	if (dict_find(d, (char_u *)"jsonrpc", -1) == NULL)
+	if (!dict_has_key(d, "jsonrpc"))
 	    dict_add_string(d, "jsonrpc", (char_u *)"2.0");
 	text = json_encode_lsp_msg(&argvars[1]);
     }
--- a/src/dict.c
+++ b/src/dict.c
@@ -649,6 +649,15 @@ dict_find(dict_T *d, char_u *key, int le
 }
 
 /*
+ * Returns TRUE if "key" is present in Dictionary "d".
+ */
+    int
+dict_has_key(dict_T *d, char *key)
+{
+    return dict_find(d, (char_u *)key, -1) != NULL;
+}
+
+/*
  * Get a typval_T item from a dictionary and copy it into "rettv".
  * Returns FAIL if the entry doesn't exist or out of memory.
  */
@@ -1582,8 +1591,8 @@ f_has_key(typval_T *argvars, typval_T *r
     if (argvars[0].vval.v_dict == NULL)
 	return;
 
-    rettv->vval.v_number = dict_find(argvars[0].vval.v_dict,
-				      tv_get_string(&argvars[1]), -1) != NULL;
+    rettv->vval.v_number = dict_has_key(argvars[0].vval.v_dict,
+				(char *)tv_get_string(&argvars[1]));
 }
 
 #endif // defined(FEAT_EVAL)
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -1220,27 +1220,27 @@ f_winrestview(typval_T *argvars, typval_
 	emsg(_(e_invalid_argument));
     else
     {
-	if (dict_find(dict, (char_u *)"lnum", -1) != NULL)
+	if (dict_has_key(dict, "lnum"))
 	    curwin->w_cursor.lnum = (linenr_T)dict_get_number(dict, (char_u *)"lnum");
-	if (dict_find(dict, (char_u *)"col", -1) != NULL)
+	if (dict_has_key(dict, "col"))
 	    curwin->w_cursor.col = (colnr_T)dict_get_number(dict, (char_u *)"col");
-	if (dict_find(dict, (char_u *)"coladd", -1) != NULL)
+	if (dict_has_key(dict, "coladd"))
 	    curwin->w_cursor.coladd = (colnr_T)dict_get_number(dict, (char_u *)"coladd");
-	if (dict_find(dict, (char_u *)"curswant", -1) != NULL)
+	if (dict_has_key(dict, "curswant"))
 	{
 	    curwin->w_curswant = (colnr_T)dict_get_number(dict, (char_u *)"curswant");
 	    curwin->w_set_curswant = FALSE;
 	}
 
-	if (dict_find(dict, (char_u *)"topline", -1) != NULL)
+	if (dict_has_key(dict, "topline"))
 	    set_topline(curwin, (linenr_T)dict_get_number(dict, (char_u *)"topline"));
 #ifdef FEAT_DIFF
-	if (dict_find(dict, (char_u *)"topfill", -1) != NULL)
+	if (dict_has_key(dict, "topfill"))
 	    curwin->w_topfill = (int)dict_get_number(dict, (char_u *)"topfill");
 #endif
-	if (dict_find(dict, (char_u *)"leftcol", -1) != NULL)
+	if (dict_has_key(dict, "leftcol"))
 	    curwin->w_leftcol = (colnr_T)dict_get_number(dict, (char_u *)"leftcol");
-	if (dict_find(dict, (char_u *)"skipcol", -1) != NULL)
+	if (dict_has_key(dict, "skipcol"))
 	    curwin->w_skipcol = (colnr_T)dict_get_number(dict, (char_u *)"skipcol");
 
 	check_cursor();
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -1605,7 +1605,7 @@ readdirex_dict_arg(typval_T *tv, int *cm
 	return FAIL;
     }
 
-    if (dict_find(tv->vval.v_dict, (char_u *)"sort", -1) != NULL)
+    if (dict_has_key(tv->vval.v_dict, "sort"))
 	compare = dict_get_string(tv->vval.v_dict, (char_u *)"sort", FALSE);
     else
     {
--- a/src/highlight.c
+++ b/src/highlight.c
@@ -718,7 +718,7 @@ highlight_reset_all(void)
 # ifdef FEAT_BEVAL_TIP
 	gui_init_tooltip_font();
 # endif
-# if defined(FEAT_MENU) && (defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF))
+# if defined(FEAT_MENU) && defined(FEAT_GUI_MOTIF)
 	gui_init_menu_font();
 # endif
     }
@@ -2134,7 +2134,7 @@ hl_do_font(
 	|| do_menu
 #  endif
 #  ifdef FEAT_BEVAL_TIP
-	// In Athena & Motif, the Tooltip highlight group is always a fontset
+	// In Motif, the Tooltip highlight group is always a fontset
 	|| do_tooltip
 #  endif
 	    )
@@ -2156,7 +2156,7 @@ hl_do_font(
 	// fontset.  Same for the Menu group.
 	if (do_normal)
 	    gui_init_font(arg, TRUE);
-#   if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) && defined(FEAT_MENU)
+#   if defined(FEAT_GUI_MOTIF) && defined(FEAT_MENU)
 	if (do_menu)
 	{
 #    ifdef FONTSET_ALWAYS
@@ -2170,7 +2170,7 @@ hl_do_font(
 #    ifdef FEAT_BEVAL_GUI
 	if (do_tooltip)
 	{
-	    // The Athena widget set cannot currently handle switching between
+	    // The Athena widget set could not handle switching between
 	    // displaying a single font and a fontset.
 	    // If the XtNinternational resource is set to True at widget
 	    // creation, then a fontset is always used, otherwise an
@@ -2194,7 +2194,7 @@ hl_do_font(
 	    if (do_normal)
 		gui_init_font(arg, FALSE);
 #ifndef FONTSET_ALWAYS
-# if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) && defined(FEAT_MENU)
+# if defined(FEAT_GUI_MOTIF) && defined(FEAT_MENU)
 	    if (do_menu)
 	    {
 		gui.menu_font = HL_TABLE()[idx].sg_font;
@@ -4411,7 +4411,7 @@ hlg_add_or_update(dict_T *dict)
     if (dict_get_bool(dict, (char_u *)"default", VVAL_FALSE) == VVAL_TRUE)
 	dodefault = TRUE;
 
-    if (dict_find(dict, (char_u *)"cleared", -1) != NULL)
+    if (dict_has_key(dict, "cleared"))
     {
 	varnumber_T	cleared;
 
@@ -4425,7 +4425,7 @@ hlg_add_or_update(dict_T *dict)
 	}
     }
 
-    if (dict_find(dict, (char_u *)"linksto", -1) != NULL)
+    if (dict_has_key(dict, "linksto"))
     {
 	char_u	*linksto;
 
--- a/src/json.c
+++ b/src/json.c
@@ -1027,8 +1027,8 @@ item_end:
 
 	    case JSON_OBJECT:
 		if (cur_item != NULL
-			&& dict_find(top_item->jd_tv.vval.v_dict,
-						 top_item->jd_key, -1) != NULL)
+			&& dict_has_key(top_item->jd_tv.vval.v_dict,
+						(char *)top_item->jd_key))
 		{
 		    semsg(_(e_duplicate_key_in_json_str), top_item->jd_key);
 		    clear_tv(cur_item);
--- a/src/match.c
+++ b/src/match.c
@@ -938,7 +938,7 @@ matchadd_dict_arg(typval_T *tv, char_u *
 	return FAIL;
     }
 
-    if (dict_find(tv->vval.v_dict, (char_u *)"conceal", -1) != NULL)
+    if (dict_has_key(tv->vval.v_dict, "conceal"))
 	*conceal_char = dict_get_string(tv->vval.v_dict,
 						   (char_u *)"conceal", FALSE);
 
@@ -1088,11 +1088,11 @@ f_setmatches(typval_T *argvars UNUSED, t
 		emsg(_(e_invalid_argument));
 		return;
 	    }
-	    if (!(dict_find(d, (char_u *)"group", -1) != NULL
-			&& (dict_find(d, (char_u *)"pattern", -1) != NULL
-			    || dict_find(d, (char_u *)"pos1", -1) != NULL)
-			&& dict_find(d, (char_u *)"priority", -1) != NULL
-			&& dict_find(d, (char_u *)"id", -1) != NULL))
+	    if (!(dict_has_key(d, "group")
+			&& (dict_has_key(d, "pattern")
+			    || dict_has_key(d, "pos1"))
+			&& dict_has_key(d, "priority")
+			&& dict_has_key(d, "id")))
 	    {
 		emsg(_(e_invalid_argument));
 		return;
@@ -1113,7 +1113,7 @@ f_setmatches(typval_T *argvars UNUSED, t
 	    char_u	*conceal;
 
 	    d = li->li_tv.vval.v_dict;
-	    if (dict_find(d, (char_u *)"pattern", -1) == NULL)
+	    if (!dict_has_key(d, "pattern"))
 	    {
 		if (s == NULL)
 		{
@@ -1142,7 +1142,7 @@ f_setmatches(typval_T *argvars UNUSED, t
 	    group = dict_get_string(d, (char_u *)"group", TRUE);
 	    priority = (int)dict_get_number(d, (char_u *)"priority");
 	    id = (int)dict_get_number(d, (char_u *)"id");
-	    conceal = dict_find(d, (char_u *)"conceal", -1) != NULL
+	    conceal = dict_has_key(d, "conceal")
 			      ? dict_get_string(d, (char_u *)"conceal", TRUE)
 			      : NULL;
 	    if (i == 0)
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -1957,7 +1957,7 @@ popup_create(typval_T *argvars, typval_T
 
     if (d != NULL)
     {
-	if (dict_find(d, (char_u *)"tabpage", -1) != NULL)
+	if (dict_has_key(d, "tabpage"))
 	    tabnr = (int)dict_get_number(d, (char_u *)"tabpage");
 	else if (type == TYPE_NOTIFICATION)
 	    tabnr = -1;  // notifications are global by default
--- a/src/proto/dict.pro
+++ b/src/proto/dict.pro
@@ -27,6 +27,7 @@ char_u *dict_iterate_next(dict_iterator_
 int dict_add_dict(dict_T *d, char *key, dict_T *dict);
 long dict_len(dict_T *d);
 dictitem_T *dict_find(dict_T *d, char_u *key, int len);
+int dict_has_key(dict_T *d, char *key);
 int dict_get_tv(dict_T *d, char_u *key, typval_T *rettv);
 char_u *dict_get_string(dict_T *d, char_u *key, int save);
 varnumber_T dict_get_number(dict_T *d, char_u *key);
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -6859,7 +6859,7 @@ qf_getprop_keys2flags(dict_T *what, int 
 {
     int		flags = QF_GETLIST_NONE;
 
-    if (dict_find(what, (char_u *)"all", -1) != NULL)
+    if (dict_has_key(what, "all"))
     {
 	flags |= QF_GETLIST_ALL;
 	if (!loclist)
@@ -6867,40 +6867,40 @@ qf_getprop_keys2flags(dict_T *what, int 
 	    flags &= ~ QF_GETLIST_FILEWINID;
     }
 
-    if (dict_find(what, (char_u *)"title", -1) != NULL)
+    if (dict_has_key(what, "title"))
 	flags |= QF_GETLIST_TITLE;
 
-    if (dict_find(what, (char_u *)"nr", -1) != NULL)
+    if (dict_has_key(what, "nr"))
 	flags |= QF_GETLIST_NR;
 
-    if (dict_find(what, (char_u *)"winid", -1) != NULL)
+    if (dict_has_key(what, "winid"))
 	flags |= QF_GETLIST_WINID;
 
-    if (dict_find(what, (char_u *)"context", -1) != NULL)
+    if (dict_has_key(what, "context"))
 	flags |= QF_GETLIST_CONTEXT;
 
-    if (dict_find(what, (char_u *)"id", -1) != NULL)
+    if (dict_has_key(what, "id"))
 	flags |= QF_GETLIST_ID;
 
-    if (dict_find(what, (char_u *)"items", -1) != NULL)
+    if (dict_has_key(what, "items"))
 	flags |= QF_GETLIST_ITEMS;
 
-    if (dict_find(what, (char_u *)"idx", -1) != NULL)
+    if (dict_has_key(what, "idx"))
 	flags |= QF_GETLIST_IDX;
 
-    if (dict_find(what, (char_u *)"size", -1) != NULL)
+    if (dict_has_key(what, "size"))
 	flags |= QF_GETLIST_SIZE;
 
-    if (dict_find(what, (char_u *)"changedtick", -1) != NULL)
+    if (dict_has_key(what, "changedtick"))
 	flags |= QF_GETLIST_TICK;
 
-    if (loclist && dict_find(what, (char_u *)"filewinid", -1) != NULL)
+    if (loclist && dict_has_key(what, "filewinid"))
 	flags |= QF_GETLIST_FILEWINID;
 
-    if (dict_find(what, (char_u *)"qfbufnr", -1) != NULL)
+    if (dict_has_key(what, "qfbufnr"))
 	flags |= QF_GETLIST_QFBUFNR;
 
-    if (dict_find(what, (char_u *)"quickfixtextfunc", -1) != NULL)
+    if (dict_has_key(what, "quickfixtextfunc"))
 	flags |= QF_GETLIST_QFTF;
 
     return flags;
@@ -7241,7 +7241,7 @@ qf_add_entry_from_dict(
     }
 
     // If the 'valid' field is present it overrules the detected value.
-    if ((dict_find(d, (char_u *)"valid", -1)) != NULL)
+    if (dict_has_key(d, "valid"))
 	valid = (int)dict_get_bool(d, (char_u *)"valid", FALSE);
 
     status =  qf_add_entry(qfl,
--- a/src/search.c
+++ b/src/search.c
@@ -4878,7 +4878,7 @@ do_fuzzymatch(typval_T *argvars, typval_
 		return;
 	    }
 	}
-	if (dict_find(d, (char_u *)"matchseq", -1) != NULL)
+	if (dict_has_key(d, "matchseq"))
 	    matchseq = TRUE;
     }
 
--- a/src/sign.c
+++ b/src/sign.c
@@ -2786,7 +2786,7 @@ sign_unplace_from_dict(typval_T *group_t
 	    if (buf == NULL)
 		goto cleanup;
 	}
-	if (dict_find(dict, (char_u *)"id", -1) != NULL)
+	if (dict_has_key(dict, "id"))
 	{
 	    sign_id = dict_get_number(dict, (char_u *)"id");
 	    if (sign_id <= 0)
--- a/src/tag.c
+++ b/src/tag.c
@@ -4313,7 +4313,7 @@ add_tag_field(
     int		retval;
 
     // check that the field name doesn't exist yet
-    if (dict_find(dict, (char_u *)field_name, -1) != NULL)
+    if (dict_has_key(dict, field_name))
     {
 	if (p_verbose > 0)
 	{
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -4311,13 +4311,13 @@ handle_drop_command(listitem_T *item)
 	if (p != NULL)
 	    get_bad_opt(p, &ea);
 
-	if (dict_find(dict, (char_u *)"bin", -1) != NULL)
+	if (dict_has_key(dict, "bin"))
 	    ea.force_bin = FORCE_BIN;
-	if (dict_find(dict, (char_u *)"binary", -1) != NULL)
+	if (dict_has_key(dict, "binary"))
 	    ea.force_bin = FORCE_BIN;
-	if (dict_find(dict, (char_u *)"nobin", -1) != NULL)
+	if (dict_has_key(dict, "nobin"))
 	    ea.force_bin = FORCE_NOBIN;
-	if (dict_find(dict, (char_u *)"nobinary", -1) != NULL)
+	if (dict_has_key(dict, "nobinary"))
 	    ea.force_bin = FORCE_NOBIN;
     }
 
--- a/src/testing.c
+++ b/src/testing.c
@@ -1285,10 +1285,10 @@ test_gui_drop_files(dict_T *args UNUSED)
     list_T	*l;
     listitem_T	*li;
 
-    if (dict_find(args, (char_u *)"files", -1) == NULL
-	    || dict_find(args, (char_u *)"row", -1) == NULL
-	    || dict_find(args, (char_u *)"col", -1) == NULL
-	    || dict_find(args, (char_u *)"modifiers", -1) == NULL)
+    if (!dict_has_key(args, "files")
+	    || !dict_has_key(args, "row")
+	    || !dict_has_key(args, "col")
+	    || !dict_has_key(args, "modifiers"))
 	return FALSE;
 
     (void)dict_get_tv(args, (char_u *)"files", &t);
@@ -1341,10 +1341,10 @@ test_gui_find_repl(dict_T *args)
     int		forward;
     int		retval;
 
-    if (dict_find(args, (char_u *)"find_text", -1) == NULL
-	    || dict_find(args, (char_u *)"repl_text", -1) == NULL
-	    || dict_find(args, (char_u *)"flags", -1) == NULL
-	    || dict_find(args, (char_u *)"forward", -1) == NULL)
+    if (!dict_has_key(args, "find_text")
+	    || !dict_has_key(args, "repl_text")
+	    || !dict_has_key(args, "flags")
+	    || !dict_has_key(args, "forward"))
 	return FALSE;
 
     find_text = dict_get_string(args, (char_u *)"find_text", TRUE);
@@ -1370,16 +1370,16 @@ test_gui_mouse_event(dict_T *args)
     int_u	mods;
     int		move;
 
-    if (dict_find(args, (char_u *)"row", -1) == NULL
-	    || dict_find(args, (char_u *)"col", -1) == NULL)
+    if (!dict_has_key(args, "row")
+	    || !dict_has_key(args, "col"))
 	return FALSE;
 
     // Note: "move" is optional, requires fewer arguments
     move = (int)dict_get_bool(args, (char_u *)"move", FALSE);
 
-    if (!move && (dict_find(args, (char_u *)"button", -1) == NULL
-	    || dict_find(args, (char_u *)"multiclick", -1) == NULL
-	    || dict_find(args, (char_u *)"modifiers", -1) == NULL))
+    if (!move && (!dict_has_key(args, "button")
+	    || !dict_has_key(args, "multiclick")
+	    || !dict_has_key(args, "modifiers")))
 	return FALSE;
 
     row = (int)dict_get_number(args, (char_u *)"row");
@@ -1408,9 +1408,9 @@ test_gui_scrollbar(dict_T *args)
     int		dragging;
     scrollbar_T *sb = NULL;
 
-    if (dict_find(args, (char_u *)"which", -1) == NULL
-	    || dict_find(args, (char_u *)"value", -1) == NULL
-	    || dict_find(args, (char_u *)"dragging", -1) == NULL)
+    if (!dict_has_key(args, "which")
+	    || !dict_has_key(args, "value")
+	    || !dict_has_key(args, "dragging"))
 	return FALSE;
 
     which = dict_get_string(args, (char_u *)"which", FALSE);
@@ -1443,7 +1443,7 @@ test_gui_tabline_event(dict_T *args UNUS
 #  ifdef FEAT_GUI_TABLINE
     int		tabnr;
 
-    if (dict_find(args, (char_u *)"tabnr", -1) == NULL)
+    if (!dict_has_key(args, "tabnr"))
 	return FALSE;
 
     tabnr = (int)dict_get_number(args, (char_u *)"tabnr");
@@ -1461,8 +1461,8 @@ test_gui_tabmenu_event(dict_T *args UNUS
     int	tabnr;
     int	item;
 
-    if (dict_find(args, (char_u *)"tabnr", -1) == NULL
-	    || dict_find(args, (char_u *)"item", -1) == NULL)
+    if (!dict_has_key(args, "tabnr")
+	    || !dict_has_key(args, "item"))
 	return FALSE;
 
     tabnr = (int)dict_get_number(args, (char_u *)"tabnr");
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -331,14 +331,14 @@ f_prop_add_list(typval_T *argvars, typva
     }
 
     dict = argvars[0].vval.v_dict;
-    if (dict == NULL || dict_find(dict, (char_u *)"type", -1) == NULL)
+    if (dict == NULL || !dict_has_key(dict, "type"))
     {
 	emsg(_(e_missing_property_type_name));
 	return;
     }
     type_name = dict_get_string(dict, (char_u *)"type", FALSE);
 
-    if (dict_find(dict, (char_u *)"id", -1) != NULL)
+    if (dict_has_key(dict, "id"))
 	id = dict_get_number(dict, (char_u *)"id");
 
     if (get_bufnr_from_arg(&argvars[0], &buf) == FAIL)
@@ -391,14 +391,14 @@ prop_add_common(
     buf_T	*buf = default_buf;
     int		id = 0;
 
-    if (dict == NULL || dict_find(dict, (char_u *)"type", -1) == NULL)
+    if (dict == NULL || !dict_has_key(dict, "type"))
     {
 	emsg(_(e_missing_property_type_name));
 	return;
     }
     type_name = dict_get_string(dict, (char_u *)"type", FALSE);
 
-    if (dict_find(dict, (char_u *)"end_lnum", -1) != NULL)
+    if (dict_has_key(dict, "end_lnum"))
     {
 	end_lnum = dict_get_number(dict, (char_u *)"end_lnum");
 	if (end_lnum < start_lnum)
@@ -410,7 +410,7 @@ prop_add_common(
     else
 	end_lnum = start_lnum;
 
-    if (dict_find(dict, (char_u *)"length", -1) != NULL)
+    if (dict_has_key(dict, "length"))
     {
 	long length = dict_get_number(dict, (char_u *)"length");
 
@@ -421,7 +421,7 @@ prop_add_common(
 	}
 	end_col = start_col + length;
     }
-    else if (dict_find(dict, (char_u *)"end_col", -1) != NULL)
+    else if (dict_has_key(dict, "end_col"))
     {
 	end_col = dict_get_number(dict, (char_u *)"end_col");
 	if (end_col <= 0)
@@ -435,7 +435,7 @@ prop_add_common(
     else
 	end_col = 1;
 
-    if (dict_find(dict, (char_u *)"id", -1) != NULL)
+    if (dict_has_key(dict, "id"))
 	id = dict_get_number(dict, (char_u *)"id");
 
     if (dict_arg != NULL && get_bufnr_from_arg(dict_arg, &buf) == FAIL)
@@ -777,12 +777,12 @@ f_prop_find(typval_T *argvars, typval_T 
 
     skipstart = dict_get_bool(dict, (char_u *)"skipstart", 0);
 
-    if (dict_find(dict, (char_u *)"id", -1) != NULL)
+    if (dict_has_key(dict, "id"))
     {
 	id = dict_get_number(dict, (char_u *)"id");
 	id_found = TRUE;
     }
-    if (dict_find(dict, (char_u *)"type", -1))
+    if (dict_has_key(dict, "type"))
     {
 	char_u	    *name = dict_get_string(dict, (char_u *)"type", FALSE);
 	proptype_T  *type = lookup_prop_type(name, buf);
@@ -1202,9 +1202,9 @@ f_prop_remove(typval_T *argvars, typval_
 
     do_all = dict_get_bool(dict, (char_u *)"all", FALSE);
 
-    if (dict_find(dict, (char_u *)"id", -1) != NULL)
+    if (dict_has_key(dict, "id"))
 	id = dict_get_number(dict, (char_u *)"id");
-    if (dict_find(dict, (char_u *)"type", -1))
+    if (dict_has_key(dict, "type"))
     {
 	char_u	    *name = dict_get_string(dict, (char_u *)"type", FALSE);
 	proptype_T  *type = lookup_prop_type(name, buf);
--- a/src/time.c
+++ b/src/time.c
@@ -848,7 +848,7 @@ f_timer_start(typval_T *argvars, typval_
 	    semsg(_(e_invalid_argument_str), tv_get_string(&argvars[2]));
 	    return;
 	}
-	if (dict_find(dict, (char_u *)"repeat", -1) != NULL)
+	if (dict_has_key(dict, "repeat"))
 	    repeat = dict_get_number(dict, (char_u *)"repeat");
     }
 
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4683,
+/**/
     4682,
 /**/
     4681,