Jacek Caban : vbscript: Store entire EXCEPINFO in script context.
Alexandre Julliard
julliard at winehq.org
Thu Oct 3 16:44:01 CDT 2019
Module: wine
Branch: master
Commit: 8277c24806cfd174617bc35d06a7cb7a7284e44c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=8277c24806cfd174617bc35d06a7cb7a7284e44c
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Oct 3 18:18:37 2019 +0200
vbscript: Store entire EXCEPINFO in script context.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list