Jacek Caban : jscript: Make RegExp contructor implementation more generic.

Alexandre Julliard julliard at winehq.org
Mon Jan 25 11:21:04 CST 2010


Module: wine
Branch: master
Commit: 7749951d35a2ea752ec7b15d23efb2ca027089ef
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7749951d35a2ea752ec7b15d23efb2ca027089ef

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Jan 23 23:56:48 2010 +0100

jscript: Make RegExp contructor implementation more generic.

---

 dlls/jscript/jscript.h |    1 +
 dlls/jscript/regexp.c  |   73 ++++++++++++++++++++++-------------------------
 2 files changed, 35 insertions(+), 39 deletions(-)

diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 4dd340e..a839067 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -226,6 +226,7 @@ HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**);
 HRESULT create_math(script_ctx_t*,DispatchEx**);
 HRESULT create_array(script_ctx_t*,DWORD,DispatchEx**);
 HRESULT create_regexp(script_ctx_t*,const WCHAR *,int,DWORD,DispatchEx**);
+HRESULT create_regexp_var(script_ctx_t*,VARIANT*,VARIANT*,DispatchEx**);
 HRESULT create_string(script_ctx_t*,const WCHAR*,DWORD,DispatchEx**);
 HRESULT create_bool(script_ctx_t*,VARIANT_BOOL,DispatchEx**);
 HRESULT create_number(script_ctx_t*,VARIANT*,DispatchEx**);
diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c
index 1034cd0..751fe41 100644
--- a/dlls/jscript/regexp.c
+++ b/dlls/jscript/regexp.c
@@ -3833,74 +3833,50 @@ HRESULT create_regexp(script_ctx_t *ctx, const WCHAR *exp, int len, DWORD flags,
     return S_OK;
 }
 
-static HRESULT regexp_constructor(script_ctx_t *ctx, DISPPARAMS *dp, VARIANT *retv)
+HRESULT create_regexp_var(script_ctx_t *ctx, VARIANT *src_arg, VARIANT *flags_arg, DispatchEx **ret)
 {
     const WCHAR *opt = emptyW, *src;
-    DispatchEx *ret;
-    VARIANT *arg;
     DWORD flags;
     HRESULT hres;
 
-    if(!arg_cnt(dp)) {
-        FIXME("no args\n");
-        return E_NOTIMPL;
-    }
-
-    arg = get_arg(dp,0);
-    if(V_VT(arg) == VT_DISPATCH) {
+    if(V_VT(src_arg) == VT_DISPATCH) {
         DispatchEx *obj;
 
-        obj = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg));
+        obj = iface_to_jsdisp((IUnknown*)V_DISPATCH(src_arg));
         if(obj) {
             if(is_class(obj, JSCLASS_REGEXP)) {
                 RegExpInstance *regexp = (RegExpInstance*)obj;
 
-                hres = create_regexp(ctx, regexp->str, -1, regexp->jsregexp->flags, &ret);
+                hres = create_regexp(ctx, regexp->str, -1, regexp->jsregexp->flags, ret);
                 jsdisp_release(obj);
-                if(FAILED(hres))
-                    return hres;
-
-                V_VT(retv) = VT_DISPATCH;
-                V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret);
-                return S_OK;
+                return hres;
             }
 
             jsdisp_release(obj);
         }
     }
 
-    if(V_VT(arg) != VT_BSTR) {
-        FIXME("vt arg0 = %d\n", V_VT(arg));
+    if(V_VT(src_arg) != VT_BSTR) {
+        FIXME("flags_arg = %s\n", debugstr_variant(flags_arg));
         return E_NOTIMPL;
     }
 
-    src = V_BSTR(arg);
+    src = V_BSTR(src_arg);
 
-    if(arg_cnt(dp) >= 2) {
-        arg = get_arg(dp,1);
-        if(V_VT(arg) != VT_BSTR) {
-            FIXME("unimplemented for vt %d\n", V_VT(arg));
+    if(flags_arg) {
+        if(V_VT(flags_arg) != VT_BSTR) {
+            FIXME("unimplemented for vt %d\n", V_VT(flags_arg));
             return E_NOTIMPL;
         }
 
-        opt = V_BSTR(arg);
+        opt = V_BSTR(flags_arg);
     }
 
     hres = parse_regexp_flags(opt, strlenW(opt), &flags);
     if(FAILED(hres))
         return hres;
 
-    hres = create_regexp(ctx, src, -1, flags, &ret);
-    if(FAILED(hres))
-        return hres;
-
-    if(retv) {
-        V_VT(retv) = VT_DISPATCH;
-        V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret);
-    }else {
-        jsdisp_release(ret);
-    }
-    return S_OK;
+    return create_regexp(ctx, src, -1, flags, ret);
 }
 
 static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
@@ -3934,8 +3910,27 @@ static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
             }
         }
         /* fall through */
-    case DISPATCH_CONSTRUCT:
-        return regexp_constructor(ctx, dp, retv);
+    case DISPATCH_CONSTRUCT: {
+        DispatchEx *ret;
+        HRESULT hres;
+
+        if(!arg_cnt(dp)) {
+            FIXME("no args\n");
+            return E_NOTIMPL;
+        }
+
+        hres = create_regexp_var(ctx, get_arg(dp,0), arg_cnt(dp) > 1 ? get_arg(dp,1) : NULL, &ret);
+        if(FAILED(hres))
+            return hres;
+
+        if(retv) {
+            V_VT(retv) = VT_DISPATCH;
+            V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret);
+        }else {
+            jsdisp_release(ret);
+        }
+        return S_OK;
+    }
     default:
         FIXME("unimplemented flags: %x\n", flags);
         return E_NOTIMPL;




More information about the wine-cvs mailing list