Module: wine Branch: master Commit: 98f2dfee9cabde7fd62d11cd2850d608ec055aca URL: http://source.winehq.org/git/wine.git/?a=commit;h=98f2dfee9cabde7fd62d11cd28...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Sep 24 01:48:37 2008 +0200
jscript: Added RegExp contruction implementation.
---
dlls/jscript/global.c | 2 +- dlls/jscript/regexp.c | 74 ++++++++++++++++++++++++++++++++++++++++- dlls/jscript/tests/regexp.js | 24 +++++++++++++ 3 files changed, 97 insertions(+), 3 deletions(-)
diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c index adee371..30e2bd5 100644 --- a/dlls/jscript/global.c +++ b/dlls/jscript/global.c @@ -426,7 +426,7 @@ static HRESULT init_constructors(script_ctx_t *ctx) if(FAILED(hres)) return hres;
- hres = create_object_constr(ctx, &ctx->regexp_constr); + hres = create_regexp_constr(ctx, &ctx->regexp_constr); if(FAILED(hres)) return hres;
diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c index 863b52e..e811e48 100644 --- a/dlls/jscript/regexp.c +++ b/dlls/jscript/regexp.c @@ -3546,11 +3546,81 @@ static HRESULT create_regexp(script_ctx_t *ctx, const WCHAR *exp, int len, DWORD return S_OK; }
+static HRESULT regexp_constructor(script_ctx_t *ctx, DISPPARAMS *dp, VARIANT *retv) +{ + const WCHAR *opt = emptyW, *src; + DispatchEx *ret; + VARIANT *arg; + HRESULT hres; + + if(!arg_cnt(dp)) { + FIXME("no args\n"); + return E_NOTIMPL; + } + + arg = get_arg(dp,0); + if(V_VT(arg) == VT_DISPATCH) { + DispatchEx *obj; + + obj = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg)); + if(obj) { + if(is_class(obj, JSCLASS_REGEXP)) { + RegExpInstance *regexp = (RegExpInstance*)obj; + + 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; + } + + jsdisp_release(obj); + } + } + + if(V_VT(arg) != VT_BSTR) { + FIXME("vt arg0 = %d\n", V_VT(arg)); + return E_NOTIMPL; + } + + src = V_BSTR(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)); + return E_NOTIMPL; + } + + opt = V_BSTR(arg); + } + + hres = create_regexp_str(ctx, src, -1, opt, strlenW(opt), &ret); + if(FAILED(hres)) + return hres; + + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret); + return S_OK; +} + static HRESULT RegExpConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + switch(flags) { + case DISPATCH_CONSTRUCT: + return regexp_constructor(dispex->ctx, dp, retv); + default: + FIXME("unimplemented flags: %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; }
HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx **ret) diff --git a/dlls/jscript/tests/regexp.js b/dlls/jscript/tests/regexp.js index 209ee22..13ce8a2 100644 --- a/dlls/jscript/tests/regexp.js +++ b/dlls/jscript/tests/regexp.js @@ -51,4 +51,28 @@ ok(m.length === 2, "m.length is not 1"); ok(m["0"] === "aaab", "m[0] is not "ab""); ok(m["1"] === "ab", "m[1] is not "ab"");
+m = "abcabc".match(new RegExp("ab")); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 1, "m.length is not 1"); +ok(m["0"] === "ab", "m[0] is not "ab""); + +/* +m = "abcabc".match(new RegExp("ab","g")); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 2, "m.length is not 1"); +ok(m["0"] === "ab", "m[0] is not "ab""); +ok(m["1"] === "ab", "m[1] is not "ab""); + +m = "abcabc".match(new RegExp(/ab/g)); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 2, "m.length is not 1"); +ok(m["0"] === "ab", "m[0] is not "ab""); +ok(m["1"] === "ab", "m[1] is not "ab""); + +m = "abcabc".match(new RegExp("ab","g", "test")); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 2, "m.length is not 1"); +ok(m["0"] === "ab", "m[0] is not "ab""); +ok(m["1"] === "ab", "m[1] is not "ab""); +*/ reportSuccess();