Mercurial > njs
changeset 2583:3abe1f23d462
Improved memory consumption for concatenation of numbers and strings.
| author | Vadim Zhestikov <v.zhestikov@f5.com> |
|---|---|
| date | Mon, 23 Jun 2025 12:33:18 -0700 |
| parents | 93d79230539b |
| children | 97975fd9163a |
| files | src/njs_vmcode.c |
| diffstat | 1 files changed, 46 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/njs_vmcode.c Tue Jul 01 17:31:16 2025 +0800 +++ b/src/njs_vmcode.c Mon Jun 23 12:33:18 2025 -0700 @@ -667,14 +667,52 @@ src = value1; } - ret = njs_primitive_value_to_string(vm, &dst, src); - if (njs_slow_path(ret != NJS_OK)) { - goto error; - } - - ret = njs_string_concat(vm, s1, s2, &name); - if (njs_slow_path(ret == NJS_ERROR)) { - goto error; + if (njs_is_number(src)) { + size_t size; + njs_string_t sp; + char buf[64]; + + /* Alloc free path for "str" + int or int + "str" concatenation. */ + + num = njs_number(src); + + if (isnan(num)) { + njs_atom_to_value(vm, &dst, NJS_ATOM_STRING_NaN); + + } else if (isinf(num)) { + + if (num < 0) { + njs_atom_to_value(vm, &dst, NJS_ATOM_STRING__Infinity); + + } else { + njs_atom_to_value(vm, &dst, NJS_ATOM_STRING_Infinity); + } + + } else { + size = njs_dtoa(num, buf); + + sp.start = (u_char *) buf; + sp.size = size; + sp.length = size; + + dst.string.data = &sp; + } + + ret = njs_string_concat(vm, s1, s2, &name); + if (njs_slow_path(ret == NJS_ERROR)) { + goto error; + } + + } else { + ret = njs_primitive_value_to_string(vm, &dst, src); + if (njs_slow_path(ret != NJS_OK)) { + goto error; + } + + ret = njs_string_concat(vm, s1, s2, &name); + if (njs_slow_path(ret == NJS_ERROR)) { + goto error; + } } njs_value_assign(retval, &name);
