diff --git a/src/dict.c b/src/dict.c
index 1f34b8a..735e1fd 100644
--- a/src/dict.c
+++ b/src/dict.c
@@ -1270,50 +1270,52 @@
 	return;
     }
     d2 = argvars[1].vval.v_dict;
-    if ((is_new || !value_check_lock(d1->dv_lock, arg_errmsg, TRUE))
-	    && d2 != NULL)
+    if (d2 == NULL)
+	return;
+
+    if (!is_new && value_check_lock(d1->dv_lock, arg_errmsg, TRUE))
+	return;
+
+    if (is_new)
     {
-	if (is_new)
-	{
-	    d1 = dict_copy(d1, FALSE, TRUE, get_copyID());
-	    if (d1 == NULL)
-		return;
-	}
-
-	// Check the third argument.
-	if (argvars[2].v_type != VAR_UNKNOWN)
-	{
-	    static char *(av[]) = {"keep", "force", "error"};
-
-	    action = tv_get_string_chk(&argvars[2]);
-	    if (action == NULL)
-		return;
-	    for (i = 0; i < 3; ++i)
-		if (STRCMP(action, av[i]) == 0)
-		    break;
-	    if (i == 3)
-	    {
-		semsg(_(e_invalid_argument_str), action);
-		return;
-	    }
-	}
-	else
-	    action = (char_u *)"force";
-
-	if (type != NULL && check_typval_arg_type(type, &argvars[1],
-							 func_name, 2) == FAIL)
+	d1 = dict_copy(d1, FALSE, TRUE, get_copyID());
+	if (d1 == NULL)
 	    return;
-	dict_extend(d1, d2, action, func_name);
-
-	if (is_new)
-	{
-	    rettv->v_type = VAR_DICT;
-	    rettv->vval.v_dict = d1;
-	    rettv->v_lock = FALSE;
-	}
-	else
-	    copy_tv(&argvars[0], rettv);
     }
