mirror of
https://github.com/vim/vim.git
synced 2025-11-15 23:14:06 -05:00
patch 7.4.1279
Problem: jsonencode() is not producing strict JSON.
Solution: Add jsencode() and jsdecode(). Make jsonencode() and jsondecode()
strict.
This commit is contained in:
@@ -119,7 +119,7 @@ typedef struct {
|
||||
char_u *ch_callback; /* function to call when a msg is not handled */
|
||||
cbq_T ch_cb_head; /* dummy node for pre-request callbacks */
|
||||
|
||||
int ch_json_mode; /* TRUE for a json channel */
|
||||
ch_mode_T ch_mode;
|
||||
jsonq_T ch_json_head; /* dummy node, header for circular queue */
|
||||
|
||||
int ch_timeout; /* request timeout in msec */
|
||||
@@ -526,12 +526,12 @@ channel_open(char *hostname, int port_in, int waittime, void (*close_cb)(void))
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the json mode of channel "idx" to TRUE or FALSE.
|
||||
* Set the json mode of channel "idx" to "ch_mode".
|
||||
*/
|
||||
void
|
||||
channel_set_json_mode(int idx, int json_mode)
|
||||
channel_set_json_mode(int idx, ch_mode_T ch_mode)
|
||||
{
|
||||
channels[idx].ch_json_mode = json_mode;
|
||||
channels[idx].ch_mode = ch_mode;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -672,7 +672,8 @@ channel_parse_json(int ch_idx)
|
||||
js_read_T reader;
|
||||
typval_T listtv;
|
||||
jsonq_T *item;
|
||||
jsonq_T *head = &channels[ch_idx].ch_json_head;
|
||||
channel_T *channel = &channels[ch_idx];
|
||||
jsonq_T *head = &channel->ch_json_head;
|
||||
int ret;
|
||||
|
||||
if (channel_peek(ch_idx) == NULL)
|
||||
@@ -685,7 +686,8 @@ channel_parse_json(int ch_idx)
|
||||
reader.js_fill = NULL;
|
||||
/* reader.js_fill = channel_fill; */
|
||||
reader.js_cookie = &ch_idx;
|
||||
ret = json_decode(&reader, &listtv);
|
||||
ret = json_decode(&reader, &listtv,
|
||||
channel->ch_mode == MODE_JS ? JSON_JS : 0);
|
||||
if (ret == OK)
|
||||
{
|
||||
/* Only accept the response when it is a list with at least two
|
||||
@@ -854,6 +856,8 @@ channel_exe_cmd(int idx, char_u *cmd, typval_T *arg2, typval_T *arg3)
|
||||
typval_T *tv;
|
||||
typval_T err_tv;
|
||||
char_u *json = NULL;
|
||||
channel_T *channel = &channels[idx];
|
||||
int options = channel->ch_mode == MODE_JS ? JSON_JS : 0;
|
||||
|
||||
/* Don't pollute the display with errors. */
|
||||
++emsg_skip;
|
||||
@@ -861,7 +865,8 @@ channel_exe_cmd(int idx, char_u *cmd, typval_T *arg2, typval_T *arg3)
|
||||
if (is_eval)
|
||||
{
|
||||
if (tv != NULL)
|
||||
json = json_encode_nr_expr(arg3->vval.v_number, tv);
|
||||
json = json_encode_nr_expr(arg3->vval.v_number, tv,
|
||||
options);
|
||||
if (tv == NULL || (json != NULL && *json == NUL))
|
||||
{
|
||||
/* If evaluation failed or the result can't be encoded
|
||||
@@ -869,7 +874,8 @@ channel_exe_cmd(int idx, char_u *cmd, typval_T *arg2, typval_T *arg3)
|
||||
err_tv.v_type = VAR_STRING;
|
||||
err_tv.vval.v_string = (char_u *)"ERROR";
|
||||
tv = &err_tv;
|
||||
json = json_encode_nr_expr(arg3->vval.v_number, tv);
|
||||
json = json_encode_nr_expr(arg3->vval.v_number, tv,
|
||||
options);
|
||||
}
|
||||
if (json != NULL)
|
||||
{
|
||||
@@ -900,13 +906,13 @@ may_invoke_callback(int idx)
|
||||
typval_T argv[3];
|
||||
int seq_nr = -1;
|
||||
channel_T *channel = &channels[idx];
|
||||
int json_mode = channel->ch_json_mode;
|
||||
ch_mode_T ch_mode = channel->ch_mode;
|
||||
|
||||
if (channel->ch_close_cb != NULL)
|
||||
/* this channel is handled elsewhere (netbeans) */
|
||||
return FALSE;
|
||||
|
||||
if (json_mode)
|
||||
if (ch_mode != MODE_RAW)
|
||||
{
|
||||
/* Get any json message in the queue. */
|
||||
if (channel_get_json(idx, -1, &listtv) == FAIL)
|
||||
|
||||
Reference in New Issue
Block a user