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