The first patch is unrelated and a fix to a dumb mistake; I had forgotten that toggle() is a method and methods can have NULL output pointers (when return value is not needed), unlike getters. Sorry for the noise.
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlelem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 21a1ad69254..5dd812c9ca6 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -7568,7 +7568,8 @@ static HRESULT WINAPI token_list_remove(IWineDOMTokenList *iface, BSTR token)
static HRESULT WINAPI token_list_toggle(IWineDOMTokenList *iface, BSTR token, VARIANT_BOOL *p) { - return token_list_add_remove(iface, token, FALSE, p); + VARIANT_BOOL tmp; + return token_list_add_remove(iface, token, FALSE, p ? p : &tmp); }
static HRESULT WINAPI token_list_contains(IWineDOMTokenList *iface, BSTR token, VARIANT_BOOL *p)
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/jsregexp.c | 23 ++++++++++++++--------- dlls/jscript/tests/regexp.js | 12 ++++++++++++ dlls/mshtml/tests/es5.js | 16 ++++++++++++++++ 3 files changed, 42 insertions(+), 9 deletions(-)
diff --git a/dlls/jscript/jsregexp.c b/dlls/jscript/jsregexp.c index 3775df823c3..af96b63fe70 100644 --- a/dlls/jscript/jsregexp.c +++ b/dlls/jscript/jsregexp.c @@ -361,17 +361,22 @@ static HRESULT create_match_array(script_ctx_t *ctx, jsstr_t *input_str, return hres;
for(i=0; i < result->paren_count; i++) { - if(result->parens[i].index != -1) - str = jsstr_substr(input_str, result->parens[i].index, result->parens[i].length); - else - str = jsstr_empty(); - if(!str) { - hres = E_OUTOFMEMORY; - break; + jsval_t val; + + if(result->parens[i].index != -1) { + if(!(str = jsstr_substr(input_str, result->parens[i].index, result->parens[i].length))) { + hres = E_OUTOFMEMORY; + break; + } + val = jsval_string(str); + }else if(ctx->version < SCRIPTLANGUAGEVERSION_ES5) { + val = jsval_string(jsstr_empty()); + }else { + val = jsval_undefined(); }
- hres = jsdisp_propput_idx(array, i+1, jsval_string(str)); - jsstr_release(str); + hres = jsdisp_propput_idx(array, i+1, val); + jsval_release(val); if(FAILED(hres)) break; } diff --git a/dlls/jscript/tests/regexp.js b/dlls/jscript/tests/regexp.js index 31b83216235..fb6ed0891d5 100644 --- a/dlls/jscript/tests/regexp.js +++ b/dlls/jscript/tests/regexp.js @@ -625,6 +625,18 @@ ok(tmp === "x*y", '"x/y".replace(/[/]/, "*") = ' + tmp); tmp = "x/y".replace(/[xy/]/g, "*"); ok(tmp === "***", '"x/y".replace(/[xy/]/, "*") = ' + tmp);
+tmp = /()/.exec("")[1]; +ok(tmp === "", "/()/ captured: " + tmp); +tmp = /()?/.exec("")[1]; +ok(tmp === "", "/()?/ captured: " + tmp); +tmp = /()??/.exec("")[1]; +ok(tmp === "", "/()??/ captured: " + tmp); +tmp = /()*/.exec("")[1]; +ok(tmp === "", "/()*/ captured: " + tmp); +tmp = /()??()/.exec(""); +ok(tmp[1] === "", "/()??()/ [1] captured: " + tmp); +ok(tmp[2] === "", "/()??()/ [2] captured: " + tmp); + /(b)/.exec("abc"); ok(RegExp.$1 === "b", "RegExp.$1 = " + RegExp.$1); ok("$2" in RegExp, "RegExp.$2 doesn't exist"); diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 982544f6b84..d466c1f9919 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -1610,6 +1610,22 @@ sync_test("isFrozen", function() { } });
+sync_test("RegExp", function() { + var r; + + r = /()/.exec("")[1]; + ok(r === "", "/()/ captured: " + r); + r = /()?/.exec("")[1]; + ok(r === undefined, "/()?/ captured: " + r); + r = /()??/.exec("")[1]; + ok(r === undefined, "/()??/ captured: " + r); + r = /()*/.exec("")[1]; + ok(r === undefined, "/()*/ captured: " + r); + r = /()??()/.exec(""); + ok(r[1] === undefined, "/()??()/ [1] captured: " + r); + ok(r[2] === "", "/()??()/ [2] captured: " + r); +}); + sync_test("builtin_context", function() { var nullDisp = external.nullDisp; var tests = [
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/error.c | 1 + dlls/jscript/jscript.h | 1 + dlls/jscript/jscript.rc | 1 + dlls/jscript/jsregexp.c | 2 +- dlls/jscript/regexp.c | 19 +++++++++---------- dlls/jscript/resource.h | 1 + dlls/jscript/tests/regexp.js | 7 +++++++ dlls/mshtml/tests/es5.js | 9 +++++++++ 8 files changed, 30 insertions(+), 11 deletions(-)
diff --git a/dlls/jscript/error.c b/dlls/jscript/error.c index 244d9af0532..c3768668178 100644 --- a/dlls/jscript/error.c +++ b/dlls/jscript/error.c @@ -456,6 +456,7 @@ jsdisp_t *create_builtin_error(script_ctx_t *ctx) case JS_E_EXPECTED_CCEND: case JS_E_DISABLED_CC: case JS_E_EXPECTED_AT: + case JS_E_UNEXPECTED_QUANTIFIER: constr = ctx->syntax_error_constr; break;
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 32c2d8eb726..06c446b0c76 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -531,6 +531,7 @@ static inline HRESULT disp_call_value(script_ctx_t *ctx, IDispatch *disp, jsval_ #define JS_E_ENUMERATOR_EXPECTED MAKE_JSERROR(IDS_ENUMERATOR_EXPECTED) #define JS_E_REGEXP_EXPECTED MAKE_JSERROR(IDS_REGEXP_EXPECTED) #define JS_E_REGEXP_SYNTAX MAKE_JSERROR(IDS_REGEXP_SYNTAX_ERROR) +#define JS_E_UNEXPECTED_QUANTIFIER MAKE_JSERROR(IDS_UNEXPECTED_QUANTIFIER) #define JS_E_EXCEPTION_THROWN MAKE_JSERROR(IDS_EXCEPTION_THROWN) #define JS_E_INVALID_URI_CODING MAKE_JSERROR(IDS_URI_INVALID_CODING) #define JS_E_INVALID_URI_CHAR MAKE_JSERROR(IDS_URI_INVALID_CHAR) diff --git a/dlls/jscript/jscript.rc b/dlls/jscript/jscript.rc index de21a4aba0b..fbf965fb7e8 100644 --- a/dlls/jscript/jscript.rc +++ b/dlls/jscript/jscript.rc @@ -62,6 +62,7 @@ STRINGTABLE IDS_ENUMERATOR_EXPECTED "Enumerator object expected" IDS_REGEXP_EXPECTED "Regular Expression object expected" IDS_REGEXP_SYNTAX_ERROR "Syntax error in regular expression" + IDS_UNEXPECTED_QUANTIFIER "Unexpected quantifier" IDS_EXCEPTION_THROWN "Exception thrown and not caught" IDS_URI_INVALID_CODING "URI to be decoded is incorrect" IDS_URI_INVALID_CHAR "URI to be encoded contains invalid characters" diff --git a/dlls/jscript/jsregexp.c b/dlls/jscript/jsregexp.c index af96b63fe70..7da365f4e6c 100644 --- a/dlls/jscript/jsregexp.c +++ b/dlls/jscript/jsregexp.c @@ -649,7 +649,7 @@ HRESULT create_regexp(script_ctx_t *ctx, jsstr_t *src, DWORD flags, jsdisp_t **r if(!regexp->jsregexp) { WARN("regexp_new failed\n"); jsdisp_release(®exp->dispex); - return E_FAIL; + return DISP_E_EXCEPTION; }
*ret = ®exp->dispex; diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c index e8689c8725b..ddfef9f5b89 100644 --- a/dlls/jscript/regexp.c +++ b/dlls/jscript/regexp.c @@ -41,13 +41,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript);
/* FIXME: Better error handling */ -#define ReportRegExpError(a,b,c) -#define ReportRegExpErrorHelper(a,b,c,d) -#define JS_ReportErrorNumber(a,b,c,d) -#define JS_ReportErrorFlagsAndNumber(a,b,c,d,e,f) -#define js_ReportOutOfScriptQuota(a) -#define JS_ReportOutOfMemory(a) -#define JS_COUNT_OPERATION(a,b) +#define ReportRegExpError(a,b,c) throw_error((a)->context, E_FAIL, L"") +#define ReportRegExpErrorHelper(a,b,c,d) throw_error((a)->context, E_FAIL, L"") +#define JS_ReportErrorNumber(a,b,c,d) throw_error((a), E_FAIL, L"") +#define JS_ReportErrorFlagsAndNumber(a,b,c,d,e,f) throw_error((a), E_FAIL, L"") +#define js_ReportOutOfScriptQuota(a) throw_error((a), E_FAIL, L"") +#define JS_ReportOutOfMemory(a) throw_error((a), E_FAIL, L"") +#define JS_COUNT_OPERATION(a,b) throw_error((a), E_FAIL, L"")
typedef BYTE JSPackedBool; @@ -292,7 +292,7 @@ struct RENode { #define CLASS_CACHE_SIZE 4
typedef struct CompilerState { - void *context; + script_ctx_t *context; const WCHAR *cpbegin; const WCHAR *cpend; const WCHAR *cp; @@ -1622,8 +1622,7 @@ doSimple: case '*': case '+': case '?': - ReportRegExpErrorHelper(state, JSREPORT_ERROR, - JSMSG_BAD_QUANTIFIER, state->cp - 1); + throw_error(state->context, state->context->version < SCRIPTLANGUAGEVERSION_ES5 ? JS_E_REGEXP_SYNTAX : JS_E_UNEXPECTED_QUANTIFIER, L""); return FALSE; default: asFlat: diff --git a/dlls/jscript/resource.h b/dlls/jscript/resource.h index f84d77c198f..0ac457d740d 100644 --- a/dlls/jscript/resource.h +++ b/dlls/jscript/resource.h @@ -60,6 +60,7 @@ #define IDS_ENUMERATOR_EXPECTED 0x1397 #define IDS_REGEXP_EXPECTED 0x1398 #define IDS_REGEXP_SYNTAX_ERROR 0x1399 +#define IDS_UNEXPECTED_QUANTIFIER 0x139A #define IDS_EXCEPTION_THROWN 0x139E #define IDS_URI_INVALID_CHAR 0x13A0 #define IDS_URI_INVALID_CODING 0x13A1 diff --git a/dlls/jscript/tests/regexp.js b/dlls/jscript/tests/regexp.js index fb6ed0891d5..693564d7cb8 100644 --- a/dlls/jscript/tests/regexp.js +++ b/dlls/jscript/tests/regexp.js @@ -637,6 +637,13 @@ tmp = /()??()/.exec(""); ok(tmp[1] === "", "/()??()/ [1] captured: " + tmp); ok(tmp[2] === "", "/()??()/ [2] captured: " + tmp);
+try { + tmp = new RegExp("(?<a>b)", "g"); + ok(false, "expected exception with /(?<a>b)/ regex"); +}catch(e) { + ok(e.number === 0xa1399 - 0x80000000, "/(?<a>b)/ regex threw " + e.number); +} + /(b)/.exec("abc"); ok(RegExp.$1 === "b", "RegExp.$1 = " + RegExp.$1); ok("$2" in RegExp, "RegExp.$2 doesn't exist"); diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index d466c1f9919..1ed3a64bcba 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -26,6 +26,7 @@ var JS_E_BOOLEAN_EXPECTED = 0x800a1392; var JS_E_VBARRAY_EXPECTED = 0x800a1395; var JS_E_ENUMERATOR_EXPECTED = 0x800a1397; var JS_E_REGEXP_EXPECTED = 0x800a1398; +var JS_E_UNEXPECTED_QUANTIFIER = 0x800a139a; var JS_E_INVALID_WRITABLE_PROP_DESC = 0x800a13ac; var JS_E_NONCONFIGURABLE_REDEFINED = 0x800a13d6; var JS_E_NONWRITABLE_MODIFIED = 0x800a13d7; @@ -1624,6 +1625,14 @@ sync_test("RegExp", function() { r = /()??()/.exec(""); ok(r[1] === undefined, "/()??()/ [1] captured: " + r); ok(r[2] === "", "/()??()/ [2] captured: " + r); + + try { + r = new RegExp("(?<a>b)", "g"); + ok(false, "expected exception with /(?<a>b)/ regex"); + }catch(ex) { + var n = ex.number >>> 0; + ok(n === JS_E_UNEXPECTED_QUANTIFIER, "/(?<a>b)/ regex threw " + n); + } });
sync_test("builtin_context", function() {
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/regexp.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c index ddfef9f5b89..325b5ad56d6 100644 --- a/dlls/jscript/regexp.c +++ b/dlls/jscript/regexp.c @@ -45,8 +45,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript); #define ReportRegExpErrorHelper(a,b,c,d) throw_error((a)->context, E_FAIL, L"") #define JS_ReportErrorNumber(a,b,c,d) throw_error((a), E_FAIL, L"") #define JS_ReportErrorFlagsAndNumber(a,b,c,d,e,f) throw_error((a), E_FAIL, L"") -#define js_ReportOutOfScriptQuota(a) throw_error((a), E_FAIL, L"") -#define JS_ReportOutOfMemory(a) throw_error((a), E_FAIL, L"") #define JS_COUNT_OPERATION(a,b) throw_error((a), E_FAIL, L"")
@@ -412,7 +410,7 @@ NewRENode(CompilerState *state, REOp op)
ren = heap_pool_alloc(state->pool, sizeof(*ren)); if (!ren) { - /* js_ReportOutOfScriptQuota(cx); */ + throw_error(state->context, E_OUTOFMEMORY, L""); return NULL; } ren->op = op; @@ -1944,7 +1942,7 @@ PushBackTrackState(REGlobalData *gData, REOp op, btincr = ((btincr+btsize-1)/btsize)*btsize; gData->backTrackStack = heap_pool_grow(gData->pool, gData->backTrackStack, btsize, btincr); if (!gData->backTrackStack) { - js_ReportOutOfScriptQuota(gData->cx); + throw_error(gData->cx, E_OUTOFMEMORY, L""); gData->ok = FALSE; return NULL; } @@ -2112,7 +2110,7 @@ ProcessCharSet(REGlobalData *gData, RECharSet *charSet) byteLength = (charSet->length >> 3) + 1; charSet->u.bits = malloc(byteLength); if (!charSet->u.bits) { - JS_ReportOutOfMemory(gData->cx); + throw_error(gData->cx, E_OUTOFMEMORY, L""); gData->ok = FALSE; return FALSE; } @@ -2300,7 +2298,7 @@ ReallocStateStack(REGlobalData *gData)
gData->stateStack = heap_pool_grow(gData->pool, gData->stateStack, sz, sz); if (!gData->stateStack) { - js_ReportOutOfScriptQuota(gData->cx); + throw_error(gData->cx, E_OUTOFMEMORY, L""); gData->ok = FALSE; return FALSE; } @@ -3131,7 +3129,6 @@ static HRESULT InitMatch(regexp_t *re, void *cx, heap_pool_t *pool, REGlobalData return S_OK;
bad: - js_ReportOutOfScriptQuota(cx); gData->ok = FALSE; return E_OUTOFMEMORY; }
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/tests/documentmode.js | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index cd639712a9f..1a9f36927d0 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -2147,6 +2147,12 @@ sync_test("builtins_diffs", function() { }catch(e) { ok(e.number === 0xa1398 - 0x80000000, "RegExp.toString with non-regexp: exception = " + e.number); } + try { + RegExp.prototype.toString.call({source: "abc", global: true, ignoreCase: true, multiline: true}); + ok(false, "RegExp.toString with non-regexp 2: expected exception"); + }catch(e) { + ok(e.number === 0xa1398 - 0x80000000, "RegExp.toString with non-regexp 2: exception = " + e.number); + }
try { /a/.lastIndex();
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=133219
Your paranoid android.
=== w10pro64_en_AE_u8 (64 bit report) ===
mshtml: htmldoc.c:351: Test failed: expected Exec_SETTITLE
This merge request was approved by Jacek Caban.