Module: wine Branch: master Commit: e3ae02433a3302dfc5b1cff6477a4c563be11a1a URL: http://source.winehq.org/git/wine.git/?a=commit;h=e3ae02433a3302dfc5b1cff647...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Apr 15 12:38:05 2010 +0200
jscript: Use special case for lastIndex<0 only for global regexps in run_exec.
---
dlls/jscript/regexp.c | 26 +++++++++++++------------- dlls/jscript/tests/regexp.js | 13 +++++++++++++ 2 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c index e895603..a5d607e 100644 --- a/dlls/jscript/regexp.c +++ b/dlls/jscript/regexp.c @@ -3637,25 +3637,25 @@ static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, VARIANT *arg, jsexce hres = to_string(ctx, arg, ei, &string); if(FAILED(hres)) return hres; + length = SysStringLen(string); }else { - string = SysAllocStringLen(NULL, 0); - if(!string) - return E_OUTOFMEMORY; + string = NULL; + length = 0; }
- if(regexp->last_index < 0) { - SysFreeString(string); - set_last_index(regexp, 0); - *ret = VARIANT_FALSE; - if(input) { - *input = NULL; + if(regexp->jsregexp->flags & JSREG_GLOB) { + if(regexp->last_index < 0) { + SysFreeString(string); + set_last_index(regexp, 0); + *ret = VARIANT_FALSE; + if(input) { + *input = NULL; + } + return S_OK; } - return S_OK; - }
- length = SysStringLen(string); - if(regexp->jsregexp->flags & JSREG_GLOB) last_index = regexp->last_index; + }
cp = string + last_index; hres = regexp_match_next(ctx, ®exp->dispex, REM_RESET_INDEX, string, length, &cp, parens, diff --git a/dlls/jscript/tests/regexp.js b/dlls/jscript/tests/regexp.js index fac1112..513e56e 100644 --- a/dlls/jscript/tests/regexp.js +++ b/dlls/jscript/tests/regexp.js @@ -410,6 +410,19 @@ m = re.exec(" "); ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0"); ok(m === null, "m = " + m + " expected null");
+re = /a/; +re.lastIndex = -3; +ok(re.lastIndex === -3, "re.lastIndex = " + re.lastIndex + " expected -3"); +m = re.exec(" a a "); +ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 0"); +ok(m.index === 1, "m = " + m + " expected 1"); + +re.lastIndex = -1; +ok(re.lastIndex === -1, "re.lastIndex = " + re.lastIndex + " expected -1"); +m = re.exec(" "); +ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0"); +ok(m === null, "m = " + m + " expected null"); + re = /aa/g; i = 'baacd'.search(re); ok(i === 1, "'baacd'.search(re) = " + i);