diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h index f1a78ecf15d..8d53f003459 100644 --- a/dlls/jscript/engine.h +++ b/dlls/jscript/engine.h @@ -56,6 +56,7 @@ typedef struct _parser_ctx_t { source_elements_t *source; BOOL nl; BOOL is_html; + BOOL lexer_error; HRESULT hres; jsheap_t heap; diff --git a/dlls/jscript/jscript_En.rc b/dlls/jscript/jscript_En.rc index b47e9517abc..697c1ab0709 100644 --- a/dlls/jscript/jscript_En.rc +++ b/dlls/jscript/jscript_En.rc @@ -30,6 +30,7 @@ STRINGTABLE DISCARDABLE IDS_SEMICOLON "Expected ';'" IDS_LBRACKET "Expected '('" IDS_RBRACKET "Expected ')'" + IDS_UNTERMINATED_STR "Unterminated string constant" IDS_NOT_FUNC "Function expected" IDS_NOT_DATE "'[object]' is not a date object" IDS_NOT_NUM "Number expected" diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c index 5b7e7a4249b..eb9b83536be 100644 --- a/dlls/jscript/lex.c +++ b/dlls/jscript/lex.c @@ -100,7 +100,8 @@ static const struct { static int lex_error(parser_ctx_t *ctx, HRESULT hres) { - ctx->hres = hres; + ctx->hres = JSCRIPT_ERROR|hres; + ctx->lexer_error = TRUE; return -1; } @@ -342,10 +343,8 @@ static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret, WCHAR endc ctx->ptr++; } - if(ctx->ptr == ctx->end) { - WARN("unexpected end of file\n"); - return lex_error(ctx, E_FAIL); - } + if(ctx->ptr == ctx->end) + return lex_error(ctx, IDS_UNTERMINATED_STR); len = ctx->ptr-ptr; diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y index a0ae471953f..29d805f4df0 100644 --- a/dlls/jscript/parser.y +++ b/dlls/jscript/parser.y @@ -1577,7 +1577,8 @@ static void program_parsed(parser_ctx_t *ctx, source_elements_t *source) pop_func(ctx); ctx->source = source; - ctx->hres = S_OK; + if(!ctx->lexer_error) + ctx->hres = S_OK; } void parser_release(parser_ctx_t *ctx) diff --git a/dlls/jscript/resource.h b/dlls/jscript/resource.h index 05039616176..f7e94b90241 100644 --- a/dlls/jscript/resource.h +++ b/dlls/jscript/resource.h @@ -26,6 +26,7 @@ #define IDS_SEMICOLON 0x03EC #define IDS_LBRACKET 0x03ED #define IDS_RBRACKET 0x03EE +#define IDS_UNTERMINATED_STR 0x03F7 #define IDS_NOT_FUNC 0x138A #define IDS_NOT_DATE 0x138E #define IDS_NOT_NUM 0x1389 diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 53b7f924e73..66fea756c33 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -1333,5 +1333,6 @@ exception_test(function() {eval("for(i=0")}, "SyntaxError", -2146827284); exception_test(function() {eval("for(i=0;i<10")}, "SyntaxError", -2146827284); exception_test(function() {eval("while(")}, "SyntaxError", -2146827286); exception_test(function() {eval("if(")}, "SyntaxError", -2146827286); +exception_test(function() {eval("'unterminated")}, "SyntaxError", -2146827273); reportSuccess();