# HG changeset patch # User Christian Brabandt # Date 1493577004 -7200 # Node ID 162bcd0debd736c1c1598d4521f0b428ca32e1f7 # Parent 47bfa931b0e767221703813caf29d67eaa189c33 patch 8.0.0593: duplication of code for adding a list or dict return value commit https://github.com/vim/vim/commit/45cf6e910c6d162775ca9d470fac4b6db844001f Author: Bram Moolenaar Date: Sun Apr 30 20:25:19 2017 +0200 patch 8.0.0593: duplication of code for adding a list or dict return value Problem: Duplication of code for adding a list or dict return value. Solution: Add rettv_dict_set() and rettv_list_set(). (Yegappan Lakshmanan) diff --git a/src/dict.c b/src/dict.c --- a/src/dict.c +++ b/src/dict.c @@ -59,14 +59,24 @@ rettv_dict_alloc(typval_T *rettv) if (d == NULL) return FAIL; - rettv->vval.v_dict = d; - rettv->v_type = VAR_DICT; + rettv_dict_set(rettv, d); rettv->v_lock = 0; - ++d->dv_refcount; return OK; } /* + * Set a dictionary as the return value + */ + void +rettv_dict_set(typval_T *rettv, dict_T *d) +{ + rettv->v_type = VAR_DICT; + rettv->vval.v_dict = d; + if (d != NULL) + ++d->dv_refcount; +} + +/* * Free a Dictionary, including all non-container items it contains. * Ignores the reference count. */ @@ -646,11 +656,7 @@ failret: *arg = skipwhite(*arg + 1); if (evaluate) - { - rettv->v_type = VAR_DICT; - rettv->vval.v_dict = d; - ++d->dv_refcount; - } + rettv_dict_set(rettv, d); return OK; } diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -4665,9 +4665,7 @@ eval_index( item = item->li_next; } clear_tv(rettv); - rettv->v_type = VAR_LIST; - rettv->vval.v_list = l; - ++l->lv_refcount; + rettv_list_set(rettv, l); } else { @@ -8486,9 +8484,7 @@ getwinvar( if (opts != NULL) { - rettv->v_type = VAR_DICT; - rettv->vval.v_dict = opts; - ++opts->dv_refcount; + rettv_dict_set(rettv, opts); done = TRUE; } } diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -3005,8 +3005,7 @@ f_expand(typval_T *argvars, typval_T *re && get_tv_number_chk(&argvars[2], &error) && !error) { - rettv->v_type = VAR_LIST; - rettv->vval.v_list = NULL; + rettv_list_set(rettv, NULL); } s = get_tv_string(&argvars[0]); @@ -3909,12 +3908,7 @@ f_get(typval_T *argvars, typval_T *rettv } } else if (STRCMP(what, "dict") == 0) - { - rettv->v_type = VAR_DICT; - rettv->vval.v_dict = pt->pt_dict; - if (pt->pt_dict != NULL) - ++pt->pt_dict->dv_refcount; - } + rettv_dict_set(rettv, pt->pt_dict); else if (STRCMP(what, "args") == 0) { rettv->v_type = VAR_LIST; @@ -4214,9 +4208,7 @@ f_getbufvar(typval_T *argvars, typval_T if (opts != NULL) { - rettv->v_type = VAR_DICT; - rettv->vval.v_dict = opts; - ++opts->dv_refcount; + rettv_dict_set(rettv, opts); done = TRUE; } } @@ -5372,8 +5364,7 @@ f_glob(typval_T *argvars, typval_T *rett { if (get_tv_number_chk(&argvars[2], &error)) { - rettv->v_type = VAR_LIST; - rettv->vval.v_list = NULL; + rettv_list_set(rettv, NULL); } if (argvars[3].v_type != VAR_UNKNOWN && get_tv_number_chk(&argvars[3], &error)) @@ -5429,8 +5420,7 @@ f_globpath(typval_T *argvars, typval_T * { if (get_tv_number_chk(&argvars[3], &error)) { - rettv->v_type = VAR_LIST; - rettv->vval.v_list = NULL; + rettv_list_set(rettv, NULL); } if (argvars[4].v_type != VAR_UNKNOWN && get_tv_number_chk(&argvars[4], &error)) @@ -9152,9 +9142,7 @@ f_reverse(typval_T *argvars, typval_T *r list_append(l, li); li = ni; } - rettv->vval.v_list = l; - rettv->v_type = VAR_LIST; - ++l->lv_refcount; + rettv_list_set(rettv, l); l->lv_idx = l->lv_len - l->lv_idx - 1; } } @@ -10742,9 +10730,7 @@ do_sort_uniq(typval_T *argvars, typval_T (char_u *)(sort ? N_("sort() argument") : N_("uniq() argument")), TRUE)) goto theend; - rettv->vval.v_list = l; - rettv->v_type = VAR_LIST; - ++l->lv_refcount; + rettv_list_set(rettv, l); len = list_len(l); if (len <= 1) @@ -11832,8 +11818,7 @@ f_synconcealed(typval_T *argvars UNUSED, char_u str[NUMBUFLEN]; #endif - rettv->v_type = VAR_LIST; - rettv->vval.v_list = NULL; + rettv_list_set(rettv, NULL); #if defined(FEAT_SYN_HL) && defined(FEAT_CONCEAL) lnum = get_tv_lnum(argvars); /* -1 on type error */ @@ -11890,8 +11875,7 @@ f_synstack(typval_T *argvars UNUSED, typ int id; #endif - rettv->v_type = VAR_LIST; - rettv->vval.v_list = NULL; + rettv_list_set(rettv, NULL); #ifdef FEAT_SYN_HL lnum = get_tv_lnum(argvars); /* -1 on type error */ @@ -12057,9 +12041,7 @@ get_cmd_output_as_rettv( list_append(list, li); } - ++list->lv_refcount; - rettv->v_type = VAR_LIST; - rettv->vval.v_list = list; + rettv_list_set(rettv, list); list = NULL; } else @@ -12465,8 +12447,7 @@ f_test_null_channel(typval_T *argvars UN static void f_test_null_dict(typval_T *argvars UNUSED, typval_T *rettv) { - rettv->v_type = VAR_DICT; - rettv->vval.v_dict = NULL; + rettv_dict_set(rettv, NULL); } #ifdef FEAT_JOB_CHANNEL @@ -12481,8 +12462,7 @@ f_test_null_job(typval_T *argvars UNUSED static void f_test_null_list(typval_T *argvars UNUSED, typval_T *rettv) { - rettv->v_type = VAR_LIST; - rettv->vval.v_list = NULL; + rettv_list_set(rettv, NULL); } static void diff --git a/src/if_perl.xs b/src/if_perl.xs --- a/src/if_perl.xs +++ b/src/if_perl.xs @@ -1136,9 +1136,7 @@ perl_to_vim(SV *sv, typval_T *rettv) } } - list->lv_refcount++; - rettv->v_type = VAR_LIST; - rettv->vval.v_list = list; + rettv_list_set(rettv, list); break; } case SVt_PVHV: /* dictionary */ @@ -1192,9 +1190,7 @@ perl_to_vim(SV *sv, typval_T *rettv) } } - dict->dv_refcount++; - rettv->v_type = VAR_DICT; - rettv->vval.v_dict = dict; + rettv_dict_set(rettv, dict); break; } default: /* not convertible */ diff --git a/src/list.c b/src/list.c --- a/src/list.c +++ b/src/list.c @@ -97,11 +97,21 @@ rettv_list_alloc(typval_T *rettv) if (l == NULL) return FAIL; - rettv->vval.v_list = l; + rettv->v_lock = 0; + rettv_list_set(rettv, l); + return OK; +} + +/* + * Set a list as the return value + */ + void +rettv_list_set(typval_T *rettv, list_T *l) +{ rettv->v_type = VAR_LIST; - rettv->v_lock = 0; - ++l->lv_refcount; - return OK; + rettv->vval.v_list = l; + if (l != NULL) + ++l->lv_refcount; } /* @@ -875,11 +885,7 @@ failret: *arg = skipwhite(*arg + 1); if (evaluate) - { - rettv->v_type = VAR_LIST; - rettv->vval.v_list = l; - ++l->lv_refcount; - } + rettv_list_set(rettv, l); return OK; } diff --git a/src/proto/dict.pro b/src/proto/dict.pro --- a/src/proto/dict.pro +++ b/src/proto/dict.pro @@ -1,6 +1,7 @@ /* dict.c */ dict_T *dict_alloc(void); int rettv_dict_alloc(typval_T *rettv); +void rettv_dict_set(typval_T *rettv, dict_T *d); void dict_unref(dict_T *d); int dict_free_nonref(int copyID); void dict_free_items(int copyID); diff --git a/src/proto/list.pro b/src/proto/list.pro --- a/src/proto/list.pro +++ b/src/proto/list.pro @@ -4,6 +4,7 @@ void list_rem_watch(list_T *l, listwatch void list_fix_watch(list_T *l, listitem_T *item); list_T *list_alloc(void); int rettv_list_alloc(typval_T *rettv); +void rettv_list_set(typval_T *rettv, list_T *l); void list_unref(list_T *l); int list_free_nonref(int copyID); void list_free_items(int copyID); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 593, +/**/ 592, /**/ 591,