summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-02-02 18:43:17 +0100
committerBram Moolenaar <Bram@vim.org>2016-02-02 18:43:17 +0100
commitdf5b27b20ec023274fb0f5347973d5abcde7ddd6 (patch)
tree60ffd7eab3c167efce4c9fd639ff1c7324d6f7ef /src
parent56ead341a75e1a0395eee94a3280c67e2278a57e (diff)
patch 7.4.1239v7.4.1239
Problem: JSON message after the first one is dropped. Solution: Put remainder of message back in the queue.
Diffstat (limited to 'src')
-rw-r--r--src/channel.c29
-rw-r--r--src/version.c2
2 files changed, 22 insertions, 9 deletions
diff --git a/src/channel.c b/src/channel.c
index db13c8a9d7..7183ff61fc 100644
--- 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, typval_T *arg2, typval_T *arg3)
/*
* 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 */
diff --git a/src/version.c b/src/version.c
index 8fabfc91ad..1caaff1923 100644
--- 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,