# HG changeset patch # User Bram Moolenaar # Date 1308444937 -7200 # Node ID 69e0783ed0ef40f72ebeba41f8c98c9992f368c7 # Parent caaf107cc272c15e560e29beee4785aac108a6a0 updated for version 7.3.224 Problem: Can't pass dict to sort function. Solution: Add the optional {dict} argument to sort(). (ZyX) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1919,7 +1919,8 @@ shellescape( {string} [, {special}]) simplify( {filename}) String simplify filename as much as possible sin( {expr}) Float sine of {expr} sinh( {expr}) Float hyperbolic sine of {expr} -sort( {list} [, {func}]) List sort {list}, using {func} to compare +sort( {list} [, {func} [, {dict}]]) + List sort {list}, using {func} to compare soundfold( {word}) String sound-fold {word} spellbadword() String badly spelled word at cursor spellsuggest( {word} [, {max} [, {capital}]]) @@ -5275,7 +5276,7 @@ sinh({expr}) *sinh()* {only available when compiled with the |+float| feature} -sort({list} [, {func}]) *sort()* *E702* +sort({list} [, {func} [, {dict}]]) *sort()* *E702* Sort the items in {list} in-place. Returns {list}. If you want a list to remain unmodified make a copy first: > :let sortedlist = sort(copy(mylist)) @@ -5283,6 +5284,8 @@ sort({list} [, {func}]) *sort()* *E7 Numbers sort after Strings, |Lists| after Numbers. For sorting text in the current buffer use |:sort|. When {func} is given and it is one then case is ignored. + {dict} is for functions with the "dict" attribute. It will be + used to set the local variable "self". |Dictionary-function| When {func} is a |Funcref| or a function name, this function is called to compare items. The function is invoked with two items as argument and must return zero if they are equal, 1 or diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -7930,7 +7930,7 @@ static struct fst {"sin", 1, 1, f_sin}, {"sinh", 1, 1, f_sinh}, #endif - {"sort", 1, 2, f_sort}, + {"sort", 1, 3, f_sort}, {"soundfold", 1, 1, f_soundfold}, {"spellbadword", 0, 1, f_spellbadword}, {"spellsuggest", 1, 3, f_spellsuggest}, @@ -16366,6 +16366,7 @@ static int static int item_compare_ic; static char_u *item_compare_func; +static dict_T *item_compare_selfdict; static int item_compare_func_err; #define ITEM_COMPARE_FAIL 999 @@ -16425,7 +16426,8 @@ item_compare2(s1, s2) rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */ res = call_func(item_compare_func, (int)STRLEN(item_compare_func), - &rettv, 2, argv, 0L, 0L, &dummy, TRUE, NULL); + &rettv, 2, argv, 0L, 0L, &dummy, TRUE, + item_compare_selfdict); clear_tv(&argv[0]); clear_tv(&argv[1]); @@ -16471,8 +16473,10 @@ f_sort(argvars, rettv) item_compare_ic = FALSE; item_compare_func = NULL; + item_compare_selfdict = NULL; if (argvars[1].v_type != VAR_UNKNOWN) { + /* optional second argument: {func} */ if (argvars[1].v_type == VAR_FUNC) item_compare_func = argvars[1].vval.v_string; else @@ -16487,6 +16491,17 @@ f_sort(argvars, rettv) else item_compare_func = get_tv_string(&argvars[1]); } + + if (argvars[2].v_type != VAR_UNKNOWN) + { + /* optional third argument: {dict} */ + if (argvars[2].v_type != VAR_DICT) + { + EMSG(_(e_dictreq)); + return; + } + item_compare_selfdict = argvars[2].vval.v_dict; + } } /* Make an array with each entry pointing to an item in the List. */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -710,6 +710,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 224, +/**/ 223, /**/ 222,