mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 9.0.1540: reverse() on string doesn't work in compiled function
Problem: reverse() on string doesn't work in compiled function. Solution: Accept string in argument type check. (Yegappan Lakshmanan, closes #12377)
This commit is contained in:
committed by
Bram Moolenaar
parent
4ce1bda869
commit
f9dc278946
@@ -756,6 +756,17 @@ arg_string_list_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *co
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check "type" is a modifiable list of 'any' or a blob or a string.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
arg_string_list_or_blob_mod(type_T *type, type_T *decl_type, argcontext_T *context)
|
||||||
|
{
|
||||||
|
if (arg_string_list_or_blob(type, decl_type, context) == FAIL)
|
||||||
|
return FAIL;
|
||||||
|
return arg_type_modifiable(type, context->arg_idx + 1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check "type" is a job.
|
* Check "type" is a job.
|
||||||
*/
|
*/
|
||||||
@@ -1010,7 +1021,7 @@ static argcheck_T arg1_float_or_nr[] = {arg_float_or_nr};
|
|||||||
static argcheck_T arg1_job[] = {arg_job};
|
static argcheck_T arg1_job[] = {arg_job};
|
||||||
static argcheck_T arg1_list_any[] = {arg_list_any};
|
static argcheck_T arg1_list_any[] = {arg_list_any};
|
||||||
static argcheck_T arg1_list_number[] = {arg_list_number};
|
static argcheck_T arg1_list_number[] = {arg_list_number};
|
||||||
static argcheck_T arg1_list_or_blob_mod[] = {arg_list_or_blob_mod};
|
static argcheck_T arg1_string_or_list_or_blob_mod[] = {arg_string_list_or_blob_mod};
|
||||||
static argcheck_T arg1_list_or_dict[] = {arg_list_or_dict};
|
static argcheck_T arg1_list_or_dict[] = {arg_list_or_dict};
|
||||||
static argcheck_T arg1_list_string[] = {arg_list_string};
|
static argcheck_T arg1_list_string[] = {arg_list_string};
|
||||||
static argcheck_T arg1_string_or_list_or_dict[] = {arg_string_or_list_or_dict};
|
static argcheck_T arg1_string_or_list_or_dict[] = {arg_string_or_list_or_dict};
|
||||||
@@ -2413,7 +2424,7 @@ static funcentry_T global_functions[] =
|
|||||||
ret_repeat, f_repeat},
|
ret_repeat, f_repeat},
|
||||||
{"resolve", 1, 1, FEARG_1, arg1_string,
|
{"resolve", 1, 1, FEARG_1, arg1_string,
|
||||||
ret_string, f_resolve},
|
ret_string, f_resolve},
|
||||||
{"reverse", 1, 1, FEARG_1, arg1_list_or_blob_mod,
|
{"reverse", 1, 1, FEARG_1, arg1_string_or_list_or_blob_mod,
|
||||||
ret_first_arg, f_reverse},
|
ret_first_arg, f_reverse},
|
||||||
{"round", 1, 1, FEARG_1, arg1_float_or_nr,
|
{"round", 1, 1, FEARG_1, arg1_float_or_nr,
|
||||||
ret_float, f_round},
|
ret_float, f_round},
|
||||||
|
@@ -2994,16 +2994,14 @@ list_reverse(list_T *l, typval_T *rettv)
|
|||||||
void
|
void
|
||||||
f_reverse(typval_T *argvars, typval_T *rettv)
|
f_reverse(typval_T *argvars, typval_T *rettv)
|
||||||
{
|
{
|
||||||
if (in_vim9script() && check_for_list_or_blob_arg(argvars, 0) == FAIL)
|
if (check_for_string_or_list_or_blob_arg(argvars, 0) == FAIL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (argvars[0].v_type == VAR_BLOB)
|
if (argvars[0].v_type == VAR_BLOB)
|
||||||
blob_reverse(argvars[0].vval.v_blob, rettv);
|
blob_reverse(argvars[0].vval.v_blob, rettv);
|
||||||
else if (argvars[0].v_type == VAR_STRING)
|
else if (argvars[0].v_type == VAR_STRING)
|
||||||
string_reverse(argvars[0].vval.v_string, rettv);
|
string_reverse(argvars[0].vval.v_string, rettv);
|
||||||
else if (argvars[0].v_type != VAR_LIST)
|
else if (argvars[0].v_type == VAR_LIST)
|
||||||
semsg(_(e_argument_of_str_must_be_list_or_blob), "reverse()");
|
|
||||||
else
|
|
||||||
list_reverse(argvars[0].vval.v_list, rettv);
|
list_reverse(argvars[0].vval.v_list, rettv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -134,7 +134,7 @@ didset_string_options(void)
|
|||||||
(void)opt_strings_flags(p_swb, p_swb_values, &swb_flags, TRUE);
|
(void)opt_strings_flags(p_swb, p_swb_values, &swb_flags, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(FEAT_EVAL)
|
#if defined(FEAT_EVAL) || defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* Trigger the OptionSet autocommand.
|
* Trigger the OptionSet autocommand.
|
||||||
* "opt_idx" is the index of the option being set.
|
* "opt_idx" is the index of the option being set.
|
||||||
|
@@ -3475,13 +3475,16 @@ endfunc
|
|||||||
|
|
||||||
" Test for the reverse() function with a string
|
" Test for the reverse() function with a string
|
||||||
func Test_string_reverse()
|
func Test_string_reverse()
|
||||||
call assert_equal('', reverse(test_null_string()))
|
let lines =<< trim END
|
||||||
for [s1, s2] in [['', ''], ['a', 'a'], ['ab', 'ba'], ['abc', 'cba'],
|
call assert_equal('', reverse(test_null_string()))
|
||||||
\ ['abcd', 'dcba'], ['«-«-»-»', '»-»-«-«'],
|
for [s1, s2] in [['', ''], ['a', 'a'], ['ab', 'ba'], ['abc', 'cba'],
|
||||||
\ ['🇦', '🇦'], ['🇦🇧', '🇧🇦'], ['🇦🇧🇨', '🇨🇧🇦'],
|
\ ['abcd', 'dcba'], ['«-«-»-»', '»-»-«-«'],
|
||||||
\ ['🇦«🇧-🇨»🇩', '🇩»🇨-🇧«🇦']]
|
\ ['🇦', '🇦'], ['🇦🇧', '🇧🇦'], ['🇦🇧🇨', '🇨🇧🇦'],
|
||||||
call assert_equal(s2, reverse(s1))
|
\ ['🇦«🇧-🇨»🇩', '🇩»🇨-🇧«🇦']]
|
||||||
endfor
|
call assert_equal(s2, reverse(s1))
|
||||||
|
endfor
|
||||||
|
END
|
||||||
|
call v9.CheckLegacyAndVim9Success(lines)
|
||||||
|
|
||||||
" test in latin1 encoding
|
" test in latin1 encoding
|
||||||
let save_enc = &encoding
|
let save_enc = &encoding
|
||||||
|
@@ -981,7 +981,7 @@ func Test_reverse_sort_uniq()
|
|||||||
END
|
END
|
||||||
call v9.CheckLegacyAndVim9Success(lines)
|
call v9.CheckLegacyAndVim9Success(lines)
|
||||||
|
|
||||||
call assert_fails('call reverse({})', 'E899:')
|
call assert_fails('call reverse({})', 'E1252:')
|
||||||
call assert_fails('call uniq([1, 2], {x, y -> []})', 'E745:')
|
call assert_fails('call uniq([1, 2], {x, y -> []})', 'E745:')
|
||||||
call assert_fails("call sort([1, 2], function('min'), 1)", "E1206:")
|
call assert_fails("call sort([1, 2], function('min'), 1)", "E1206:")
|
||||||
call assert_fails("call sort([1, 2], function('invalid_func'))", "E700:")
|
call assert_fails("call sort([1, 2], function('invalid_func'))", "E700:")
|
||||||
|
@@ -62,7 +62,7 @@ func Test_dict_method()
|
|||||||
call assert_equal(2, d->remove("two"))
|
call assert_equal(2, d->remove("two"))
|
||||||
let d.two = 2
|
let d.two = 2
|
||||||
call assert_fails('let x = d->repeat(2)', 'E731:')
|
call assert_fails('let x = d->repeat(2)', 'E731:')
|
||||||
call assert_fails('let x = d->reverse()', 'E899:')
|
call assert_fails('let x = d->reverse()', 'E1252:')
|
||||||
call assert_fails('let x = d->sort()', 'E686:')
|
call assert_fails('let x = d->sort()', 'E686:')
|
||||||
call assert_equal("{'one': 1, 'two': 2, 'three': 3}", d->string())
|
call assert_equal("{'one': 1, 'two': 2, 'three': 3}", d->string())
|
||||||
call assert_equal(v:t_dict, d->type())
|
call assert_equal(v:t_dict, d->type())
|
||||||
|
@@ -3459,8 +3459,7 @@ def Test_resolve()
|
|||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_reverse()
|
def Test_reverse()
|
||||||
v9.CheckDefAndScriptFailure(['reverse(10)'], ['E1013: Argument 1: type mismatch, expected list<any> but got number', 'E1226: List or Blob required for argument 1'])
|
v9.CheckDefAndScriptFailure(['reverse(10)'], ['E1013: Argument 1: type mismatch, expected list<any> but got number', 'E1252: String, List or Blob required for argument 1'])
|
||||||
v9.CheckDefAndScriptFailure(['reverse("abc")'], ['E1013: Argument 1: type mismatch, expected list<any> but got string', 'E1226: List or Blob required for argument 1'])
|
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_reverse_return_type()
|
def Test_reverse_return_type()
|
||||||
|
@@ -695,6 +695,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1540,
|
||||||
/**/
|
/**/
|
||||||
1539,
|
1539,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user