# HG changeset patch # User Bram Moolenaar # Date 1644089404 -3600 # Node ID 829aec0d0387f8370bc5ef6fb6345c94ca613281 # Parent 24573f3f05922917a8984bfcfe77c7a70b85ee4e patch 8.2.4304: Vim9: slice() makes a copy but doesn't change the type Commit: https://github.com/vim/vim/commit/00eb99528edc9ee1d14241d6914168fc33331ded Author: Bram Moolenaar Date: Sat Feb 5 19:23:18 2022 +0000 patch 8.2.4304: Vim9: slice() makes a copy but doesn't change the type Problem: Vim9: slice() makes a copy but doesn't change the type. Solution: Change the declared type like copy(). (closes https://github.com/vim/vim/issues/9696) diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -1169,6 +1169,27 @@ ret_first_arg(int argcount, return &t_void; } static type_T * +ret_slice(int argcount, + type2_T *argtypes, + type_T **decl_type) +{ + if (argcount > 0) + { + if (argtypes[0].type_decl != NULL) + { + switch (argtypes[0].type_decl->tt_type) + { + case VAR_STRING: *decl_type = &t_string; break; + case VAR_BLOB: *decl_type = &t_blob; break; + case VAR_LIST: *decl_type = &t_list_any; break; + default: break; + } + } + return argtypes[0].type_curr; + } + return &t_void; +} + static type_T * ret_copy(int argcount, type2_T *argtypes, type_T **decl_type) @@ -2292,7 +2313,7 @@ static funcentry_T global_functions[] = {"sinh", 1, 1, FEARG_1, arg1_float_or_nr, ret_float, FLOAT_FUNC(f_sinh)}, {"slice", 2, 3, FEARG_1, arg23_slice, - ret_first_arg, f_slice}, + ret_slice, f_slice}, {"sort", 1, 3, FEARG_1, arg13_sortuniq, ret_first_arg, f_sort}, {"sound_clear", 0, 0, 0, NULL, diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -3619,6 +3619,9 @@ def Test_slice() assert_equal([], slice(range(6), 1, -5)) assert_equal([], slice(range(6), 1, -6)) + var lds: list> = [{key: 'value'}] + assert_equal(['val'], lds->slice(0, 1)->map((_, v) => 'val')) + assert_equal(0z1122334455, slice(0z001122334455, 1)) assert_equal(0z112233, slice(0z001122334455, 1, 4)) assert_equal(0z11223344, slice(0z001122334455, 1, -1)) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4304, +/**/ 4303, /**/ 4302,