Mercurial > vim
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); + } } } }