diff --git a/src/json.c b/src/json.c index b0d98a290e..a3e58043d8 100644 --- a/src/json.c +++ b/src/json.c @@ -369,29 +369,38 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID, int options) GA_CONCAT_LITERAL(gap, "[]"); else { - ga_append(gap, '['); - for (i = 0; i < b->bv_ga.ga_len; i++) + int blen = b->bv_ga.ga_len; + char_u *src; + char_u *dst; + + // Worst case: '[' + ']' + per-byte 3 digits + comma = 2 + 4*blen + if (ga_grow(gap, 2 + 4 * blen) == FAIL) + goto theend; + src = (char_u *)b->bv_ga.ga_data; + dst = (char_u *)gap->ga_data + gap->ga_len; + *dst++ = '['; + for (i = 0; i < blen; i++) { - int byte = blob_get(b, i); + int byte = src[i]; if (i > 0) - ga_append(gap, ','); - // blob bytes are 0-255, use simple conversion + *dst++ = ','; if (byte >= 100) { - ga_append(gap, '0' + byte / 100); - ga_append(gap, '0' + (byte / 10) % 10); - ga_append(gap, '0' + byte % 10); + *dst++ = '0' + byte / 100; + *dst++ = '0' + (byte / 10) % 10; + *dst++ = '0' + byte % 10; } else if (byte >= 10) { - ga_append(gap, '0' + byte / 10); - ga_append(gap, '0' + byte % 10); + *dst++ = '0' + byte / 10; + *dst++ = '0' + byte % 10; } else - ga_append(gap, '0' + byte); + *dst++ = '0' + byte; } - ga_append(gap, ']'); + *dst++ = ']'; + gap->ga_len = (int)(dst - (char_u *)gap->ga_data); } break; diff --git a/src/version.c b/src/version.c index 0ce32fb2e4..9208a50785 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 431, /**/ 430, /**/