Jacek Caban : vbscript: Pass parser error location to compiler.
Alexandre Julliard
julliard at winehq.org
Thu Jan 23 15:48:48 CST 2020
Module: wine
Branch: master
Commit: eb73571fe987344c0caca9ada621a129d1883c2b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=eb73571fe987344c0caca9ada621a129d1883c2b
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Jan 22 23:27:54 2020 +0100
vbscript: Pass parser error location to compiler.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/vbscript/compile.c | 15 +++++++--------
dlls/vbscript/parse.h | 1 +
dlls/vbscript/parser.y | 3 +++
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 769bbf15ba..1f9462aee8 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -1917,27 +1917,25 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli
vbscode_t *code;
HRESULT hres;
+ memset(&ctx, 0, sizeof(ctx));
code = ctx.code = alloc_vbscode(&ctx, src, cookie, start_line);
if(!ctx.code)
return E_OUTOFMEMORY;
hres = parse_script(&ctx.parser, code->source, delimiter, flags);
if(FAILED(hres)) {
+ if(ctx.parser.error_loc != -1)
+ ctx.loc = ctx.parser.error_loc;
hres = compile_error(script, hres);
release_vbscode(code);
return hres;
}
- ctx.func_decls = NULL;
- ctx.labels = NULL;
- ctx.global_consts = NULL;
- ctx.stat_ctx = NULL;
- ctx.labels_cnt = ctx.labels_size = 0;
-
hres = compile_func(&ctx, ctx.parser.stats, &ctx.code->main_code);
if(FAILED(hres)) {
+ hres = compile_error(script, hres);
release_compiler(&ctx);
- return compile_error(script, hres);
+ return hres;
}
ctx.global_consts = ctx.const_decls;
@@ -1947,8 +1945,9 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli
for(func_decl = ctx.func_decls; func_decl; func_decl = func_decl->next) {
hres = create_function(&ctx, func_decl, &new_func);
if(FAILED(hres)) {
+ hres = compile_error(script, hres);
release_compiler(&ctx);
- return compile_error(script, hres);
+ return hres;
}
new_func->next = ctx.code->funcs;
diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h
index 8d68e781fb..568d8b9a42 100644
--- a/dlls/vbscript/parse.h
+++ b/dlls/vbscript/parse.h
@@ -286,6 +286,7 @@ typedef struct {
BOOL option_explicit;
BOOL is_html;
HRESULT hres;
+ int error_loc;
int last_token;
unsigned last_nl;
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index 16a673fac7..8ebfc82f00 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -505,6 +505,8 @@ StSep
static int parser_error(unsigned *loc, parser_ctx_t *ctx, const char *str)
{
+ if(ctx->error_loc == -1)
+ ctx->error_loc = *loc;
if(ctx->hres == S_OK) {
FIXME("%s: %s\n", debugstr_w(ctx->code + *loc), debugstr_a(str));
ctx->hres = E_FAIL;
@@ -1142,6 +1144,7 @@ HRESULT parse_script(parser_ctx_t *ctx, const WCHAR *code, const WCHAR *delimite
heap_pool_init(&ctx->heap);
ctx->hres = S_OK;
+ ctx->error_loc = -1;
ctx->last_token = tNL;
ctx->last_nl = 0;
ctx->stats = ctx->stats_tail = NULL;
More information about the wine-cvs
mailing list