Module: wine Branch: master Commit: 8277c24806cfd174617bc35d06a7cb7a7284e44c URL: https://source.winehq.org/git/wine.git/?a=commit;h=8277c24806cfd174617bc35d0...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Oct 3 18:18:37 2019 +0200
vbscript: Store entire EXCEPINFO in script context.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/vbscript/global.c | 4 ++-- dlls/vbscript/interp.c | 12 ++++++++++-- dlls/vbscript/vbscript.c | 1 + dlls/vbscript/vbscript.h | 3 ++- 4 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index e09099ecaf..98bcc516d7 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -2477,7 +2477,7 @@ static HRESULT Err_Number(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARI return E_NOTIMPL; }
- hres = This->desc->ctx->err_number; + hres = This->desc->ctx->ei.scode; return return_int(res, HRESULT_FACILITY(hres) == FACILITY_VBS ? HRESULT_CODE(hres) : hres); }
@@ -2494,7 +2494,7 @@ static HRESULT Err_Clear(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIA if(!This->desc) return E_UNEXPECTED;
- This->desc->ctx->err_number = S_OK; + clear_ei(&This->desc->ctx->ei); return S_OK; }
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index 6b9fd60a75..9c561826fa 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -247,6 +247,14 @@ static HRESULT add_dynamic_var(exec_ctx_t *ctx, const WCHAR *name, return S_OK; }
+void clear_ei(EXCEPINFO *ei) +{ + SysFreeString(ei->bstrSource); + SysFreeString(ei->bstrDescription); + SysFreeString(ei->bstrHelpFile); + memset(ei, 0, sizeof(*ei)); +} + static inline VARIANT *stack_pop(exec_ctx_t *ctx) { assert(ctx->top); @@ -1321,7 +1329,7 @@ static HRESULT interp_errmode(exec_ctx_t *ctx) TRACE("%d\n", err_mode);
ctx->resume_next = err_mode; - ctx->script->err_number = S_OK; + clear_ei(&ctx->script->ei); return S_OK; }
@@ -2158,7 +2166,7 @@ HRESULT exec_script(script_ctx_t *ctx, function_t *func, vbdisp_t *vbthis, DISPP op = exec.instr->op; hres = op_funcs[op](&exec); if(FAILED(hres)) { - ctx->err_number = hres = map_hres(hres); + ctx->ei.scode = hres = map_hres(hres);
if(exec.resume_next) { unsigned stack_off; diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c index aa768a57e7..69dc1a151b 100644 --- a/dlls/vbscript/vbscript.c +++ b/dlls/vbscript/vbscript.c @@ -153,6 +153,7 @@ static void release_script(script_ctx_t *ctx) class_desc_t *class_desc;
collect_objects(ctx); + clear_ei(&ctx->ei);
release_dynamic_vars(ctx->global_vars); ctx->global_vars = NULL; diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index c9018c4648..003d759046 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -192,7 +192,7 @@ struct _script_ctx_t { class_desc_t err_desc; vbdisp_t *err_obj;
- HRESULT err_number; + EXCEPINFO ei;
dynamic_var_t *global_vars; function_t *global_funcs; @@ -358,6 +358,7 @@ HRESULT compile_script(script_ctx_t*,const WCHAR*,const WCHAR*,DWORD,vbscode_t** HRESULT exec_script(script_ctx_t*,function_t*,vbdisp_t*,DISPPARAMS*,VARIANT*) DECLSPEC_HIDDEN; void release_dynamic_vars(dynamic_var_t*) DECLSPEC_HIDDEN; IDispatch *lookup_named_item(script_ctx_t*,const WCHAR*,unsigned) DECLSPEC_HIDDEN; +void clear_ei(EXCEPINFO*) DECLSPEC_HIDDEN;
typedef struct { UINT16 len;