# HG changeset patch # User Christian Brabandt # Date 1454878805 -3600 # Node ID 8e0d4cd8157a1111bda68784cf8bb62eec5c808f # Parent fd76e567bf86253820cec61d4ff3c6b2e61eb78c commit https://github.com/vim/vim/commit/ae8eb3ca927f1b0ac2a6643da8699538cdc380f6 Author: Bram Moolenaar Date: Sun Feb 7 21:59:26 2016 +0100 patch 7.4.1288 Problem: ch_sendexpr() does not use JS encoding. Solution: Use the encoding that fits the channel mode. Refuse using ch_sendexpr() on a raw channel. diff --git a/src/channel.c b/src/channel.c --- a/src/channel.c +++ b/src/channel.c @@ -1514,4 +1514,17 @@ set_ref_in_channel(int copyID) } return abort; } + +/* + * Return the mode of channel "idx". + * If "idx" is invalid returns MODE_JSON. + */ + ch_mode_T +channel_get_mode(int idx) +{ + if (idx < 0 || idx >= channel_count) + return MODE_JSON; + return channels[idx].ch_mode; +} + #endif /* FEAT_CHANNEL */ diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -9924,7 +9924,10 @@ send_common(typval_T *argvars, char_u *t ch_idx = get_channel_arg(&argvars[0]); if (ch_idx < 0) + { + EMSG(_(e_invarg)); return -1; + } if (argvars[2].v_type != VAR_UNKNOWN) { @@ -9952,13 +9955,29 @@ f_ch_sendexpr(typval_T *argvars, typval_ typval_T *listtv; int ch_idx; int id; + ch_mode_T ch_mode; /* return an empty string by default */ rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; + ch_idx = get_channel_arg(&argvars[0]); + if (ch_idx < 0) + { + EMSG(_(e_invarg)); + return; + } + + ch_mode = channel_get_mode(ch_idx); + if (ch_mode == MODE_RAW) + { + EMSG(_("E912: cannot use ch_sendexpr() with a raw channel")); + return; + } + id = channel_get_id(); - text = json_encode_nr_expr(id, &argvars[1], 0); + text = json_encode_nr_expr(id, &argvars[1], + ch_mode == MODE_JS ? JSON_JS : 0); if (text == NULL) return; diff --git a/src/proto/channel.pro b/src/proto/channel.pro --- a/src/proto/channel.pro +++ b/src/proto/channel.pro @@ -24,4 +24,5 @@ int channel_select_setup(int maxfd_in, v int channel_select_check(int ret_in, void *rfds_in); int channel_parse_messages(void); int set_ref_in_channel(int copyID); +ch_mode_T channel_get_mode(int idx); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -748,6 +748,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1288, +/**/ 1287, /**/ 1286,