]> git.kaiwu.me - njs.git/commitdiff
Fixed RegExp() constructor with empty pattern and non-empty flags.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 14 Apr 2020 12:42:05 +0000 (12:42 +0000)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 14 Apr 2020 12:42:05 +0000 (12:42 +0000)
src/njs_regexp.c
src/test/njs_unit_test.c

index 09881f2969253bd92b667c75fc81e83bc87752f0..8e1dec05ce42684d313a81e85b4e5d58b20976a2 100644 (file)
@@ -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;
index 2ce83daea602167f26a0cf6e1fc91c059d59a7ce..48d7ed6081b13ef2315175398d22b68d00161ee4 100644 (file)
@@ -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("]") },