Module: wine Branch: master Commit: 79a2650de7a9e04430a523f2a8d9b262acca0f60 URL: http://source.winehq.org/git/wine.git/?a=commit;h=79a2650de7a9e04430a523f2a8...
Author: Jacek Caban jacek@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); } }