Mercurial > vim
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 /* |