diff options
author | itchyny <itchyny@hatena.ne.jp> | 2020-05-09 10:39:38 +0900 |
---|---|---|
committer | William Langford <wlangfor@gmail.com> | 2020-05-26 12:30:27 -0400 |
commit | 6306ac89667cf35f47ddc40aa0630546c57e387f (patch) | |
tree | 6bbbd60758a976421e85d3a7053ce1be9c27d19b | |
parent | 9163e09605383a88f6e953d6cb5cc2aebe18c84f (diff) |
Reduce allocation on string multiplication
-rw-r--r-- | src/builtin.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/src/builtin.c b/src/builtin.c index 35645ea8..bf80c7ba 100644 --- a/src/builtin.c +++ b/src/builtin.c @@ -320,19 +320,17 @@ static jv f_multiply(jq_state *jq, jv input, jv a, jv b) { str = b; num = a; } - int n; - size_t alen = jv_string_length_bytes(jv_copy(str)); - jv res = jv_copy(str); - - for (n = jv_number_value(num) - 1; n > 0; n--) - res = jv_string_append_buf(res, jv_string_value(str), alen); - + jv res = jv_null(); + int n = jv_number_value(num); + if (n > 0) { + size_t alen = jv_string_length_bytes(jv_copy(str)); + res = jv_string_empty(alen * n); + for (; n > 0; n--) { + res = jv_string_append_buf(res, jv_string_value(str), alen); + } + } jv_free(str); jv_free(num); - if (n < 0) { - jv_free(res); - return jv_null(); - } return res; } else if (ak == JV_KIND_OBJECT && bk == JV_KIND_OBJECT) { return jv_object_merge_recursive(a, b); |