]> granicus.if.org Git - vim/commitdiff
patch 8.2.2356: Vim9: ":put =expr" does not handle a list properly v8.2.2356
authorBram Moolenaar <Bram@vim.org>
Fri, 15 Jan 2021 17:04:43 +0000 (18:04 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 15 Jan 2021 17:04:43 +0000 (18:04 +0100)
Problem:    Vim9: ":put =expr" does not handle a list properly.
Solution:   Use the same logic as eval_to_string_eap(). (closes #7684)

src/eval.c
src/proto/eval.pro
src/testdir/test_vim9_cmd.vim
src/version.c
src/vim9execute.c

index 84f6c2bf27517259a9031a90e65d647556b10129..13ee49aac4f4a28dec6d21898eb585eed174b984 100644 (file)
@@ -466,6 +466,45 @@ skip_expr_concatenate(
     return res;
 }
 
+/*
+ * Convert "tv" to a string.
+ * When "convert" is TRUE convert a List into a sequence of lines and convert
+ * a Float to a String.
+ * Returns an allocated string (NULL when out of memory).
+ */
+    char_u *
+typval2string(typval_T *tv, int convert)
+{
+    garray_T   ga;
+    char_u     *retval;
+#ifdef FEAT_FLOAT
+    char_u     numbuf[NUMBUFLEN];
+#endif
+
+    if (convert && tv->v_type == VAR_LIST)
+    {
+       ga_init2(&ga, (int)sizeof(char), 80);
+       if (tv->vval.v_list != NULL)
+       {
+           list_join(&ga, tv->vval.v_list, (char_u *)"\n", TRUE, FALSE, 0);
+           if (tv->vval.v_list->lv_len > 0)
+               ga_append(&ga, NL);
+       }
+       ga_append(&ga, NUL);
+       retval = (char_u *)ga.ga_data;
+    }
+#ifdef FEAT_FLOAT
+    else if (convert && tv->v_type == VAR_FLOAT)
+    {
+       vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv->vval.v_float);
+       retval = vim_strsave(numbuf);
+    }
+#endif
+    else
+       retval = vim_strsave(tv_get_string(tv));
+    return retval;
+}
+
 /*
  * Top level evaluation function, returning a string.  Does not handle line
  * breaks.
@@ -481,10 +520,6 @@ eval_to_string_eap(
 {
     typval_T   tv;
     char_u     *retval;
-    garray_T   ga;
-#ifdef FEAT_FLOAT
-    char_u     numbuf[NUMBUFLEN];
-#endif
     evalarg_T  evalarg;
 
     fill_evalarg_from_eap(&evalarg, eap, eap != NULL && eap->skip);
@@ -492,27 +527,7 @@ eval_to_string_eap(
        retval = NULL;
     else
     {
-       if (convert && tv.v_type == VAR_LIST)
-       {
-           ga_init2(&ga, (int)sizeof(char), 80);
-           if (tv.vval.v_list != NULL)
-           {
-               list_join(&ga, tv.vval.v_list, (char_u *)"\n", TRUE, FALSE, 0);
-               if (tv.vval.v_list->lv_len > 0)
-                   ga_append(&ga, NL);
-           }
-           ga_append(&ga, NUL);
-           retval = (char_u *)ga.ga_data;
-       }
-#ifdef FEAT_FLOAT
-       else if (convert && tv.v_type == VAR_FLOAT)
-       {
-           vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float);
-           retval = vim_strsave(numbuf);
-       }
-#endif
-       else
-           retval = vim_strsave(tv_get_string(&tv));
+       retval = typval2string(&tv, convert);
        clear_tv(&tv);
     }
     clear_evalarg(&evalarg, NULL);
index f611a0efa74fbf07b589d359be784d1b5e8181a1..fbae530306908b9e216f76eba465c22b5677cca2 100644 (file)
@@ -11,6 +11,7 @@ int eval_expr_to_bool(typval_T *expr, int *error);
 char_u *eval_to_string_skip(char_u *arg, exarg_T *eap, int skip);
 int skip_expr(char_u **pp, evalarg_T *evalarg);
 int skip_expr_concatenate(char_u **arg, char_u **start, char_u **end, evalarg_T *evalarg);
+char_u *typval2string(typval_T *tv, int convert);
 char_u *eval_to_string_eap(char_u *arg, int convert, exarg_T *eap);
 char_u *eval_to_string(char_u *arg, int convert);
 char_u *eval_to_string_safe(char_u *arg, int use_sandbox);
index 5d66966801bae0cc9b6feded050d8cc7d4936827..098cded98abf2fa51508defc9c99882b5a97001e 100644 (file)
@@ -736,6 +736,9 @@ def Test_put_command()
   assert_equal('above', getline(3))
   assert_equal('below', getline(4))
 
+  :2put =['a', 'b', 'c']
+  assert_equal(['ppp', 'a', 'b', 'c', 'above'], getline(2, 6))
+
   # compute range at runtime
   setline(1, range(1, 8))
   @a = 'aaa'
index 8285df772141c4481ca546e42e809494a729a268..9d217e2a067f4cc42aa7eaef940bb985a66b9129 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2356,
 /**/
     2355,
 /**/
index 9c9c273650176e33bf4234d959b0b8ec8443311f..87a9218ae422711e9a0e146233f21b689f2e4e50 100644 (file)
@@ -3357,7 +3357,7 @@ call_def_function(
                            expr = tv->vval.v_string;
                        else
                        {
-                           expr = typval_tostring(tv);  // allocates value
+                           expr = typval2string(tv, TRUE); // allocates value
                            clear_tv(tv);
                        }
                        --ectx.ec_stack.ga_len;