aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval/decode.c
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2017-04-08 17:36:02 +0300
committerZyX <kp-pav@yandex.ru>2017-04-08 19:00:05 +0300
commit6006cb74ef7c43b58e8c06e5ecaa5823247b970a (patch)
treee317826e436ef054139c7b9a1f62d844ea855ac9 /src/nvim/eval/decode.c
parentb3587a456b4c235822006aae928667433ab85e66 (diff)
downloadrneovim-6006cb74ef7c43b58e8c06e5ecaa5823247b970a.tar.gz
rneovim-6006cb74ef7c43b58e8c06e5ecaa5823247b970a.tar.bz2
rneovim-6006cb74ef7c43b58e8c06e5ecaa5823247b970a.zip
eval/decode: Omit calling convert_setup for each string
Uses the same trick eval/encode does.
Diffstat (limited to 'src/nvim/eval/decode.c')
-rw-r--r--src/nvim/eval/decode.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/nvim/eval/decode.c b/src/nvim/eval/decode.c
index a4fc6c8eb1..e8c06b2927 100644
--- a/src/nvim/eval/decode.c
+++ b/src/nvim/eval/decode.c
@@ -606,6 +606,17 @@ parse_json_number_ret:
} \
} while (0)
+/// Last used p_enc value
+///
+/// Generic pointer: it is not used as a string, only pointer comparisons are
+/// performed. Must not be freed.
+static const void *last_p_enc = NULL;
+
+/// Conversion setup for converting from UTF-8 to last_p_enc
+static vimconv_T p_enc_conv = {
+ .vc_type = CONV_NONE,
+};
+
/// Convert JSON string into VimL object
///
/// @param[in] buf String to convert. UTF-8 encoding is assumed.
@@ -626,9 +637,12 @@ int json_decode_string(const char *const buf, const size_t buf_len,
EMSG(_("E474: Attempt to decode a blank string"));
return FAIL;
}
- vimconv_T conv = { .vc_type = CONV_NONE };
- convert_setup(&conv, (char_u *) "utf-8", p_enc);
- conv.vc_fail = true;
+ if (last_p_enc != (const void *)p_enc) {
+ p_enc_conv.vc_type = CONV_NONE;
+ convert_setup(&p_enc_conv, (char_u *)"utf-8", p_enc);
+ p_enc_conv.vc_fail = true;
+ last_p_enc = p_enc;
+ }
int ret = OK;
ValuesStack stack = KV_INITIAL_VALUE;
ContainerStack container_stack = KV_INITIAL_VALUE;
@@ -774,9 +788,9 @@ json_decode_string_cycle_start:
break;
}
case '"': {
- if (parse_json_string(&conv, buf, buf_len, &p, &stack, &container_stack,
- &next_map_special, &didcomma, &didcolon)
- == FAIL) {
+ if (parse_json_string(
+ &p_enc_conv, buf, buf_len, &p, &stack, &container_stack,
+ &next_map_special, &didcomma, &didcolon) == FAIL) {
// Error message was already given
goto json_decode_string_fail;
}
@@ -892,7 +906,6 @@ json_decode_string_fail:
tv_clear(&(kv_pop(stack).val));
}
json_decode_string_ret:
- convert_setup(&conv, NULL, NULL);
kv_destroy(stack);
kv_destroy(container_stack);
return ret;