Module: wine Branch: master Commit: 7749951d35a2ea752ec7b15d23efb2ca027089ef URL: http://source.winehq.org/git/wine.git/?a=commit;h=7749951d35a2ea752ec7b15d23...
Author: Jacek Caban jacek@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;