summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoritchyny <itchyny@hatena.ne.jp>2020-05-09 10:39:38 +0900
committerWilliam Langford <wlangfor@gmail.com>2020-05-26 12:30:27 -0400
commit6306ac89667cf35f47ddc40aa0630546c57e387f (patch)
tree6bbbd60758a976421e85d3a7053ce1be9c27d19b
parent9163e09605383a88f6e953d6cb5cc2aebe18c84f (diff)
Reduce allocation on string multiplication
-rw-r--r--src/builtin.c20
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);