aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVadim Zhestikov <v.zhestikov@f5.com>2025-06-23 12:33:18 -0700
committerVadimZhestikov <108960056+VadimZhestikov@users.noreply.github.com>2025-07-03 09:34:25 -0700
commitde00a558699b1fb234dd0328aa084a39ea788355 (patch)
treea762b0aba46855b9fdc6aec9f301f4e61a5971a0 /src
parent873664f3453908f84cf5421e17f093666c0d2b41 (diff)
downloadnjs-de00a558699b1fb234dd0328aa084a39ea788355.tar.gz
njs-de00a558699b1fb234dd0328aa084a39ea788355.zip
Improved memory consumption for concatenation of numbers and strings.
Diffstat (limited to 'src')
-rw-r--r--src/njs_vmcode.c52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/njs_vmcode.c b/src/njs_vmcode.c
index c7adf63f..ebca15e3 100644
--- a/src/njs_vmcode.c
+++ b/src/njs_vmcode.c
@@ -667,14 +667,52 @@ NEXT_LBL;
src = value1;
}
- ret = njs_primitive_value_to_string(vm, &dst, src);
- if (njs_slow_path(ret != NJS_OK)) {
- goto error;
- }
+ if (njs_is_number(src)) {
+ size_t size;
+ njs_string_t sp;
+ char buf[64];
- ret = njs_string_concat(vm, s1, s2, &name);
- if (njs_slow_path(ret == NJS_ERROR)) {
- goto error;
+ /* 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);