Jacek Caban : vbscript: Call OnScriptError for compile errors.
Alexandre Julliard
julliard at winehq.org
Fri Oct 4 16:34:05 CDT 2019
Module: wine
Branch: master
Commit: 34674eff5ba225b89f3323fe88805f778e4434a0
URL: https://source.winehq.org/git/wine.git/?a=commit;h=34674eff5ba225b89f3323fe88805f778e4434a0
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Oct 4 16:30:41 2019 +0200
vbscript: Call OnScriptError for compile errors.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/vbscript/compile.c | 24 ++++++++++++++++++------
dlls/vbscript/tests/run.c | 17 +++++++++++++----
2 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index d78e096285..b2be38d71b 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -375,6 +375,18 @@ static inline BOOL emit_catch(compile_ctx_t *ctx, unsigned off)
return emit_catch_jmp(ctx, off, ctx->instr_cnt);
}
+static HRESULT compile_error(script_ctx_t *ctx, HRESULT error)
+{
+ if(error == SCRIPT_E_REPORTED)
+ return error;
+
+ clear_ei(&ctx->ei);
+ ctx->ei.scode = error = map_hres(error);
+ ctx->ei.bstrSource = get_vbscript_string(VBS_COMPILE_ERROR);
+ ctx->ei.bstrDescription = get_vbscript_error_string(error);
+ return report_script_error(ctx);
+}
+
static expression_t *lookup_const_decls(compile_ctx_t *ctx, const WCHAR *name, BOOL lookup_global)
{
const_decl_t *decl;
@@ -1826,11 +1838,11 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli
hres = parse_script(&ctx.parser, src, delimiter, flags);
if(FAILED(hres))
- return hres;
+ return compile_error(script, hres);
code = ctx.code = alloc_vbscode(&ctx, src);
if(!ctx.code)
- return E_OUTOFMEMORY;
+ return compile_error(script, E_OUTOFMEMORY);
ctx.funcs = NULL;
ctx.func_decls = NULL;
@@ -1844,7 +1856,7 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli
hres = compile_func(&ctx, ctx.parser.stats, &ctx.code->main_code);
if(FAILED(hres)) {
release_compiler(&ctx);
- return hres;
+ return compile_error(script, hres);
}
ctx.global_consts = ctx.const_decls;
@@ -1853,7 +1865,7 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli
hres = create_function(&ctx, func_decl, &new_func);
if(FAILED(hres)) {
release_compiler(&ctx);
- return hres;
+ return compile_error(script, hres);
}
new_func->next = ctx.funcs;
@@ -1864,14 +1876,14 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli
hres = compile_class(&ctx, class_decl);
if(FAILED(hres)) {
release_compiler(&ctx);
- return hres;
+ return compile_error(script, hres);
}
}
hres = check_script_collisions(&ctx, script);
if(FAILED(hres)) {
release_compiler(&ctx);
- return hres;
+ return compile_error(script, hres);
}
if(ctx.global_vars) {
diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index 7c06d9c0f5..f50d90d6aa 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -79,6 +79,12 @@ extern const CLSID CLSID_VBScriptRegExp;
expect_ ## func = called_ ## func = FALSE; \
}while(0)
+#define CHECK_NOT_CALLED(func) \
+ do { \
+ ok(!called_ ## func, "unexpected " #func "\n"); \
+ expect_ ## func = called_ ## func = FALSE; \
+ }while(0)
+
#define CLEAR_CALLED(func) \
expect_ ## func = called_ ## func = FALSE
@@ -2149,7 +2155,7 @@ static void test_parse_errors(void)
SET_EXPECT(OnScriptError);
hres = parse_script_ar(invalid_scripts[i]);
ok(FAILED(hres), "[%u] script did not fail\n", i);
- todo_wine CHECK_CALLED(OnScriptError);
+ CHECK_CALLED(OnScriptError);
}
}
@@ -2309,7 +2315,7 @@ static void test_isexpression(void)
SET_EXPECT(OnScriptError);
hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
ok(FAILED(hres), "ParseScriptText did not fail: %08x\n", hres);
- todo_wine CHECK_CALLED(OnScriptError);
+ CHECK_CALLED(OnScriptError);
VariantClear(&var);
SysFreeString(str);
@@ -2346,7 +2352,7 @@ static void test_isexpression(void)
SET_EXPECT(OnScriptError);
hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
ok(FAILED(hres), "ParseScriptText did not fail: %08x\n", hres);
- todo_wine CHECK_CALLED(OnScriptError);
+ CHECK_CALLED(OnScriptError);
VariantClear(&var);
SysFreeString(str);
@@ -2545,9 +2551,12 @@ static void run_tests(void)
parse_script_a("Option Explicit\nset test.setobj = testObj");
CHECK_CALLED(global_setobj_i);
+ SET_EXPECT(OnScriptError);
hres = parse_script_ar("dim x\nx = testObj.rem");
todo_wine
ok(hres == S_OK, "use of 'rem' as dot identifier failed: %x08\n", hres);
+ todo_wine
+ CHECK_NOT_CALLED(OnScriptError);
SET_EXPECT(testobj_propget_d);
SET_EXPECT(testobj_propget_i);
@@ -2593,7 +2602,7 @@ static void run_tests(void)
SET_EXPECT(OnScriptError);
hres = parse_script_ar("<!--");
ok(FAILED(hres), "script didn't fail\n");
- todo_wine CHECK_CALLED(OnScriptError);
+ CHECK_CALLED(OnScriptError);
SET_EXPECT(global_success_d);
SET_EXPECT(global_success_i);
More information about the wine-cvs
mailing list