From: Dmitry Volyntsev Date: Tue, 14 Apr 2020 12:42:05 +0000 (+0000) Subject: Fixed RegExp() constructor with empty pattern and non-empty flags. X-Git-Tag: 0.4.0~8 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=98b4a762fcf35e2d99c8a36bf90b413fa5b282de;p=njs.git Fixed RegExp() constructor with empty pattern and non-empty flags. --- diff --git a/src/njs_regexp.c b/src/njs_regexp.c index 09881f29..8e1dec05 100644 --- a/src/njs_regexp.c +++ b/src/njs_regexp.c @@ -104,29 +104,11 @@ njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, u_char *start; njs_int_t ret; njs_str_t string; - njs_value_t source, flags_string, *pattern, *flags; + njs_value_t source, *pattern, *flags; njs_regexp_flags_t re_flags; pattern = njs_arg(args, nargs, 1); - if (!njs_is_regexp(pattern) && !njs_is_primitive(pattern)) { - ret = njs_value_to_string(vm, &args[1], &args[1]); - if (ret != NJS_OK) { - return ret; - } - } - - flags = njs_arg(args, nargs, 2); - - if (!njs_is_primitive(flags)) { - ret = njs_value_to_string(vm, &args[2], &args[2]); - if (ret != NJS_OK) { - return ret; - } - } - - re_flags = 0; - if (njs_is_regexp(pattern)) { ret = njs_regexp_prototype_source(vm, NULL, pattern, NULL, &source); if (njs_slow_path(ret != NJS_OK)) { @@ -138,25 +120,28 @@ njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, pattern = &source; } else { - if (njs_is_undefined(pattern)) { - pattern = njs_value_arg(&njs_string_empty); - } + if (njs_is_defined(pattern)) { + ret = njs_value_to_string(vm, pattern, pattern); + if (njs_slow_path(ret != NJS_OK)) { + return ret; + } - ret = njs_primitive_value_to_string(vm, &source, pattern); - if (njs_slow_path(ret != NJS_OK)) { - return ret; + } else { + pattern = njs_value_arg(&njs_string_empty); } - pattern = &source; + re_flags = 0; } + flags = njs_arg(args, nargs, 2); + if (njs_is_defined(flags)) { - ret = njs_primitive_value_to_string(vm, &flags_string, flags); + ret = njs_value_to_string(vm, flags, flags); if (njs_slow_path(ret != NJS_OK)) { return ret; } - njs_string_get(&flags_string, &string); + njs_string_get(flags, &string); start = string.start; @@ -181,7 +166,12 @@ njs_regexp_create(njs_vm_t *vm, njs_value_t *value, u_char *start, njs_regexp_t *regexp; njs_regexp_pattern_t *pattern; - if (length != 0) { + if (length != 0 || flags != 0) { + if (length == 0) { + start = (u_char *) "(?:)"; + length = njs_length("(?:)"); + } + pattern = njs_regexp_pattern_create(vm, start, length, flags); if (njs_slow_path(pattern == NULL)) { return NJS_ERROR; diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 2ce83dae..48d7ed60 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -7391,6 +7391,15 @@ static njs_unit_test_t njs_test[] = { njs_str("RegExp('\\\\0').source[1]"), njs_str("0") }, + { njs_str("RegExp(undefined, 'g').global"), + njs_str("true") }, + + { njs_str("RegExp('', 'g').global"), + njs_str("true") }, + + { njs_str("var x; RegExp(x, 'g')"), + njs_str("/(?:)/g") }, + { njs_str("']'.match(/]/)"), njs_str("]") },