Welcome! Log In Create A New Profile

Advanced

[njs] Fixed String.prototype.replace() when function returns non-string.

Dmitry Volyntsev
April 14, 2020 08:50AM
details: https://hg.nginx.org/njs/rev/3a650363913a
branches:
changeset: 1373:3a650363913a
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Tue Apr 14 12:43:09 2020 +0000
description:
Fixed String.prototype.replace() when function returns non-string.

This closes #303 issue on Github.

diffstat:

src/njs_string.c | 47 ++++++++++++++++++++++++-----------------------
src/test/njs_unit_test.c | 6 ++++++
2 files changed, 30 insertions(+), 23 deletions(-)

diffs (78 lines):

diff -r c6f1ae6d8fac -r 3a650363913a src/njs_string.c
--- a/src/njs_string.c Tue Apr 14 12:42:05 2020 +0000
+++ b/src/njs_string.c Tue Apr 14 12:43:09 2020 +0000
@@ -3718,34 +3718,35 @@ njs_string_replace_regexp_function(njs_v
r->part[0].size = captures[0];

ret = njs_function_apply(vm, r->function, arguments, n + 3, &r->retval);
-
if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- (void) njs_string_prop(&string, this);
-
- if (njs_is_string(&r->retval)) {
- njs_string_replacement_copy(&r->part[r->empty ? 0 : 1], &r->retval);
-
- if (njs_regexp_pattern(regex)->global) {
- r->part += 2;
-
- if (r->part[0].start > (string.start + string.size)) {
- return njs_string_replace_regexp_join(vm, r);
- }
-
- return njs_string_replace_regexp(vm, this, regex, r);
+ goto exception;
+ }
+
+ if (njs_slow_path(!njs_is_string(&r->retval))) {
+ ret = njs_value_to_string(vm, &r->retval, &r->retval);
+ if (njs_slow_path(ret != NJS_OK)) {
+ goto exception;
}
-
- return njs_string_replace_regexp_join(vm, r);
- }
+ }
+
+ njs_string_replacement_copy(&r->part[r->empty ? 0 : 1], &r->retval);
+
+ if (njs_regexp_pattern(regex)->global) {
+ r->part += 2;
+
+ if (r->part[0].start > (string.start + string.size)) {
+ return njs_string_replace_regexp_join(vm, r);
+ }
+
+ return njs_string_replace_regexp(vm, this, regex, r);
+ }
+
+ return njs_string_replace_regexp_join(vm, r);
+
+exception:

njs_regex_match_data_free(r->match_data, vm->regex_context);

- njs_internal_error(vm, "unexpected retval type:%s",
- njs_type_string(r->retval.type));
-
return NJS_ERROR;
}

diff -r c6f1ae6d8fac -r 3a650363913a src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c Tue Apr 14 12:42:05 2020 +0000
+++ b/src/test/njs_unit_test.c Tue Apr 14 12:43:09 2020 +0000
@@ -7231,6 +7231,12 @@ static njs_unit_test_t njs_test[] =
"{ return '|'+s+'|'+o+'|'+m+'|'+p+'|' })"),
njs_str("abc|abcdefghdijklm|3|d|d|efghdijklm") },

+ { njs_str("'abc'.replace(/b/, ()=>1)"),
+ njs_str("a1c") },
+
+ { njs_str("var n = 0; 'abbbc'.replace(/b/g, function() {return ++n;})"),
+ njs_str("a123c") },
+
{ njs_str("'abcdefghdijklm'.replace(/x/, 'X')"),
njs_str("abcdefghdijklm") },

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Fixed String.prototype.replace() when function returns non-string.

Dmitry Volyntsev 332 April 14, 2020 08:50AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 150
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 500 on July 15, 2024
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready