Jacek Caban : jscript: Added RegExp.toString() implementation.
Alexandre Julliard
julliard at winehq.org
Mon May 27 13:46:55 CDT 2013
Module: wine
Branch: master
Commit: f34722e772303c30c3ce0eac1d3ee2e445762809
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f34722e772303c30c3ce0eac1d3ee2e445762809
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon May 27 13:57:07 2013 +0200
jscript: Added RegExp.toString() implementation.
---
dlls/jscript/jsregexp.c | 46 ++++++++++++++++++++++++++++++++++++++++-
dlls/jscript/tests/regexp.js | 12 +++++++++++
2 files changed, 56 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/jsregexp.c b/dlls/jscript/jsregexp.c
index 0104f3e..d6602f4 100644
--- a/dlls/jscript/jsregexp.c
+++ b/dlls/jscript/jsregexp.c
@@ -333,8 +333,50 @@ static HRESULT RegExp_lastIndex(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
static HRESULT RegExp_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
- FIXME("\n");
- return E_NOTIMPL;
+ RegExpInstance *regexp;
+ unsigned len, f;
+ jsstr_t *ret;
+ WCHAR *ptr;
+
+ TRACE("\n");
+
+ if(!is_vclass(jsthis, JSCLASS_REGEXP)) {
+ FIXME("Not a RegExp\n");
+ return E_NOTIMPL;
+ }
+
+ regexp = regexp_from_vdisp(jsthis);
+
+ if(!r)
+ return S_OK;
+
+ len = jsstr_length(regexp->str) + 2;
+
+ f = regexp->jsregexp->flags;
+ if(f & REG_FOLD)
+ len++;
+ if(f & REG_GLOB)
+ len++;
+ if(f & REG_MULTILINE)
+ len++;
+
+ ptr = jsstr_alloc_buf(len, &ret);
+ if(!ptr)
+ return E_OUTOFMEMORY;
+
+ *ptr++ = '/';
+ ptr += jsstr_flush(regexp->str, ptr);
+ *ptr++ = '/';
+
+ if(f & REG_FOLD)
+ *ptr++ = 'i';
+ if(f & REG_GLOB)
+ *ptr++ = 'g';
+ if(f & REG_MULTILINE)
+ *ptr++ = 'm';
+
+ *r = jsval_string(ret);
+ return S_OK;
}
static HRESULT create_match_array(script_ctx_t *ctx, jsstr_t *input_str,
diff --git a/dlls/jscript/tests/regexp.js b/dlls/jscript/tests/regexp.js
index 69aa6b7..25ec91e 100644
--- a/dlls/jscript/tests/regexp.js
+++ b/dlls/jscript/tests/regexp.js
@@ -648,4 +648,16 @@ ok(!("$10" in RegExp), "RegExp.$10 exists");
RegExp.$1 = "a";
ok(RegExp.$1 === "b", "RegExp.$1 = " + RegExp.$1);
+ok(/abc/.toString() === "/abc/", "/abc/.toString() = " + /abc/.toString());
+ok(/\//.toString() === "/\\//", "/\//.toString() = " + /\//.toString());
+tmp = new RegExp("abc/");
+ok(tmp.toString() === "/abc//", "(new RegExp(\"abc/\")).toString() = " + tmp.toString());
+ok(/abc/g.toString() === "/abc/g", "/abc/g.toString() = " + /abc/g.toString());
+ok(/abc/i.toString() === "/abc/i", "/abc/i.toString() = " + /abc/i.toString());
+ok(/abc/ig.toString() === "/abc/ig", "/abc/ig.toString() = " + /abc/ig.toString());
+ok(/abc/mgi.toString() === "/abc/igm", "/abc/mgi.toString() = " + /abc/mgi.toString());
+tmp = new RegExp("abc/", "mgi");
+ok(tmp.toString() === "/abc//igm", "(new RegExp(\"abc/\")).toString() = " + tmp.toString());
+ok(/abc/.toString(1, false, "3") === "/abc/", "/abc/.toString(1, false, \"3\") = " + /abc/.toString());
+
reportSuccess();
More information about the wine-cvs
mailing list