summaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-03-03 18:09:10 +0100
committerBram Moolenaar <Bram@vim.org>2016-03-03 18:09:10 +0100
commitda94fdf2588b3910d38e477a755748ce2c6d2e66 (patch)
tree0b754f63290ce625420af880f4deda0616acb566 /src/eval.c
parent9f7820f83bc994bbbecdca9483b355953f07179b (diff)
patch 7.4.1482v7.4.1482
Problem: "timeout" option not supported on ch_send*() and ch_eval*(). Solution: Get and use the timeout option from the argument.
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c41
1 files changed, 24 insertions, 17 deletions
diff --git a/src/eval.c b/src/eval.c
index faed315e6b..716706855c 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -10518,15 +10518,15 @@ f_ch_readraw(typval_T *argvars, typval_T *rettv)
*/
static channel_T *
send_common(
- typval_T *argvars,
- char_u *text,
- int id,
- int eval,
- char *fun,
- int *part_read)
+ typval_T *argvars,
+ char_u *text,
+ int id,
+ int eval,
+ jobopt_T *opt,
+ char *fun,
+ int *part_read)
{
channel_T *channel;
- jobopt_T opt;
int part_send;
channel = get_channel_arg(&argvars[0]);
@@ -10535,25 +10535,25 @@ send_common(
part_send = channel_part_send(channel);
*part_read = channel_part_read(channel);
- clear_job_options(&opt);
- if (get_job_options(&argvars[2], &opt, JO_CALLBACK) == FAIL)
+ clear_job_options(opt);
+ if (get_job_options(&argvars[2], opt, JO_CALLBACK + JO_TIMEOUT) == FAIL)
return NULL;
/* Set the callback. An empty callback means no callback and not reading
* the response. With "ch_evalexpr()" and "ch_evalraw()" a callback is not
* allowed. */
- if (opt.jo_callback != NULL && *opt.jo_callback != NUL)
+ if (opt->jo_callback != NULL && *opt->jo_callback != NUL)
{
if (eval)
{
EMSG2(_("E917: Cannot use a callback with %s()"), fun);
return NULL;
}
- channel_set_req_callback(channel, part_send, opt.jo_callback, id);
+ channel_set_req_callback(channel, part_send, opt->jo_callback, id);
}
if (channel_send(channel, part_send, text, fun) == OK
- && opt.jo_callback == NULL)
+ && opt->jo_callback == NULL)
return channel;
return NULL;
}
@@ -10571,6 +10571,7 @@ ch_expr_common(typval_T *argvars, typval_T *rettv, int eval)
ch_mode_T ch_mode;
int part_send;
int part_read;
+ jobopt_T opt;
int timeout;
/* return an empty string by default */
@@ -10595,12 +10596,15 @@ ch_expr_common(typval_T *argvars, typval_T *rettv, int eval)
if (text == NULL)
return;
- channel = send_common(argvars, text, id, eval,
+ channel = send_common(argvars, text, id, eval, &opt,
eval ? "ch_evalexpr" : "ch_sendexpr", &part_read);
vim_free(text);
if (channel != NULL && eval)
{
- /* TODO: timeout from options */
+ if (opt.jo_set & JO_TIMEOUT)
+ timeout = opt.jo_timeout;
+ else
+ timeout = channel_get_timeout(channel, part_read);
timeout = channel_get_timeout(channel, part_read);
if (channel_read_json_block(channel, part_read, timeout, id, &listtv)
== OK)
@@ -10644,6 +10648,7 @@ ch_raw_common(typval_T *argvars, typval_T *rettv, int eval)
char_u *text;
channel_T *channel;
int part_read;
+ jobopt_T opt;
int timeout;
/* return an empty string by default */
@@ -10651,12 +10656,14 @@ ch_raw_common(typval_T *argvars, typval_T *rettv, int eval)
rettv->vval.v_string = NULL;
text = get_tv_string_buf(&argvars[1], buf);
- channel = send_common(argvars, text, 0, eval,
+ channel = send_common(argvars, text, 0, eval, &opt,
eval ? "ch_evalraw" : "ch_sendraw", &part_read);
if (channel != NULL && eval)
{
- /* TODO: timeout from options */
- timeout = channel_get_timeout(channel, part_read);
+ if (opt.jo_set & JO_TIMEOUT)
+ timeout = opt.jo_timeout;
+ else
+ timeout = channel_get_timeout(channel, part_read);
rettv->vval.v_string = channel_read_block(channel, part_read, timeout);
}
}