details: https://hg.nginx.org/njs/rev/cf85d0f8640a branches: changeset: 2214:cf85d0f8640a user: Dmitry Volyntsev <xei...@nginx.com> date: Tue Oct 03 18:09:06 2023 -0700 description: Improved memory footprint of RegExp.prototype.replace().
diffstat: src/njs_flathsh.c | 9 +++++++++ src/njs_flathsh.h | 1 + src/njs_regexp.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 0 deletions(-) diffs (104 lines): diff -r a6410aad6eab -r cf85d0f8640a src/njs_flathsh.c --- a/src/njs_flathsh.c Tue Oct 03 00:39:04 2023 -0700 +++ b/src/njs_flathsh.c Tue Oct 03 18:09:06 2023 -0700 @@ -162,6 +162,15 @@ njs_flathsh_new(njs_flathsh_query_t *fhq } +void +njs_flathsh_destroy(njs_flathsh_t *fh, njs_flathsh_query_t *fhq) +{ + njs_flathsh_free(fhq, njs_flathsh_chunk(fh->slot)); + + fh->slot = NULL; +} + + static njs_flathsh_descr_t * njs_flathsh_alloc(njs_flathsh_query_t *fhq, size_t hash_size, size_t elts_size) { diff -r a6410aad6eab -r cf85d0f8640a src/njs_flathsh.h --- a/src/njs_flathsh.h Tue Oct 03 00:39:04 2023 -0700 +++ b/src/njs_flathsh.h Tue Oct 03 18:09:06 2023 -0700 @@ -130,6 +130,7 @@ NJS_EXPORT njs_flathsh_elt_t *njs_flaths njs_flathsh_query_t *fhq); NJS_EXPORT njs_flathsh_descr_t *njs_flathsh_new(njs_flathsh_query_t *fhq); +NJS_EXPORT void njs_flathsh_destroy(njs_flathsh_t *fh, njs_flathsh_query_t *fhq); /* Temporary backward compatibility .*/ diff -r a6410aad6eab -r cf85d0f8640a src/njs_regexp.c --- a/src/njs_regexp.c Tue Oct 03 00:39:04 2023 -0700 +++ b/src/njs_regexp.c Tue Oct 03 18:09:06 2023 -0700 @@ -1182,6 +1182,50 @@ done: } +static void +njs_regexp_exec_result_free(njs_vm_t *vm, njs_array_t *result) +{ + njs_uint_t n; + njs_value_t *start; + njs_flathsh_t *hash; + njs_object_prop_t *prop; + njs_lvlhsh_each_t lhe; + njs_lvlhsh_query_t lhq; + + if (result->object.fast_array) { + start = result->start; + + for (n = 0; n < result->length; n++) { + if (start[n].short_string.size == NJS_STRING_LONG) { + njs_mp_free(vm->mem_pool, start[n].long_string.data); + } + } + } + + njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto); + + hash = &result->object.hash; + + for ( ;; ) { + prop = njs_flathsh_each(hash, &lhe); + + if (prop == NULL) { + break; + } + + njs_mp_free(vm->mem_pool, prop); + } + + + lhq.pool = vm->mem_pool; + lhq.proto = &njs_object_hash_proto; + + njs_flathsh_destroy(hash, &lhq); + + njs_array_destroy(vm, result); +} + + njs_int_t njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused, njs_value_t *retval) @@ -1497,6 +1541,10 @@ njs_regexp_prototype_symbol_replace(njs_ arguments, ncaptures, &groups, replace, retval); + if (njs_object_slots(r)) { + njs_regexp_exec_result_free(vm, njs_array(r)); + } + } else { ret = njs_array_expand(vm, array, 0, njs_is_defined(&groups) ? 3 : 2); @@ -1517,6 +1565,8 @@ njs_regexp_prototype_symbol_replace(njs_ arguments, n, retval); } + njs_array_destroy(vm, array); + if (njs_slow_path(ret == NJS_ERROR)) { return NJS_ERROR; } _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel