diff src/list.c @ 24484:bc1a533148d7 v8.2.2782

patch 8.2.2782: Vim9: blob operations not fully tested Commit: https://github.com/vim/vim/commit/39211cba723a2cb58a97c7e08826713164b86efc Author: Bram Moolenaar <Bram@vim.org> Date: Sun Apr 18 15:48:04 2021 +0200 patch 8.2.2782: Vim9: blob operations not fully tested Problem: Vim9: blob operations not fully tested. Solution: Make more blob tests run in Vim9 script. Fix filter(). Make insert() give an error for a null blob, like add().
author Bram Moolenaar <Bram@vim.org>
date Sun, 18 Apr 2021 16:00:06 +0200
parents 3d5a66e478f8
children 8f2262c72178
line wrap: on
line diff
--- a/src/list.c
+++ b/src/list.c
@@ -2223,7 +2223,7 @@ filter_map(typval_T *argvars, typval_T *
 		if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL
 								   || did_emsg)
 		    break;
-		if (newtv.v_type != VAR_NUMBER)
+		if (newtv.v_type != VAR_NUMBER && newtv.v_type != VAR_BOOL)
 		{
 		    clear_tv(&newtv);
 		    emsg(_(e_invalblob));
@@ -2736,7 +2736,6 @@ f_insert(typval_T *argvars, typval_T *re
 {
     long	before = 0;
     listitem_T	*item;
-    list_T	*l;
     int		error = FALSE;
 
     if (argvars[0].v_type == VAR_BLOB)
@@ -2745,7 +2744,11 @@ f_insert(typval_T *argvars, typval_T *re
 	char_u	    *p;
 
 	if (argvars[0].vval.v_blob == NULL)
+	{
+	    if (in_vim9script())
+		emsg(_(e_cannot_add_to_null_blob));
 	    return;
+	}
 
 	len = blob_len(argvars[0].vval.v_blob);
 	if (argvars[2].v_type != VAR_UNKNOWN)
@@ -2779,30 +2782,39 @@ f_insert(typval_T *argvars, typval_T *re
     }
     else if (argvars[0].v_type != VAR_LIST)
 	semsg(_(e_listblobarg), "insert()");
-    else if ((l = argvars[0].vval.v_list) != NULL
-	    && !value_check_lock(l->lv_lock,
-				     (char_u *)N_("insert() argument"), TRUE))
+    else
     {
-	if (argvars[2].v_type != VAR_UNKNOWN)
-	    before = (long)tv_get_number_chk(&argvars[2], &error);
-	if (error)
-	    return;		// type error; errmsg already given
+	list_T	*l = argvars[0].vval.v_list;
+
+	if (l == NULL)
+	{
+	    if (in_vim9script())
+		emsg(_(e_cannot_add_to_null_list));
+	}
+	else if (!value_check_lock(l->lv_lock,
+				     (char_u *)N_("insert() argument"), TRUE))
+	{
+	    if (argvars[2].v_type != VAR_UNKNOWN)
+		before = (long)tv_get_number_chk(&argvars[2], &error);
+	    if (error)
+		return;		// type error; errmsg already given
 
-	if (before == l->lv_len)
-	    item = NULL;
-	else
-	{
-	    item = list_find(l, before);
-	    if (item == NULL)
+	    if (before == l->lv_len)
+		item = NULL;
+	    else
 	    {
-		semsg(_(e_listidx), before);
-		l = NULL;
+		item = list_find(l, before);
+		if (item == NULL)
+		{
+		    semsg(_(e_listidx), before);
+		    l = NULL;
+		}
 	    }
-	}
-	if (l != NULL)
-	{
-	    (void)list_insert_tv(l, &argvars[1], item);
-	    copy_tv(&argvars[0], rettv);
+	    if (l != NULL)
+	    {
+		(void)list_insert_tv(l, &argvars[1], item);
+		copy_tv(&argvars[0], rettv);
+	    }
 	}
     }
 }