comparison 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
comparison
equal deleted inserted replaced
24483:798fcf242d48 24484:bc1a533148d7
2221 tv.vval.v_number = val; 2221 tv.vval.v_number = val;
2222 set_vim_var_nr(VV_KEY, idx); 2222 set_vim_var_nr(VV_KEY, idx);
2223 if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL 2223 if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL
2224 || did_emsg) 2224 || did_emsg)
2225 break; 2225 break;
2226 if (newtv.v_type != VAR_NUMBER) 2226 if (newtv.v_type != VAR_NUMBER && newtv.v_type != VAR_BOOL)
2227 { 2227 {
2228 clear_tv(&newtv); 2228 clear_tv(&newtv);
2229 emsg(_(e_invalblob)); 2229 emsg(_(e_invalblob));
2230 break; 2230 break;
2231 } 2231 }
2734 void 2734 void
2735 f_insert(typval_T *argvars, typval_T *rettv) 2735 f_insert(typval_T *argvars, typval_T *rettv)
2736 { 2736 {
2737 long before = 0; 2737 long before = 0;
2738 listitem_T *item; 2738 listitem_T *item;
2739 list_T *l;
2740 int error = FALSE; 2739 int error = FALSE;
2741 2740
2742 if (argvars[0].v_type == VAR_BLOB) 2741 if (argvars[0].v_type == VAR_BLOB)
2743 { 2742 {
2744 int val, len; 2743 int val, len;
2745 char_u *p; 2744 char_u *p;
2746 2745
2747 if (argvars[0].vval.v_blob == NULL) 2746 if (argvars[0].vval.v_blob == NULL)
2747 {
2748 if (in_vim9script())
2749 emsg(_(e_cannot_add_to_null_blob));
2748 return; 2750 return;
2751 }
2749 2752
2750 len = blob_len(argvars[0].vval.v_blob); 2753 len = blob_len(argvars[0].vval.v_blob);
2751 if (argvars[2].v_type != VAR_UNKNOWN) 2754 if (argvars[2].v_type != VAR_UNKNOWN)
2752 { 2755 {
2753 before = (long)tv_get_number_chk(&argvars[2], &error); 2756 before = (long)tv_get_number_chk(&argvars[2], &error);
2777 2780
2778 copy_tv(&argvars[0], rettv); 2781 copy_tv(&argvars[0], rettv);
2779 } 2782 }
2780 else if (argvars[0].v_type != VAR_LIST) 2783 else if (argvars[0].v_type != VAR_LIST)
2781 semsg(_(e_listblobarg), "insert()"); 2784 semsg(_(e_listblobarg), "insert()");
2782 else if ((l = argvars[0].vval.v_list) != NULL 2785 else
2783 && !value_check_lock(l->lv_lock, 2786 {
2787 list_T *l = argvars[0].vval.v_list;
2788
2789 if (l == NULL)
2790 {
2791 if (in_vim9script())
2792 emsg(_(e_cannot_add_to_null_list));
2793 }
2794 else if (!value_check_lock(l->lv_lock,
2784 (char_u *)N_("insert() argument"), TRUE)) 2795 (char_u *)N_("insert() argument"), TRUE))
2785 { 2796 {
2786 if (argvars[2].v_type != VAR_UNKNOWN) 2797 if (argvars[2].v_type != VAR_UNKNOWN)
2787 before = (long)tv_get_number_chk(&argvars[2], &error); 2798 before = (long)tv_get_number_chk(&argvars[2], &error);
2788 if (error) 2799 if (error)
2789 return; // type error; errmsg already given 2800 return; // type error; errmsg already given
2790 2801
2791 if (before == l->lv_len) 2802 if (before == l->lv_len)
2792 item = NULL; 2803 item = NULL;
2793 else 2804 else
2794 { 2805 {
2795 item = list_find(l, before); 2806 item = list_find(l, before);
2796 if (item == NULL) 2807 if (item == NULL)
2797 { 2808 {
2798 semsg(_(e_listidx), before); 2809 semsg(_(e_listidx), before);
2799 l = NULL; 2810 l = NULL;
2800 } 2811 }
2801 } 2812 }
2802 if (l != NULL) 2813 if (l != NULL)
2803 { 2814 {
2804 (void)list_insert_tv(l, &argvars[1], item); 2815 (void)list_insert_tv(l, &argvars[1], item);
2805 copy_tv(&argvars[0], rettv); 2816 copy_tv(&argvars[0], rettv);
2817 }
2806 } 2818 }
2807 } 2819 }
2808 } 2820 }
2809 2821
2810 /* 2822 /*