Mercurial > vim
comparison src/eval.c @ 6166:0a42938f449c v7.4.419
updated for version 7.4.419
Problem: Whan part of a list is locked it's possible to make changes.
Solution: Check if any of the list items is locked before make a change.
(ZyX)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Fri, 29 Aug 2014 09:46:10 +0200 |
parents | d4e0c197e979 |
children | fca35aa9380a |
comparison
equal
deleted
inserted
replaced
6165:ed87285c8ec1 | 6166:0a42938f449c |
---|---|
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)) |
2945 ; | 2945 ; |
2946 else if (lp->ll_range) | 2946 else if (lp->ll_range) |
2947 { | 2947 { |
2948 listitem_T *ll_li = lp->ll_li; | |
2949 int ll_n1 = lp->ll_n1; | |
2950 | |
2951 /* | |
2952 * Check whether any of the list items is locked | |
2953 */ | |
2954 for (ri = rettv->vval.v_list->lv_first; ri != NULL; ) | |
2955 { | |
2956 if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name)) | |
2957 return; | |
2958 ri = ri->li_next; | |
2959 if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == ll_n1)) | |
2960 break; | |
2961 ll_li = ll_li->li_next; | |
2962 ++ll_n1; | |
2963 } | |
2964 | |
2948 /* | 2965 /* |
2949 * Assign the List values to the list items. | 2966 * Assign the List values to the list items. |
2950 */ | 2967 */ |
2951 for (ri = rettv->vval.v_list->lv_first; ri != NULL; ) | 2968 for (ri = rettv->vval.v_list->lv_first; ri != NULL; ) |
2952 { | 2969 { |
3644 else if (tv_check_lock(lp->ll_tv->v_lock, lp->ll_name)) | 3661 else if (tv_check_lock(lp->ll_tv->v_lock, lp->ll_name)) |
3645 return FAIL; | 3662 return FAIL; |
3646 else if (lp->ll_range) | 3663 else if (lp->ll_range) |
3647 { | 3664 { |
3648 listitem_T *li; | 3665 listitem_T *li; |
3666 listitem_T *ll_li = lp->ll_li; | |
3667 int ll_n1 = lp->ll_n1; | |
3668 | |
3669 while (ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= ll_n1)) | |
3670 { | |
3671 li = ll_li->li_next; | |
3672 if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name)) | |
3673 return FAIL; | |
3674 ll_li = li; | |
3675 ++ll_n1; | |
3676 } | |
3649 | 3677 |
3650 /* Delete a range of List items. */ | 3678 /* Delete a range of List items. */ |
3651 while (lp->ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= lp->ll_n1)) | 3679 while (lp->ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= lp->ll_n1)) |
3652 { | 3680 { |
3653 li = lp->ll_li->li_next; | 3681 li = lp->ll_li->li_next; |