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() {