changeset 27555:829aec0d0387 v8.2.4304

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 <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 05 Feb 2022 20:30:04 +0100
parents 24573f3f0592
children b940866eac65
files src/evalfunc.c src/testdir/test_vim9_builtin.vim src/version.c
diffstat 3 files changed, 27 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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,
--- 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<dict<string>> = [{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))
--- 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,