changeset 7885:6e6f829af138 v7.4.1239

commit https://github.com/vim/vim/commit/df5b27b20ec023274fb0f5347973d5abcde7ddd6 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Feb 2 18:43:17 2016 +0100 patch 7.4.1239 Problem: JSON message after the first one is dropped. Solution: Put remainder of message back in the queue.
author Christian Brabandt <cb@256bit.org>
date Tue, 02 Feb 2016 18:45:03 +0100
parents 1cc576119beb
children 1fca1e801a78
files src/channel.c src/version.c
diffstat 2 files changed, 22 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/channel.c
+++ b/src/channel.c
@@ -567,6 +567,13 @@ channel_read_json(int ch_idx)
 	    }
 	}
     }
+
+    /* Put the unread part back into the channel.
+     * TODO: insert in front */
+    if (reader.js_buf[reader.js_used] != NUL)
+	channel_save(ch_idx, reader.js_buf + reader.js_used,
+		(int)(reader.js_end - reader.js_buf) - reader.js_used);
+    vim_free(reader.js_buf);
 }
 
 /*
@@ -697,8 +704,9 @@ channel_exe_cmd(int idx, char_u *cmd, ty
 
 /*
  * Invoke a callback for channel "idx" if needed.
+ * Return OK when a message was handled, there might be another one.
  */
-    static void
+    static int
 may_invoke_callback(int idx)
 {
     char_u	*msg = NULL;
@@ -710,22 +718,22 @@ may_invoke_callback(int idx)
     int		json_mode = channels[idx].ch_json_mode;
 
     if (channel_peek(idx) == NULL)
-	return;
+	return FALSE;
     if (channels[idx].ch_close_cb != NULL)
 	/* this channel is handled elsewhere (netbeans) */
-	return;
+	return FALSE;
 
     if (json_mode)
     {
 	/* Get any json message. Return if there isn't one. */
 	channel_read_json(idx);
 	if (channel_get_json(idx, -1, &listtv) == FAIL)
-	    return;
+	    return FALSE;
 	if (listtv->v_type != VAR_LIST)
 	{
 	    /* TODO: give error */
 	    clear_tv(listtv);
-	    return;
+	    return FALSE;
 	}
 
 	list = listtv->vval.v_list;
@@ -733,7 +741,7 @@ may_invoke_callback(int idx)
 	{
 	    /* TODO: give error */
 	    clear_tv(listtv);
-	    return;
+	    return FALSE;
 	}
 
 	argv[1] = list->lv_first->li_next->li_tv;
@@ -748,14 +756,14 @@ may_invoke_callback(int idx)
 		arg3 = &list->lv_last->li_tv;
 	    channel_exe_cmd(idx, cmd, &argv[1], arg3);
 	    clear_tv(listtv);
-	    return;
+	    return TRUE;
 	}
 
 	if (typetv->v_type != VAR_NUMBER)
 	{
 	    /* TODO: give error */
 	    clear_tv(listtv);
-	    return;
+	    return FALSE;
 	}
 	seq_nr = typetv->vval.v_number;
     }
@@ -785,6 +793,8 @@ may_invoke_callback(int idx)
     if (listtv != NULL)
 	clear_tv(listtv);
     vim_free(msg);
+
+    return TRUE;
 }
 
 /*
@@ -1244,7 +1254,8 @@ channel_parse_messages(void)
     int	    i;
 
     for (i = 0; i < channel_count; ++i)
-	may_invoke_callback(i);
+	while (may_invoke_callback(i) == OK)
+	    ;
 }
 
 #endif /* FEAT_CHANNEL */
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1239,
+/**/
     1238,
 /**/
     1237,