Jacek Caban : jscript: Support passing non-string flags to RegExp constructor.

Alexandre Julliard julliard at winehq.org
Fri Jun 5 14:16:53 CDT 2020


Module: wine
Branch: master
Commit: fe0bd340cddd9c148af2501e7a3eabe5421ef243
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=fe0bd340cddd9c148af2501e7a3eabe5421ef243

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Jun  5 18:26:25 2020 +0200

jscript: Support passing non-string flags to RegExp constructor.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/jsregexp.c      | 24 ++++++++++--------------
 dlls/jscript/tests/regexp.js | 12 ++++++++++++
 2 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/dlls/jscript/jsregexp.c b/dlls/jscript/jsregexp.c
index f9578195d9..94abb6a3c9 100644
--- a/dlls/jscript/jsregexp.c
+++ b/dlls/jscript/jsregexp.c
@@ -671,7 +671,7 @@ HRESULT create_regexp(script_ctx_t *ctx, jsstr_t *src, DWORD flags, jsdisp_t **r
 
 HRESULT create_regexp_var(script_ctx_t *ctx, jsval_t src_arg, jsval_t *flags_arg, jsdisp_t **ret)
 {
-    unsigned flags, opt_len = 0;
+    unsigned flags = 0;
     const WCHAR *opt = NULL;
     jsstr_t *src;
     HRESULT hres = S_OK;
@@ -700,24 +700,20 @@ HRESULT create_regexp_var(script_ctx_t *ctx, jsval_t src_arg, jsval_t *flags_arg
     if(FAILED(hres))
         return hres;
 
-    if(flags_arg) {
+    if(flags_arg && !is_undefined(*flags_arg)) {
         jsstr_t *opt_str;
 
-        if(!is_string(*flags_arg)) {
-            FIXME("unimplemented for %s\n", debugstr_jsval(*flags_arg));
-            return E_NOTIMPL;
-        }
-
-        opt_str = get_string(*flags_arg);
-        opt = jsstr_flatten(opt_str);
-        if(!opt) {
-            jsstr_release(src);
-            return E_OUTOFMEMORY;
+        hres = to_string(ctx, *flags_arg, &opt_str);
+        if(SUCCEEDED(hres)) {
+            opt = jsstr_flatten(opt_str);
+            if(opt)
+                hres = parse_regexp_flags(opt, jsstr_length(opt_str), &flags);
+            else
+                hres = E_OUTOFMEMORY;
+            jsstr_release(opt_str);
         }
-        opt_len = jsstr_length(opt_str);
     }
 
-    hres = parse_regexp_flags(opt, opt_len, &flags);
     if(SUCCEEDED(hres))
         hres = create_regexp(ctx, src, flags, ret);
     jsstr_release(src);
diff --git a/dlls/jscript/tests/regexp.js b/dlls/jscript/tests/regexp.js
index e261bf9d3a..31b8321623 100644
--- a/dlls/jscript/tests/regexp.js
+++ b/dlls/jscript/tests/regexp.js
@@ -701,4 +701,16 @@ ok(re.ignoreCase === false, "re.ignoreCase = " + re.ignoreCase);
 ok(re.multiline === false, "re.multiline = " + re.multiline);
 ok(re.global === false, "re.global = " + re.global);
 
+re = new RegExp("test", undefined);
+ok(re.source === "test", "re.source = " + re.source);
+ok(re.ignoreCase === false, "re.ignoreCase = " + re.ignoreCase);
+ok(re.multiline === false, "re.multiline = " + re.multiline);
+ok(re.global === false, "re.global = " + re.global);
+
+re = new RegExp("test", { toString: function() { return "mg"; } });
+ok(re.source === "test", "re.source = " + re.source);
+ok(re.ignoreCase === false, "re.ignoreCase = " + re.ignoreCase);
+ok(re.multiline === true, "re.multiline = " + re.multiline);
+ok(re.global === true, "re.global = " + re.global);
+
 reportSuccess();




More information about the wine-cvs mailing list