Jacek Caban : vbscript: Store reference to collected object in collect_objects.
Alexandre Julliard
julliard at winehq.org
Mon Sep 19 13:48:44 CDT 2011
Module: wine
Branch: master
Commit: 79a2650de7a9e04430a523f2a8d9b262acca0f60
URL: http://source.winehq.org/git/wine.git/?a=commit;h=79a2650de7a9e04430a523f2a8d9b262acca0f60
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Sep 19 14:08:15 2011 +0200
vbscript: Store reference to collected object in collect_objects.
---
dlls/vbscript/vbdisp.c | 26 +++++++++++++-------------
1 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 14fb8b0..19a511e 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -123,21 +123,21 @@ static HRESULT invoke_variant_prop(vbdisp_t *This, VARIANT *v, WORD flags, DISPP
return hres;
}
-static void run_terminator(vbdisp_t *This)
+static BOOL run_terminator(vbdisp_t *This)
{
+ DISPPARAMS dp = {0};
+
if(This->terminator_ran)
- return;
+ return TRUE;
This->terminator_ran = TRUE;
- if(This->desc->class_terminate_id) {
- DISPPARAMS dp = {0};
-
- This->ref++;
- exec_script(This->desc->ctx, This->desc->funcs[This->desc->class_terminate_id].entries[VBDISP_CALLGET],
- (IDispatch*)&This->IDispatchEx_iface, &dp, NULL);
- This->ref--;
- }
+ if(!This->desc->class_terminate_id)
+ return TRUE;
+ This->ref++;
+ exec_script(This->desc->ctx, This->desc->funcs[This->desc->class_terminate_id].entries[VBDISP_CALLGET],
+ (IDispatch*)&This->IDispatchEx_iface, &dp, NULL);
+ return !--This->ref;
}
static void clean_props(vbdisp_t *This)
@@ -196,9 +196,7 @@ static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
TRACE("(%p) ref=%d\n", This, ref);
- if(!ref)
- run_terminator(This);
- if(!ref) {
+ if(!ref && run_terminator(This)) {
clean_props(This);
list_remove(&This->entry);
heap_free(This);
@@ -431,8 +429,10 @@ void collect_objects(script_ctx_t *ctx)
run_terminator(iter);
LIST_FOR_EACH_ENTRY_SAFE(iter, iter2, &ctx->objects, vbdisp_t, entry) {
+ IDispatchEx_AddRef(&iter->IDispatchEx_iface);
clean_props(iter);
iter->desc = NULL;
+ IDispatchEx_Release(&iter->IDispatchEx_iface);
}
}
More information about the wine-cvs
mailing list