Jacek Caban : jscript: Fixed String.split for missing regexp separator.
Alexandre Julliard
julliard at winehq.org
Tue Dec 8 11:10:36 CST 2009
Module: wine
Branch: master
Commit: 1045bffcc018dba1ee26a34620f6732eb0c3a795
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1045bffcc018dba1ee26a34620f6732eb0c3a795
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Dec 8 01:13:27 2009 +0100
jscript: Fixed String.split for missing regexp separator.
---
dlls/jscript/string.c | 8 +++++---
dlls/jscript/tests/regexp.js | 13 +++++++++++++
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c
index 97c807f..95ad773 100644
--- a/dlls/jscript/string.c
+++ b/dlls/jscript/string.c
@@ -1129,6 +1129,7 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
match_result_t *match_result = NULL;
DWORD length, match_cnt, i, match_len = 0;
const WCHAR *str, *ptr, *ptr2;
+ BOOL use_regexp = FALSE;
VARIANT *arg, var;
DispatchEx *array;
BSTR val_str, match_str = NULL;
@@ -1153,6 +1154,7 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg));
if(regexp) {
if(is_class(regexp, JSCLASS_REGEXP)) {
+ use_regexp = TRUE;
hres = regexp_match(ctx, regexp, str, length, TRUE, &match_result, &match_cnt);
jsdisp_release(regexp);
if(FAILED(hres)) {
@@ -1183,7 +1185,7 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
if(SUCCEEDED(hres)) {
ptr = str;
for(i=0;; i++) {
- if(match_result) {
+ if(use_regexp) {
if(i == match_cnt)
break;
ptr2 = match_result[i].str;
@@ -1209,7 +1211,7 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
if(FAILED(hres))
break;
- if(match_result)
+ if(use_regexp)
ptr = match_result[i].str + match_result[i].len;
else if(match_str)
ptr = ptr2 + match_len;
@@ -1218,7 +1220,7 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
}
}
- if(SUCCEEDED(hres) && (match_str || match_result)) {
+ if(SUCCEEDED(hres) && (match_str || use_regexp)) {
DWORD len = (str+length) - ptr;
if(len || match_str) {
diff --git a/dlls/jscript/tests/regexp.js b/dlls/jscript/tests/regexp.js
index c9066c6..ff00285 100644
--- a/dlls/jscript/tests/regexp.js
+++ b/dlls/jscript/tests/regexp.js
@@ -301,6 +301,19 @@ ok(r[0] === "1", "r[0] = " + r[0]);
ok(r[1] === "2", "r[1] = " + r[1]);
ok(re.lastIndex === 5, "re.lastIndex = " + re.lastIndex);
+r = "1 12 \t3".split(re = /\s+/).join(";");
+ok(r === "1;12;3", "r = " + r);
+ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex);
+
+r = "123".split(re = /\s+/).join(";");
+ok(r === "123", "r = " + r);
+ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
+
+/* another standard violation */
+r = "1 12 \t3".split(re = /(\s)+/g).join(";");
+ok(r === "1;12;3", "r = " + r);
+ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex);
+
re = /,+/;
re.lastIndex = 4;
r = "1,,2,".split(re);
More information about the wine-cvs
mailing list