mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
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.
This commit is contained in:
@@ -1514,4 +1514,17 @@ set_ref_in_channel(int copyID)
|
|||||||
}
|
}
|
||||||
return abort;
|
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 */
|
#endif /* FEAT_CHANNEL */
|
||||||
|
21
src/eval.c
21
src/eval.c
@@ -9924,7 +9924,10 @@ send_common(typval_T *argvars, char_u *text, int id, char *fun)
|
|||||||
|
|
||||||
ch_idx = get_channel_arg(&argvars[0]);
|
ch_idx = get_channel_arg(&argvars[0]);
|
||||||
if (ch_idx < 0)
|
if (ch_idx < 0)
|
||||||
|
{
|
||||||
|
EMSG(_(e_invarg));
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (argvars[2].v_type != VAR_UNKNOWN)
|
if (argvars[2].v_type != VAR_UNKNOWN)
|
||||||
{
|
{
|
||||||
@@ -9952,13 +9955,29 @@ f_ch_sendexpr(typval_T *argvars, typval_T *rettv)
|
|||||||
typval_T *listtv;
|
typval_T *listtv;
|
||||||
int ch_idx;
|
int ch_idx;
|
||||||
int id;
|
int id;
|
||||||
|
ch_mode_T ch_mode;
|
||||||
|
|
||||||
/* return an empty string by default */
|
/* return an empty string by default */
|
||||||
rettv->v_type = VAR_STRING;
|
rettv->v_type = VAR_STRING;
|
||||||
rettv->vval.v_string = NULL;
|
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();
|
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)
|
if (text == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@@ -24,4 +24,5 @@ int channel_select_setup(int maxfd_in, void *rfds_in);
|
|||||||
int channel_select_check(int ret_in, void *rfds_in);
|
int channel_select_check(int ret_in, void *rfds_in);
|
||||||
int channel_parse_messages(void);
|
int channel_parse_messages(void);
|
||||||
int set_ref_in_channel(int copyID);
|
int set_ref_in_channel(int copyID);
|
||||||
|
ch_mode_T channel_get_mode(int idx);
|
||||||
/* vim: set ft=c : */
|
/* vim: set ft=c : */
|
||||||
|
@@ -747,6 +747,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1288,
|
||||||
/**/
|
/**/
|
||||||
1287,
|
1287,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user