[PATCH v2 2/6] vbscript: Use a helper function to reset the script dispatch.

Gabriel Ivăncescu gabrielopcode at gmail.com
Wed Feb 5 09:25:03 CST 2020


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---

Simplifies the 5th patch.

 dlls/vbscript/vbdisp.c   | 28 ++++++++++++++++++++--------
 dlls/vbscript/vbscript.h |  1 +
 2 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 36eba21..666da11 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -1243,19 +1243,12 @@ static ULONG WINAPI ScriptDisp_Release(IDispatchEx *iface)
 {
     ScriptDisp *This = ScriptDisp_from_IDispatchEx(iface);
     LONG ref = InterlockedDecrement(&This->ref);
-    unsigned i;
 
     TRACE("(%p) ref=%d\n", This, ref);
 
     if(!ref) {
         assert(!This->ctx);
-
-        for (i = 0; i < This->global_vars_cnt; i++)
-            release_dynamic_var(This->global_vars[i]);
-
-        heap_pool_free(&This->heap);
-        heap_free(This->global_vars);
-        heap_free(This->global_funcs);
+        reset_script_disp(This);
         heap_free(This);
     }
 
@@ -1500,6 +1493,25 @@ HRESULT create_script_disp(script_ctx_t *ctx, ScriptDisp **ret)
     return S_OK;
 }
 
+void reset_script_disp(ScriptDisp *disp)
+{
+    unsigned i;
+
+    for (i = 0; i < disp->global_vars_cnt; i++)
+        release_dynamic_var(disp->global_vars[i]);
+
+    heap_free(disp->global_vars);
+    heap_free(disp->global_funcs);
+    heap_pool_free(&disp->heap);
+    heap_pool_init(&disp->heap);
+
+    disp->global_vars_cnt = disp->global_vars_size = 0;
+    disp->global_funcs_cnt = disp->global_funcs_size = 0;
+    disp->global_vars = NULL;
+    disp->global_funcs = NULL;
+    disp->classes = NULL;
+}
+
 void collect_objects(script_ctx_t *ctx)
 {
     vbdisp_t *iter, *iter2;
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index f37b0ce..10c8f00 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -164,6 +164,7 @@ HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,WORD,DISPPARAMS*) DECLSPEC_
 HRESULT get_disp_value(script_ctx_t*,IDispatch*,VARIANT*) DECLSPEC_HIDDEN;
 void collect_objects(script_ctx_t*) DECLSPEC_HIDDEN;
 HRESULT create_script_disp(script_ctx_t*,ScriptDisp**) DECLSPEC_HIDDEN;
+void reset_script_disp(ScriptDisp*) DECLSPEC_HIDDEN;
 
 HRESULT to_int(VARIANT*,int*) DECLSPEC_HIDDEN;
 
-- 
2.21.0




More information about the wine-devel mailing list