comparison src/eval.c @ 6773:eb4b705a5d6a v7.4.708

patch 7.4.708 Problem: gettext() is called too often. Solution: Do not call gettext() for messages until they are actually used. (idea by Yasuhiro Matsumoto)
author Bram Moolenaar <bram@vim.org>
date Tue, 21 Apr 2015 16:49:05 +0200
parents 203888fa7192
children 1805e45ce4d6
comparison
equal deleted inserted replaced
6772:38118242a25d 6773:eb4b705a5d6a
800 static void vars_clear_ext __ARGS((hashtab_T *ht, int free_val)); 800 static void vars_clear_ext __ARGS((hashtab_T *ht, int free_val));
801 static void delete_var __ARGS((hashtab_T *ht, hashitem_T *hi)); 801 static void delete_var __ARGS((hashtab_T *ht, hashitem_T *hi));
802 static void list_one_var __ARGS((dictitem_T *v, char_u *prefix, int *first)); 802 static void list_one_var __ARGS((dictitem_T *v, char_u *prefix, int *first));
803 static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string, int *first)); 803 static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string, int *first));
804 static void set_var __ARGS((char_u *name, typval_T *varp, int copy)); 804 static void set_var __ARGS((char_u *name, typval_T *varp, int copy));
805 static int var_check_ro __ARGS((int flags, char_u *name)); 805 static int var_check_ro __ARGS((int flags, char_u *name, int use_gettext));
806 static int var_check_fixed __ARGS((int flags, char_u *name)); 806 static int var_check_fixed __ARGS((int flags, char_u *name, int use_gettext));
807 static int var_check_func_name __ARGS((char_u *name, int new_var)); 807 static int var_check_func_name __ARGS((char_u *name, int new_var));
808 static int valid_varname __ARGS((char_u *varname)); 808 static int valid_varname __ARGS((char_u *varname));
809 static int tv_check_lock __ARGS((int lock, char_u *name)); 809 static int tv_check_lock __ARGS((int lock, char_u *name, int use_gettext));
810 static int item_copy __ARGS((typval_T *from, typval_T *to, int deep, int copyID)); 810 static int item_copy __ARGS((typval_T *from, typval_T *to, int deep, int copyID));
811 static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags)); 811 static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags));
812 static char_u *trans_function_name __ARGS((char_u **pp, int skip, int flags, funcdict_T *fd)); 812 static char_u *trans_function_name __ARGS((char_u **pp, int skip, int flags, funcdict_T *fd));
813 static int eval_fname_script __ARGS((char_u *p)); 813 static int eval_fname_script __ARGS((char_u *p));
814 static int eval_fname_sid __ARGS((char_u *p)); 814 static int eval_fname_sid __ARGS((char_u *p));
2806 if (lp->ll_newkey == NULL) 2806 if (lp->ll_newkey == NULL)
2807 p = NULL; 2807 p = NULL;
2808 break; 2808 break;
2809 } 2809 }
2810 /* existing variable, need to check if it can be changed */ 2810 /* existing variable, need to check if it can be changed */
2811 else if (var_check_ro(lp->ll_di->di_flags, name)) 2811 else if (var_check_ro(lp->ll_di->di_flags, name, FALSE))
2812 return NULL; 2812 return NULL;
2813 2813
2814 if (len == -1) 2814 if (len == -1)
2815 clear_tv(&var1); 2815 clear_tv(&var1);
2816 lp->ll_tv = &lp->ll_di->di_tv; 2816 lp->ll_tv = &lp->ll_di->di_tv;
2939 *endp = cc; 2939 *endp = cc;
2940 } 2940 }
2941 } 2941 }
2942 else if (tv_check_lock(lp->ll_newkey == NULL 2942 else if (tv_check_lock(lp->ll_newkey == NULL
2943 ? lp->ll_tv->v_lock 2943 ? lp->ll_tv->v_lock
2944 : lp->ll_tv->vval.v_dict->dv_lock, lp->ll_name)) 2944 : lp->ll_tv->vval.v_dict->dv_lock, lp->ll_name, FALSE))
2945 ; 2945 ;
2946 else if (lp->ll_range) 2946 else if (lp->ll_range)
2947 { 2947 {
2948 listitem_T *ll_li = lp->ll_li; 2948 listitem_T *ll_li = lp->ll_li;
2949 int ll_n1 = lp->ll_n1; 2949 int ll_n1 = lp->ll_n1;
2951 /* 2951 /*
2952 * Check whether any of the list items is locked 2952 * Check whether any of the list items is locked
2953 */ 2953 */
2954 for (ri = rettv->vval.v_list->lv_first; ri != NULL && ll_li != NULL; ) 2954 for (ri = rettv->vval.v_list->lv_first; ri != NULL && ll_li != NULL; )
2955 { 2955 {
2956 if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name)) 2956 if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name, FALSE))
2957 return; 2957 return;
2958 ri = ri->li_next; 2958 ri = ri->li_next;
2959 if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == ll_n1)) 2959 if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == ll_n1))
2960 break; 2960 break;
2961 ll_li = ll_li->li_next; 2961 ll_li = ll_li->li_next;
3657 else if (do_unlet(lp->ll_name, forceit) == FAIL) 3657 else if (do_unlet(lp->ll_name, forceit) == FAIL)
3658 ret = FAIL; 3658 ret = FAIL;
3659 *name_end = cc; 3659 *name_end = cc;
3660 } 3660 }
3661 else if ((lp->ll_list != NULL 3661 else if ((lp->ll_list != NULL
3662 && tv_check_lock(lp->ll_list->lv_lock, lp->ll_name)) 3662 && tv_check_lock(lp->ll_list->lv_lock, lp->ll_name, FALSE))
3663 || (lp->ll_dict != NULL 3663 || (lp->ll_dict != NULL
3664 && tv_check_lock(lp->ll_dict->dv_lock, lp->ll_name))) 3664 && tv_check_lock(lp->ll_dict->dv_lock, lp->ll_name, FALSE)))
3665 return FAIL; 3665 return FAIL;
3666 else if (lp->ll_range) 3666 else if (lp->ll_range)
3667 { 3667 {
3668 listitem_T *li; 3668 listitem_T *li;
3669 listitem_T *ll_li = lp->ll_li; 3669 listitem_T *ll_li = lp->ll_li;
3670 int ll_n1 = lp->ll_n1; 3670 int ll_n1 = lp->ll_n1;
3671 3671
3672 while (ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= ll_n1)) 3672 while (ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= ll_n1))
3673 { 3673 {
3674 li = ll_li->li_next; 3674 li = ll_li->li_next;
3675 if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name)) 3675 if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name, FALSE))
3676 return FAIL; 3676 return FAIL;
3677 ll_li = li; 3677 ll_li = li;
3678 ++ll_n1; 3678 ++ll_n1;
3679 } 3679 }
3680 3680
3730 } 3730 }
3731 hi = hash_find(ht, varname); 3731 hi = hash_find(ht, varname);
3732 if (!HASHITEM_EMPTY(hi)) 3732 if (!HASHITEM_EMPTY(hi))
3733 { 3733 {
3734 di = HI2DI(hi); 3734 di = HI2DI(hi);
3735 if (var_check_fixed(di->di_flags, name) 3735 if (var_check_fixed(di->di_flags, name, FALSE)
3736 || var_check_ro(di->di_flags, name) 3736 || var_check_ro(di->di_flags, name, FALSE)
3737 || tv_check_lock(d->dv_lock, name)) 3737 || tv_check_lock(d->dv_lock, name, FALSE))
3738 return FAIL; 3738 return FAIL;
3739 delete_var(ht, hi); 3739 delete_var(ht, hi);
3740 return OK; 3740 return OK;
3741 } 3741 }
3742 } 3742 }
8935 8935
8936 rettv->vval.v_number = 1; /* Default: Failed */ 8936 rettv->vval.v_number = 1; /* Default: Failed */
8937 if (argvars[0].v_type == VAR_LIST) 8937 if (argvars[0].v_type == VAR_LIST)
8938 { 8938 {
8939 if ((l = argvars[0].vval.v_list) != NULL 8939 if ((l = argvars[0].vval.v_list) != NULL
8940 && !tv_check_lock(l->lv_lock, (char_u *)_("add() argument")) 8940 && !tv_check_lock(l->lv_lock,
8941 (char_u *)N_("add() argument"), TRUE)
8941 && list_append_tv(l, &argvars[1]) == OK) 8942 && list_append_tv(l, &argvars[1]) == OK)
8942 copy_tv(&argvars[0], rettv); 8943 copy_tv(&argvars[0], rettv);
8943 } 8944 }
8944 else 8945 else
8945 EMSG(_(e_listreq)); 8946 EMSG(_(e_listreq));
10497 char_u *action; 10498 char_u *action;
10498 { 10499 {
10499 dictitem_T *di1; 10500 dictitem_T *di1;
10500 hashitem_T *hi2; 10501 hashitem_T *hi2;
10501 int todo; 10502 int todo;
10502 char *arg_errmsg = N_("extend() argument"); 10503 char_u *arg_errmsg = (char_u *)N_("extend() argument");
10503 10504
10504 todo = (int)d2->dv_hashtab.ht_used; 10505 todo = (int)d2->dv_hashtab.ht_used;
10505 for (hi2 = d2->dv_hashtab.ht_array; todo > 0; ++hi2) 10506 for (hi2 = d2->dv_hashtab.ht_array; todo > 0; ++hi2)
10506 { 10507 {
10507 if (!HASHITEM_EMPTY(hi2)) 10508 if (!HASHITEM_EMPTY(hi2))
10532 EMSG2(_("E737: Key already exists: %s"), hi2->hi_key); 10533 EMSG2(_("E737: Key already exists: %s"), hi2->hi_key);
10533 break; 10534 break;
10534 } 10535 }
10535 else if (*action == 'f' && HI2DI(hi2) != di1) 10536 else if (*action == 'f' && HI2DI(hi2) != di1)
10536 { 10537 {
10537 if (tv_check_lock(di1->di_tv.v_lock, (char_u *)_(arg_errmsg)) 10538 if (tv_check_lock(di1->di_tv.v_lock, arg_errmsg, TRUE)
10538 || var_check_ro(di1->di_flags, (char_u *)_(arg_errmsg))) 10539 || var_check_ro(di1->di_flags, arg_errmsg, TRUE))
10539 break; 10540 break;
10540 clear_tv(&di1->di_tv); 10541 clear_tv(&di1->di_tv);
10541 copy_tv(&HI2DI(hi2)->di_tv, &di1->di_tv); 10542 copy_tv(&HI2DI(hi2)->di_tv, &di1->di_tv);
10542 } 10543 }
10543 } 10544 }
10551 static void 10552 static void
10552 f_extend(argvars, rettv) 10553 f_extend(argvars, rettv)
10553 typval_T *argvars; 10554 typval_T *argvars;
10554 typval_T *rettv; 10555 typval_T *rettv;
10555 { 10556 {
10556 char *arg_errmsg = N_("extend() argument"); 10557 char_u *arg_errmsg = (char_u *)N_("extend() argument");
10557 10558
10558 if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST) 10559 if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST)
10559 { 10560 {
10560 list_T *l1, *l2; 10561 list_T *l1, *l2;
10561 listitem_T *item; 10562 listitem_T *item;
10562 long before; 10563 long before;
10563 int error = FALSE; 10564 int error = FALSE;
10564 10565
10565 l1 = argvars[0].vval.v_list; 10566 l1 = argvars[0].vval.v_list;
10566 l2 = argvars[1].vval.v_list; 10567 l2 = argvars[1].vval.v_list;
10567 if (l1 != NULL && !tv_check_lock(l1->lv_lock, (char_u *)_(arg_errmsg)) 10568 if (l1 != NULL && !tv_check_lock(l1->lv_lock, arg_errmsg, TRUE)
10568 && l2 != NULL) 10569 && l2 != NULL)
10569 { 10570 {
10570 if (argvars[2].v_type != VAR_UNKNOWN) 10571 if (argvars[2].v_type != VAR_UNKNOWN)
10571 { 10572 {
10572 before = get_tv_number_chk(&argvars[2], &error); 10573 before = get_tv_number_chk(&argvars[2], &error);
10598 char_u *action; 10599 char_u *action;
10599 int i; 10600 int i;
10600 10601
10601 d1 = argvars[0].vval.v_dict; 10602 d1 = argvars[0].vval.v_dict;
10602 d2 = argvars[1].vval.v_dict; 10603 d2 = argvars[1].vval.v_dict;
10603 if (d1 != NULL && !tv_check_lock(d1->dv_lock, (char_u *)_(arg_errmsg)) 10604 if (d1 != NULL && !tv_check_lock(d1->dv_lock, arg_errmsg, TRUE)
10604 && d2 != NULL) 10605 && d2 != NULL)
10605 { 10606 {
10606 /* Check the third argument. */ 10607 /* Check the third argument. */
10607 if (argvars[2].v_type != VAR_UNKNOWN) 10608 if (argvars[2].v_type != VAR_UNKNOWN)
10608 { 10609 {
10817 typval_T save_val; 10818 typval_T save_val;
10818 typval_T save_key; 10819 typval_T save_key;
10819 int rem; 10820 int rem;
10820 int todo; 10821 int todo;
10821 char_u *ermsg = (char_u *)(map ? "map()" : "filter()"); 10822 char_u *ermsg = (char_u *)(map ? "map()" : "filter()");
10822 char *arg_errmsg = (map ? N_("map() argument") 10823 char_u *arg_errmsg = (char_u *)(map ? N_("map() argument")
10823 : N_("filter() argument")); 10824 : N_("filter() argument"));
10824 int save_did_emsg; 10825 int save_did_emsg;
10825 int idx = 0; 10826 int idx = 0;
10826 10827
10827 if (argvars[0].v_type == VAR_LIST) 10828 if (argvars[0].v_type == VAR_LIST)
10828 { 10829 {
10829 if ((l = argvars[0].vval.v_list) == NULL 10830 if ((l = argvars[0].vval.v_list) == NULL
10830 || (!map && tv_check_lock(l->lv_lock, (char_u *)_(arg_errmsg)))) 10831 || (!map && tv_check_lock(l->lv_lock, arg_errmsg, TRUE)))
10831 return; 10832 return;
10832 } 10833 }
10833 else if (argvars[0].v_type == VAR_DICT) 10834 else if (argvars[0].v_type == VAR_DICT)
10834 { 10835 {
10835 if ((d = argvars[0].vval.v_dict) == NULL 10836 if ((d = argvars[0].vval.v_dict) == NULL
10836 || (!map && tv_check_lock(d->dv_lock, (char_u *)_(arg_errmsg)))) 10837 || (!map && tv_check_lock(d->dv_lock, arg_errmsg, TRUE)))
10837 return; 10838 return;
10838 } 10839 }
10839 else 10840 else
10840 { 10841 {
10841 EMSG2(_(e_listdictarg), ermsg); 10842 EMSG2(_(e_listdictarg), ermsg);
10871 int r; 10872 int r;
10872 10873
10873 --todo; 10874 --todo;
10874 di = HI2DI(hi); 10875 di = HI2DI(hi);
10875 if (map && 10876 if (map &&
10876 (tv_check_lock(di->di_tv.v_lock, 10877 (tv_check_lock(di->di_tv.v_lock, arg_errmsg, TRUE)
10877 (char_u *)_(arg_errmsg)) 10878 || var_check_ro(di->di_flags, arg_errmsg, TRUE)))
10878 || var_check_ro(di->di_flags,
10879 (char_u *)_(arg_errmsg))))
10880 break; 10879 break;
10881 vimvars[VV_KEY].vv_str = vim_strsave(di->di_key); 10880 vimvars[VV_KEY].vv_str = vim_strsave(di->di_key);
10882 r = filter_map_one(&di->di_tv, expr, map, &rem); 10881 r = filter_map_one(&di->di_tv, expr, map, &rem);
10883 clear_tv(&vimvars[VV_KEY].vv_tv); 10882 clear_tv(&vimvars[VV_KEY].vv_tv);
10884 if (r == FAIL || did_emsg) 10883 if (r == FAIL || did_emsg)
10885 break; 10884 break;
10886 if (!map && rem) 10885 if (!map && rem)
10887 { 10886 {
10888 if (var_check_fixed(di->di_flags, 10887 if (var_check_fixed(di->di_flags, arg_errmsg, TRUE)
10889 (char_u *)_(arg_errmsg)) 10888 || var_check_ro(di->di_flags, arg_errmsg, TRUE))
10890 || var_check_ro(di->di_flags,
10891 (char_u *)_(arg_errmsg)))
10892 break; 10889 break;
10893 dictitem_remove(d, di); 10890 dictitem_remove(d, di);
10894 } 10891 }
10895 } 10892 }
10896 } 10893 }
10900 { 10897 {
10901 vimvars[VV_KEY].vv_type = VAR_NUMBER; 10898 vimvars[VV_KEY].vv_type = VAR_NUMBER;
10902 10899
10903 for (li = l->lv_first; li != NULL; li = nli) 10900 for (li = l->lv_first; li != NULL; li = nli)
10904 { 10901 {
10905 if (map && tv_check_lock(li->li_tv.v_lock, 10902 if (map && tv_check_lock(li->li_tv.v_lock, arg_errmsg, TRUE))
10906 (char_u *)_(arg_errmsg)))
10907 break; 10903 break;
10908 nli = li->li_next; 10904 nli = li->li_next;
10909 vimvars[VV_KEY].vv_nr = idx; 10905 vimvars[VV_KEY].vv_nr = idx;
10910 if (filter_map_one(&li->li_tv, expr, map, &rem) == FAIL 10906 if (filter_map_one(&li->li_tv, expr, map, &rem) == FAIL
10911 || did_emsg) 10907 || did_emsg)
13754 int error = FALSE; 13750 int error = FALSE;
13755 13751
13756 if (argvars[0].v_type != VAR_LIST) 13752 if (argvars[0].v_type != VAR_LIST)
13757 EMSG2(_(e_listarg), "insert()"); 13753 EMSG2(_(e_listarg), "insert()");
13758 else if ((l = argvars[0].vval.v_list) != NULL 13754 else if ((l = argvars[0].vval.v_list) != NULL
13759 && !tv_check_lock(l->lv_lock, (char_u *)_("insert() argument"))) 13755 && !tv_check_lock(l->lv_lock, (char_u *)N_("insert() argument"), TRUE))
13760 { 13756 {
13761 if (argvars[2].v_type != VAR_UNKNOWN) 13757 if (argvars[2].v_type != VAR_UNKNOWN)
13762 before = get_tv_number_chk(&argvars[2], &error); 13758 before = get_tv_number_chk(&argvars[2], &error);
13763 if (error) 13759 if (error)
13764 return; /* type error; errmsg already given */ 13760 return; /* type error; errmsg already given */
15835 long idx; 15831 long idx;
15836 long end; 15832 long end;
15837 char_u *key; 15833 char_u *key;
15838 dict_T *d; 15834 dict_T *d;
15839 dictitem_T *di; 15835 dictitem_T *di;
15840 char *arg_errmsg = N_("remove() argument"); 15836 char_u *arg_errmsg = (char_u *)N_("remove() argument");
15841 15837
15842 if (argvars[0].v_type == VAR_DICT) 15838 if (argvars[0].v_type == VAR_DICT)
15843 { 15839 {
15844 if (argvars[2].v_type != VAR_UNKNOWN) 15840 if (argvars[2].v_type != VAR_UNKNOWN)
15845 EMSG2(_(e_toomanyarg), "remove()"); 15841 EMSG2(_(e_toomanyarg), "remove()");
15846 else if ((d = argvars[0].vval.v_dict) != NULL 15842 else if ((d = argvars[0].vval.v_dict) != NULL
15847 && !tv_check_lock(d->dv_lock, (char_u *)_(arg_errmsg))) 15843 && !tv_check_lock(d->dv_lock, arg_errmsg, TRUE))
15848 { 15844 {
15849 key = get_tv_string_chk(&argvars[1]); 15845 key = get_tv_string_chk(&argvars[1]);
15850 if (key != NULL) 15846 if (key != NULL)
15851 { 15847 {
15852 di = dict_find(d, key, -1); 15848 di = dict_find(d, key, -1);
15853 if (di == NULL) 15849 if (di == NULL)
15854 EMSG2(_(e_dictkey), key); 15850 EMSG2(_(e_dictkey), key);
15855 else if (!var_check_fixed(di->di_flags, (char_u *)_(arg_errmsg)) 15851 else if (!var_check_fixed(di->di_flags, arg_errmsg, TRUE)
15856 && !var_check_ro(di->di_flags, 15852 && !var_check_ro(di->di_flags, arg_errmsg, TRUE))
15857 (char_u *)_(arg_errmsg)))
15858 { 15853 {
15859 *rettv = di->di_tv; 15854 *rettv = di->di_tv;
15860 init_tv(&di->di_tv); 15855 init_tv(&di->di_tv);
15861 dictitem_remove(d, di); 15856 dictitem_remove(d, di);
15862 } 15857 }
15864 } 15859 }
15865 } 15860 }
15866 else if (argvars[0].v_type != VAR_LIST) 15861 else if (argvars[0].v_type != VAR_LIST)
15867 EMSG2(_(e_listdictarg), "remove()"); 15862 EMSG2(_(e_listdictarg), "remove()");
15868 else if ((l = argvars[0].vval.v_list) != NULL 15863 else if ((l = argvars[0].vval.v_list) != NULL
15869 && !tv_check_lock(l->lv_lock, (char_u *)_(arg_errmsg))) 15864 && !tv_check_lock(l->lv_lock, arg_errmsg, TRUE))
15870 { 15865 {
15871 int error = FALSE; 15866 int error = FALSE;
15872 15867
15873 idx = get_tv_number_chk(&argvars[1], &error); 15868 idx = get_tv_number_chk(&argvars[1], &error);
15874 if (error) 15869 if (error)
16208 listitem_T *li, *ni; 16203 listitem_T *li, *ni;
16209 16204
16210 if (argvars[0].v_type != VAR_LIST) 16205 if (argvars[0].v_type != VAR_LIST)
16211 EMSG2(_(e_listarg), "reverse()"); 16206 EMSG2(_(e_listarg), "reverse()");
16212 else if ((l = argvars[0].vval.v_list) != NULL 16207 else if ((l = argvars[0].vval.v_list) != NULL
16213 && !tv_check_lock(l->lv_lock, (char_u *)_("reverse() argument"))) 16208 && !tv_check_lock(l->lv_lock,
16209 (char_u *)N_("reverse() argument"), TRUE))
16214 { 16210 {
16215 li = l->lv_last; 16211 li = l->lv_last;
16216 l->lv_first = l->lv_last = NULL; 16212 l->lv_first = l->lv_last = NULL;
16217 l->lv_len = 0; 16213 l->lv_len = 0;
16218 while (li != NULL) 16214 while (li != NULL)
17742 EMSG2(_(e_listarg), sort ? "sort()" : "uniq()"); 17738 EMSG2(_(e_listarg), sort ? "sort()" : "uniq()");
17743 else 17739 else
17744 { 17740 {
17745 l = argvars[0].vval.v_list; 17741 l = argvars[0].vval.v_list;
17746 if (l == NULL || tv_check_lock(l->lv_lock, 17742 if (l == NULL || tv_check_lock(l->lv_lock,
17747 (char_u *)(sort ? _("sort() argument") : _("uniq() argument")))) 17743 (char_u *)(sort ? N_("sort() argument") : N_("uniq() argument")),
17744 TRUE))
17748 return; 17745 return;
17749 rettv->vval.v_list = l; 17746 rettv->vval.v_list = l;
17750 rettv->v_type = VAR_LIST; 17747 rettv->v_type = VAR_LIST;
17751 ++l->lv_refcount; 17748 ++l->lv_refcount;
17752 17749
21454 return; 21451 return;
21455 21452
21456 if (v != NULL) 21453 if (v != NULL)
21457 { 21454 {
21458 /* existing variable, need to clear the value */ 21455 /* existing variable, need to clear the value */
21459 if (var_check_ro(v->di_flags, name) 21456 if (var_check_ro(v->di_flags, name, FALSE)
21460 || tv_check_lock(v->di_tv.v_lock, name)) 21457 || tv_check_lock(v->di_tv.v_lock, name, FALSE))
21461 return; 21458 return;
21462 if (v->di_tv.v_type != tv->v_type 21459 if (v->di_tv.v_type != tv->v_type
21463 && !((v->di_tv.v_type == VAR_STRING 21460 && !((v->di_tv.v_type == VAR_STRING
21464 || v->di_tv.v_type == VAR_NUMBER) 21461 || v->di_tv.v_type == VAR_NUMBER)
21465 && (tv->v_type == VAR_STRING 21462 && (tv->v_type == VAR_STRING
21553 /* 21550 /*
21554 * Return TRUE if di_flags "flags" indicates variable "name" is read-only. 21551 * Return TRUE if di_flags "flags" indicates variable "name" is read-only.
21555 * Also give an error message. 21552 * Also give an error message.
21556 */ 21553 */
21557 static int 21554 static int
21558 var_check_ro(flags, name) 21555 var_check_ro(flags, name, use_gettext)
21559 int flags; 21556 int flags;
21560 char_u *name; 21557 char_u *name;
21558 int use_gettext;
21561 { 21559 {
21562 if (flags & DI_FLAGS_RO) 21560 if (flags & DI_FLAGS_RO)
21563 { 21561 {
21564 EMSG2(_(e_readonlyvar), name); 21562 EMSG2(_(e_readonlyvar), use_gettext ? (char_u *)_(name) : name);
21565 return TRUE; 21563 return TRUE;
21566 } 21564 }
21567 if ((flags & DI_FLAGS_RO_SBX) && sandbox) 21565 if ((flags & DI_FLAGS_RO_SBX) && sandbox)
21568 { 21566 {
21569 EMSG2(_(e_readonlysbx), name); 21567 EMSG2(_(e_readonlysbx), use_gettext ? (char_u *)_(name) : name);
21570 return TRUE; 21568 return TRUE;
21571 } 21569 }
21572 return FALSE; 21570 return FALSE;
21573 } 21571 }
21574 21572
21575 /* 21573 /*
21576 * Return TRUE if di_flags "flags" indicates variable "name" is fixed. 21574 * Return TRUE if di_flags "flags" indicates variable "name" is fixed.
21577 * Also give an error message. 21575 * Also give an error message.
21578 */ 21576 */
21579 static int 21577 static int
21580 var_check_fixed(flags, name) 21578 var_check_fixed(flags, name, use_gettext)
21581 int flags; 21579 int flags;
21582 char_u *name; 21580 char_u *name;
21581 int use_gettext;
21583 { 21582 {
21584 if (flags & DI_FLAGS_FIX) 21583 if (flags & DI_FLAGS_FIX)
21585 { 21584 {
21586 EMSG2(_("E795: Cannot delete variable %s"), name); 21585 EMSG2(_("E795: Cannot delete variable %s"),
21586 use_gettext ? (char_u *)_(name) : name);
21587 return TRUE; 21587 return TRUE;
21588 } 21588 }
21589 return FALSE; 21589 return FALSE;
21590 } 21590 }
21591 21591
21639 return TRUE; 21639 return TRUE;
21640 } 21640 }
21641 21641
21642 /* 21642 /*
21643 * Return TRUE if typeval "tv" is set to be locked (immutable). 21643 * Return TRUE if typeval "tv" is set to be locked (immutable).
21644 * Also give an error message, using "name". 21644 * Also give an error message, using "name" or _("name") when use_gettext is
21645 * TRUE.
21645 */ 21646 */
21646 static int 21647 static int
21647 tv_check_lock(lock, name) 21648 tv_check_lock(lock, name, use_gettext)
21648 int lock; 21649 int lock;
21649 char_u *name; 21650 char_u *name;
21651 int use_gettext;
21650 { 21652 {
21651 if (lock & VAR_LOCKED) 21653 if (lock & VAR_LOCKED)
21652 { 21654 {
21653 EMSG2(_("E741: Value is locked: %s"), 21655 EMSG2(_("E741: Value is locked: %s"),
21654 name == NULL ? (char_u *)_("Unknown") : name); 21656 name == NULL ? (char_u *)_("Unknown")
21657 : use_gettext ? (char_u *)_(name)
21658 : name);
21655 return TRUE; 21659 return TRUE;
21656 } 21660 }
21657 if (lock & VAR_FIXED) 21661 if (lock & VAR_FIXED)
21658 { 21662 {
21659 EMSG2(_("E742: Cannot change value of %s"), 21663 EMSG2(_("E742: Cannot change value of %s"),
21660 name == NULL ? (char_u *)_("Unknown") : name); 21664 name == NULL ? (char_u *)_("Unknown")
21665 : use_gettext ? (char_u *)_(name)
21666 : name);
21661 return TRUE; 21667 return TRUE;
21662 } 21668 }
21663 return FALSE; 21669 return FALSE;
21664 } 21670 }
21665 21671
22593 goto erret; 22599 goto erret;
22594 } 22600 }
22595 if (fudi.fd_di == NULL) 22601 if (fudi.fd_di == NULL)
22596 { 22602 {
22597 /* Can't add a function to a locked dictionary */ 22603 /* Can't add a function to a locked dictionary */
22598 if (tv_check_lock(fudi.fd_dict->dv_lock, eap->arg)) 22604 if (tv_check_lock(fudi.fd_dict->dv_lock, eap->arg, FALSE))
22599 goto erret; 22605 goto erret;
22600 } 22606 }
22601 /* Can't change an existing function if it is locked */ 22607 /* Can't change an existing function if it is locked */
22602 else if (tv_check_lock(fudi.fd_di->di_tv.v_lock, eap->arg)) 22608 else if (tv_check_lock(fudi.fd_di->di_tv.v_lock, eap->arg, FALSE))
22603 goto erret; 22609 goto erret;
22604 22610
22605 /* Give the function a sequential number. Can only be used with a 22611 /* Give the function a sequential number. Can only be used with a
22606 * Funcref! */ 22612 * Funcref! */
22607 vim_free(name); 22613 vim_free(name);