changeset 11973:aec3df2af27c v8.0.0867

patch 8.0.0867: job and channel in a dict value not quoted commit https://github.com/vim/vim/commit/35422f45ba01806d357994f18cb9af64980c67e6 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 5 16:33:56 2017 +0200 patch 8.0.0867: job and channel in a dict value not quoted Problem: When using a job or channel value as a dict value, when turning it into a string the quotes are missing. Solution: Add quotes to the job and channel values. (Yasuhiro Matsumoto, closes #1930)
author Christian Brabandt <cb@256bit.org>
date Sat, 05 Aug 2017 16:45:04 +0200
parents 94f8b639760a
children 04f021e507e2
files src/eval.c src/list.c src/testdir/test_terminal.vim src/version.c
diffstat 4 files changed, 23 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -5683,9 +5683,9 @@ get_var_special_name(int nr)
  * If the memory is allocated "tofree" is set to it, otherwise NULL.
  * "numbuf" is used for a number.
  * When "copyID" is not NULL replace recursive lists and dicts with "...".
- * When both "echo_style" and "dict_val" are FALSE, put quotes around stings as
- * "string()", otherwise does not put quotes around strings, as ":echo"
- * displays values.
+ * When both "echo_style" and "composite_val" are FALSE, put quotes around
+ * stings as "string()", otherwise does not put quotes around strings, as
+ * ":echo" displays values.
  * When "restore_copyID" is FALSE, repeated items in dictionaries and lists
  * are replaced with "...".
  * May return NULL.
@@ -5698,7 +5698,7 @@ echo_string_core(
     int		copyID,
     int		echo_style,
     int		restore_copyID,
-    int		dict_val)
+    int		composite_val)
 {
     static int	recurse = 0;
     char_u	*r = NULL;
@@ -5721,10 +5721,12 @@ echo_string_core(
     switch (tv->v_type)
     {
 	case VAR_STRING:
-	    if (echo_style && !dict_val)
+	    if (echo_style && !composite_val)
 	    {
 		*tofree = NULL;
-		r = get_tv_string_buf(tv, numbuf);
+		r = tv->vval.v_string;
+		if (r == NULL)
+		    r = (char_u *)"";
 	    }
 	    else
 	    {
@@ -5841,10 +5843,19 @@ echo_string_core(
 
 	case VAR_NUMBER:
 	case VAR_UNKNOWN:
+	    *tofree = NULL;
+	    r = get_tv_string_buf(tv, numbuf);
+	    break;
+
 	case VAR_JOB:
 	case VAR_CHANNEL:
 	    *tofree = NULL;
 	    r = get_tv_string_buf(tv, numbuf);
+	    if (composite_val)
+	    {
+		*tofree = string_quote(r, FALSE);
+		r = *tofree;
+	    }
 	    break;
 
 	case VAR_FLOAT:
--- a/src/list.c
+++ b/src/list.c
@@ -740,7 +740,7 @@ list_join_inner(
     for (item = l->lv_first; item != NULL && !got_int; item = item->li_next)
     {
 	s = echo_string_core(&item->li_tv, &tofree, numbuf, copyID,
-					   echo_style, restore_copyID, FALSE);
+				      echo_style, restore_copyID, !echo_style);
 	if (s == NULL)
 	    return FAIL;
 
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -18,6 +18,9 @@ func Run_shell_in_terminal()
   let g:job = term_getjob(buf)
   call assert_equal(v:t_job, type(g:job))
 
+  let string = string({'job': term_getjob(buf)})
+  call assert_match("{'job': 'process \\d\\+ run'}", string)
+
   return buf
 endfunc
 
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    867,
+/**/
     866,
 /**/
     865,