Module: wine Branch: master Commit: 84179c16f7f8dbec84ac68d215f735f33e62bb1d URL: https://source.winehq.org/git/wine.git/?a=commit;h=84179c16f7f8dbec84ac68d21...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Jan 23 13:52:22 2020 +0100
jscript: Always set parser error code on error.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/jscript/lex.c | 8 ++++---- dlls/jscript/parser.y | 24 +++++++++--------------- 2 files changed, 13 insertions(+), 19 deletions(-)
diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c index de8549eeaf..9a583e3339 100644 --- a/dlls/jscript/lex.c +++ b/dlls/jscript/lex.c @@ -548,7 +548,7 @@ static int next_token(parser_ctx_t *ctx, unsigned *loc, void *lval) do { if(!skip_spaces(ctx)) { *loc = ctx->ptr - ctx->begin; - return tEOF; + return 0; } }while(skip_comment(ctx) || skip_html_comment(ctx)); *loc = ctx->ptr - ctx->begin; @@ -1118,7 +1118,6 @@ literal_t *parse_regexp(parser_ctx_t *ctx) BOOL in_class = FALSE; DWORD re_len, flags; literal_t *ret; - HRESULT hres;
TRACE("\n");
@@ -1147,6 +1146,7 @@ literal_t *parse_regexp(parser_ctx_t *ctx)
if(ctx->ptr == ctx->end || *ctx->ptr != '/') { WARN("pre-parsing failed\n"); + ctx->hres = JS_E_SYNTAX; return NULL; }
@@ -1156,8 +1156,8 @@ literal_t *parse_regexp(parser_ctx_t *ctx) while(ctx->ptr < ctx->end && iswalnum(*ctx->ptr)) ctx->ptr++;
- hres = parse_regexp_flags(flags_ptr, ctx->ptr-flags_ptr, &flags); - if(FAILED(hres)) + ctx->hres = parse_regexp_flags(flags_ptr, ctx->ptr-flags_ptr, &flags); + if(FAILED(ctx->hres)) return NULL;
ret = parser_alloc(ctx, sizeof(literal_t)); diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y index aa5e27d7c7..72f5786f18 100644 --- a/dlls/jscript/parser.y +++ b/dlls/jscript/parser.y @@ -30,7 +30,6 @@ static int parser_error(unsigned*,parser_ctx_t*,const char*); static void set_error(parser_ctx_t*,UINT); static BOOL explicit_error(parser_ctx_t*,void*,WCHAR); static BOOL allow_auto_semicolon(parser_ctx_t*); -static void program_parsed(parser_ctx_t*,source_elements_t*);
typedef struct _statement_list_t { statement_t *head; @@ -178,7 +177,6 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state %token <ival> tAssignOper tEqOper tShiftOper tRelOper %token <literal> tNumericLiteral tBooleanLiteral %token <str> tStringLiteral -%token tEOF
%type <source_elements> SourceElements %type <source_elements> FunctionBody @@ -254,12 +252,11 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
/* ECMA-262 3rd Edition 14 */ Program - : SourceElements HtmlComment tEOF - { program_parsed(ctx, $1); } + : SourceElements HtmlComment { ctx->source = $1; }
HtmlComment - : tHTMLCOMMENT {} - | /* empty */ {} + : tHTMLCOMMENT + | /* empty */
/* ECMA-262 3rd Edition 14 */ SourceElements @@ -783,6 +780,7 @@ ObjectLiteral { if(ctx->script->version < 2) { WARN("Trailing comma in object literal is illegal in legacy mode.\n"); + ctx->hres = JS_E_SYNTAX; YYABORT; } $$ = new_prop_and_value_expression(ctx, $2); @@ -826,6 +824,7 @@ IdentifierName if(ctx->script->version < SCRIPTLANGUAGEVERSION_ES5) { WARN("%s keyword used as an identifier in legacy mode.\n", debugstr_w($1)); + ctx->hres = JS_E_SYNTAX; YYABORT; } $$ = $1; @@ -882,7 +881,7 @@ BooleanLiteral
semicolon_opt : ';' - | error { if(!allow_auto_semicolon(ctx)) {YYABORT;} } + | error { if(!allow_auto_semicolon(ctx)) {YYABORT;} else { ctx->hres = S_OK; } }
left_bracket : '(' @@ -1459,6 +1458,9 @@ static expression_t *new_call_expression(parser_ctx_t *ctx, expression_t *expres
static int parser_error(unsigned *loc, parser_ctx_t *ctx, const char *str) { + if(ctx->hres == S_OK) + ctx->hres = JS_E_SYNTAX; + WARN("%s: %s\n", debugstr_w(ctx->begin + *loc), str); return 0; }
@@ -1548,13 +1550,6 @@ static statement_list_t *statement_list_add(statement_list_t *list, statement_t return list; }
-static void program_parsed(parser_ctx_t *ctx, source_elements_t *source) -{ - ctx->source = source; - if(!ctx->lexer_error) - ctx->hres = S_OK; -} - void parser_release(parser_ctx_t *ctx) { script_release(ctx->script); @@ -1575,7 +1570,6 @@ HRESULT script_parse(script_ctx_t *ctx, struct _compiler_ctx_t *compiler, const if(!parser_ctx) return E_OUTOFMEMORY;
- parser_ctx->hres = JS_E_SYNTAX; parser_ctx->is_html = delimiter && !wcsicmp(delimiter, html_tagW);
parser_ctx->begin = parser_ctx->ptr = code;