+
+    // Check the third argument.
+    if (argvars[2].v_type != VAR_UNKNOWN)
+    {
+	static char *(av[]) = {"keep", "force", "error"};
+
+	action = tv_get_string_chk(&argvars[2]);
+	if (action == NULL)
+	    return;
+	for (i = 0; i < 3; ++i)
+	    if (STRCMP(action, av[i]) == 0)
+		break;
+	if (i == 3)
+	{
+	    semsg(_(e_invalid_argument_str), action);
+	    return;
+	}
+    }
+    else
+	action = (char_u *)"force";
+
+    if (type != NULL && check_typval_arg_type(type, &argvars[1],
+		func_name, 2) == FAIL)
+	return;
+    dict_extend(d1, d2, action, func_name);
+
+    if (is_new)
+    {
+	rettv->v_type = VAR_DICT;
+	rettv->vval.v_dict = d1;
+	rettv->v_lock = FALSE;
+    }
+    else
+	copy_tv(&argvars[0], rettv);
 }
 
 /*
diff --git a/src/edit.c b/src/edit.c
index 9e8346d..85d59d1 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -1664,49 +1664,49 @@
 {
     int	    attr;
 
-    if (ScreenLines != NULL)
-    {
-	update_topline();	// just in case w_topline isn't valid
-	validate_cursor();
-	if (highlight)
-	    attr = HL_ATTR(HLF_8);
-	else
-	    attr = 0;
-	pc_row = W_WINROW(curwin) + curwin->w_wrow;
-	pc_col = curwin->w_wincol;
-	pc_status = PC_STATUS_UNSET;
-#ifdef FEAT_RIGHTLEFT
-	if (curwin->w_p_rl)
-	{
-	    pc_col += curwin->w_width - 1 - curwin->w_wcol;
-	    if (has_mbyte)
-	    {
-		int fix_col = mb_fix_col(pc_col, pc_row);
+    if (ScreenLines == NULL)
+	return;
 
-		if (fix_col != pc_col)
-		{
-		    screen_putchar(' ', pc_row, fix_col, attr);
-		    --curwin->w_wcol;
-		    pc_status = PC_STATUS_RIGHT;
-		}
+    update_topline();	// just in case w_topline isn't valid
+    validate_cursor();
+    if (highlight)
+	attr = HL_ATTR(HLF_8);
+    else
+	attr = 0;
+    pc_row = W_WINROW(curwin) + curwin->w_wrow;
+    pc_col = curwin->w_wincol;
+    pc_status = PC_STATUS_UNSET;
+#ifdef FEAT_RIGHTLEFT
+    if (curwin->w_p_rl)
+    {
+	pc_col += curwin->w_width - 1 - curwin->w_wcol;
+	if (has_mbyte)
+	{
+	    int fix_col = mb_fix_col(pc_col, pc_row);
+
+	    if (fix_col != pc_col)
+	    {
+		screen_putchar(' ', pc_row, fix_col, attr);
+		--curwin->w_wcol;
+		pc_status = PC_STATUS_RIGHT;
 	    }
 	}
-	else
-#endif
-	{
-	    pc_col += curwin->w_wcol;
-	    if (mb_lefthalve(pc_row, pc_col))
-		pc_status = PC_STATUS_LEFT;
-	}
-
-	// save the character to be able to put it back
-	if (pc_status == PC_STATUS_UNSET)
-	{
-	    screen_getbytes(pc_row, pc_col, pc_bytes, &pc_attr);
-	    pc_status = PC_STATUS_SET;
-	}
-	screen_putchar(c, pc_row, pc_col, attr);
     }
+    else
+#endif
+    {
+	pc_col += curwin->w_wcol;
+	if (mb_lefthalve(pc_row, pc_col))
+	    pc_status = PC_STATUS_LEFT;
+    }
+
+    // save the character to be able to put it back
+    if (pc_status == PC_STATUS_UNSET)
+    {
+	screen_getbytes(pc_row, pc_col, pc_bytes, &pc_attr);
+	pc_status = PC_STATUS_SET;
+    }
+    screen_putchar(c, pc_row, pc_col, attr);
 }
 
 #if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
@@ -1782,11 +1782,11 @@
     void
 undisplay_dollar(void)
 {
-    if (dollar_vcol >= 0)
-    {
-	dollar_vcol = -1;
-	redrawWinline(curwin, curwin->w_cursor.lnum);
-    }
+    if (dollar_vcol < 0)
+	return;
+
+    dollar_vcol = -1;
+    redrawWinline(curwin, curwin->w_cursor.lnum);
 }
 
 /*
@@ -2554,17 +2554,17 @@
 
     vim_free(last_insert);
     last_insert = alloc(MB_MAXBYTES * 3 + 5);
-    if (last_insert != NULL)
-    {
-	s = last_insert;
-	// Use the CTRL-V only when entering a special char
-	if (c < ' ' || c == DEL)
-	    *s++ = Ctrl_V;
-	s = add_char2buf(c, s);
-	*s++ = ESC;
-	*s++ = NUL;
-	last_insert_skip = 0;
-    }
+    if (last_insert == NULL)
+	return;
+
+    s = last_insert;
+    // Use the CTRL-V only when entering a special char
+    if (c < ' ' || c == DEL)
+	*s++ = Ctrl_V;
+    s = add_char2buf(c, s);
+    *s++ = ESC;
+    *s++ = NUL;
+    last_insert_skip = 0;
 }
 
 #if defined(EXITFREE) || defined(PROTO)
diff --git a/src/eval.c b/src/eval.c
index 94bb4e3..9ffd506 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -128,14 +128,15 @@
 {
     init_evalarg(evalarg);
     evalarg->eval_flags = skip ? 0 : EVAL_EVALUATE;
-    if (eap != NULL)
+
+    if (eap == NULL)
+	return;
+
+    evalarg->eval_cstack = eap->cstack;
+    if (sourcing_a_script(eap) || eap->getline == get_list_line)
     {
-	evalarg->eval_cstack = eap->cstack;
-	if (sourcing_a_script(eap) || eap->getline == get_list_line)
-	{
-	    evalarg->eval_getline = eap->getline;
-	    evalarg->eval_cookie = eap->cookie;
-	}
+	evalarg->eval_getline = eap->getline;
+	evalarg->eval_cookie = eap->cookie;
     }
 }
 
@@ -404,15 +405,15 @@
     static void
 free_eval_tofree_later(evalarg_T *evalarg)
 {
-    if (evalarg->eval_tofree != NULL)
-    {
-	if (ga_grow(&evalarg->eval_tofree_ga, 1) == OK)
-	    ((char_u **)evalarg->eval_tofree_ga.ga_data)
-		[evalarg->eval_tofree_ga.ga_len++]
-		= evalarg->eval_tofree;
-	else
-	    vim_free(evalarg->eval_tofree);
-    }
+    if (evalarg->eval_tofree == NULL)
+	return;
+
+    if (ga_grow(&evalarg->eval_tofree_ga, 1) == OK)
+	((char_u **)evalarg->eval_tofree_ga.ga_data)
+	    [evalarg->eval_tofree_ga.ga_len++]
+	    = evalarg->eval_tofree;
+    else
+	vim_free(evalarg->eval_tofree);
 }
 
 /*
@@ -421,39 +422,39 @@
     void
 clear_evalarg(evalarg_T *evalarg, exarg_T *eap)
 {
-    if (evalarg != NULL)
+    if (evalarg == NULL)
+	return;
+
+    garray_T *etga = &evalarg->eval_tofree_ga;
+
+    if (evalarg->eval_tofree != NULL || evalarg->eval_using_cmdline)
     {
-	garray_T *etga = &evalarg->eval_tofree_ga;
-
-	if (evalarg->eval_tofree != NULL || evalarg->eval_using_cmdline)
+	if (eap != NULL)
 	{
-	    if (eap != NULL)
-	    {
-		// We may need to keep the original command line, e.g. for
-		// ":let" it has the variable names.  But we may also need
-		// the new one, "nextcmd" points into it.  Keep both.
-		vim_free(eap->cmdline_tofree);
-		eap->cmdline_tofree = *eap->cmdlinep;
+	    // We may need to keep the original command line, e.g. for
+	    // ":let" it has the variable names.  But we may also need
+	    // the new one, "nextcmd" points into it.  Keep both.
+	    vim_free(eap->cmdline_tofree);
+	    eap->cmdline_tofree = *eap->cmdlinep;
 
-		if (evalarg->eval_using_cmdline && etga->ga_len > 0)
-		{
-		    // "nextcmd" points into the last line in eval_tofree_ga,
-		    // need to keep it around.
-		    --etga->ga_len;
-		    *eap->cmdlinep = ((char_u **)etga->ga_data)[etga->ga_len];
-		    vim_free(evalarg->eval_tofree);
-		}
-		else
-		    *eap->cmdlinep = evalarg->eval_tofree;
+	    if (evalarg->eval_using_cmdline && etga->ga_len > 0)
+	    {
+		// "nextcmd" points into the last line in eval_tofree_ga,
+		// need to keep it around.
+		--etga->ga_len;
+		*eap->cmdlinep = ((char_u **)etga->ga_data)[etga->ga_len];
+		vim_free(evalarg->eval_tofree);
 	    }
 	    else
-		vim_free(evalarg->eval_tofree);
-	    evalarg->eval_tofree = NULL;
+		*eap->cmdlinep = evalarg->eval_tofree;
 	}
-
-	ga_clear_strings(etga);
-	VIM_CLEAR(evalarg->eval_tofree_lambda);
+	else
+	    vim_free(evalarg->eval_tofree);
+	evalarg->eval_tofree = NULL;
     }
+
+    ga_clear_strings(etga);
+    VIM_CLEAR(evalarg->eval_tofree_lambda);
 }
 
 /*
@@ -3219,16 +3220,16 @@
     blob_T  *b = blob_alloc();
     int	    i;
 
-    if (b != NULL)
-    {
-	for (i = 0; i < blob_len(b1); i++)
-	    ga_append(&b->bv_ga, blob_get(b1, i));
-	for (i = 0; i < blob_len(b2); i++)
-	    ga_append(&b->bv_ga, blob_get(b2, i));
+    if (b == NULL)
+	return;
 
-	clear_tv(tv1);
-	rettv_blob_set(tv1, b);
-    }
+    for (i = 0; i < blob_len(b1); i++)
+	ga_append(&b->bv_ga, blob_get(b1, i));
+    for (i = 0; i < blob_len(b2); i++)
+	ga_append(&b->bv_ga, blob_get(b2, i));
+
+    clear_tv(tv1);
+    rettv_blob_set(tv1, b);
 }
 
 /*
@@ -4818,13 +4819,13 @@
 		|| check_for_opt_number_arg(argvars, 2) == FAIL))
 	return;
 
-    if (check_can_index(argvars, TRUE, FALSE) == OK)
-    {
-	copy_tv(argvars, rettv);
-	eval_index_inner(rettv, TRUE, argvars + 1,
-		argvars[2].v_type == VAR_UNKNOWN ? NULL : argvars + 2,
-		TRUE, NULL, 0, FALSE);
-    }
+    if (check_can_index(argvars, TRUE, FALSE) != OK)
+	return;
+
+    copy_tv(argvars, rettv);
+    eval_index_inner(rettv, TRUE, argvars + 1,
+	    argvars[2].v_type == VAR_UNKNOWN ? NULL : argvars + 2,
+	    TRUE, NULL, 0, FALSE);
 }
 
 /*
@@ -5045,31 +5046,31 @@
     void
 partial_unref(partial_T *pt)
 {
-    if (pt != NULL)
+    if (pt == NULL)
+	return;
+
+    int	done = FALSE;
+
+    if (--pt->pt_refcount <= 0)
+	partial_free(pt);
+
+    // If the reference count goes down to one, the funcstack may be the
+    // only reference and can be freed if no other partials reference it.
+    else if (pt->pt_refcount == 1)
     {
-	int	done = FALSE;
+	// careful: if the funcstack is freed it may contain this partial
+	// and it gets freed as well
+	if (pt->pt_funcstack != NULL)
+	    done = funcstack_check_refcount(pt->pt_funcstack);
 
-	if (--pt->pt_refcount <= 0)
-	    partial_free(pt);
-
-	// If the reference count goes down to one, the funcstack may be the
-	// only reference and can be freed if no other partials reference it.
-	else if (pt->pt_refcount == 1)
+	if (!done)
 	{
-	    // careful: if the funcstack is freed it may contain this partial
-	    // and it gets freed as well
-	    if (pt->pt_funcstack != NULL)
-		done = funcstack_check_refcount(pt->pt_funcstack);
+	    int	depth;
 
-	    if (!done)
-	    {
-		int	depth;
-
-		for (depth = 0; depth < MAX_LOOP_DEPTH; ++depth)
-		    if (pt->pt_loopvars[depth] != NULL
-			    && loopvars_check_refcount(pt->pt_loopvars[depth]))
+	    for (depth = 0; depth < MAX_LOOP_DEPTH; ++depth)
+		if (pt->pt_loopvars[depth] != NULL
+			&& loopvars_check_refcount(pt->pt_loopvars[depth]))
 		    break;
-	    }
 	}
     }
 }
@@ -7225,23 +7226,23 @@
 {
     char_u *p;
 
-    if (script_ctx.sc_sid != 0)
+    if (script_ctx.sc_sid == 0)
+	return;
+
+    p = home_replace_save(NULL, get_scriptname(script_ctx.sc_sid));
+    if (p == NULL)
+	return;
+
+    verbose_enter();
+    msg_puts(_("\n\tLast set from "));
+    msg_puts((char *)p);
+    if (script_ctx.sc_lnum > 0)
     {
-	p = home_replace_save(NULL, get_scriptname(script_ctx.sc_sid));
-	if (p != NULL)
-	{
-	    verbose_enter();
-	    msg_puts(_("\n\tLast set from "));
-	    msg_puts((char *)p);
-	    if (script_ctx.sc_lnum > 0)
-	    {
-		msg_puts(_(line_msg));
-		msg_outnum((long)script_ctx.sc_lnum);
-	    }
-	    verbose_leave();
-	    vim_free(p);
-	}
+	msg_puts(_(line_msg));
+	msg_outnum((long)script_ctx.sc_lnum);
     }
+    verbose_leave();
+    vim_free(p);
 }
 
 #endif // FEAT_EVAL
diff --git a/src/version.c b/src/version.c
index 8dbf11f..2f0c73c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1105,
+/**/
     1104,
 /**/
     1103,
