[PATCH v4 5/7] vbscript: Implement separate script dispatch objects for each named item.

Jacek Caban jacek at codeweavers.com
Tue Feb 11 10:27:55 CST 2020


On 07.02.2020 14:55, Gabriel Ivăncescu wrote:
> @@ -248,8 +258,10 @@ static void release_script(script_ctx_t *ctx)
>           list_remove(&iter->entry);
>           if(iter->disp)
>               IDispatch_Release(iter->disp);
> +        release_named_item_script_obj(iter);
>           heap_free(iter->name);
> -        heap_free(iter);
> +        if(!--iter->ref)
> +            heap_free(iter);
>       }
>   
>       if(ctx->host_global) {


A separated release_vbscode() would be cleaner IMO. It would decrease 
the counter and free the struct if it's the last reference. You could 
also move freeing the name there.


There is a bigger problem with the patch: script dispatch objects 
created for persistent scripts on reinitialization will never be released.


> @@ -504,6 +516,7 @@ static ULONG WINAPI VBScript_Release(IActiveScript *iface)
>   static HRESULT WINAPI VBScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass)
>   {
>       VBScript *This = impl_from_IActiveScript(iface);
> +    vbscode_t *code;
>       LCID lcid;
>       HRESULT hres;
>   
> @@ -522,6 +535,21 @@ static HRESULT WINAPI VBScript_SetScriptSite(IActiveScript *iface, IActiveScript
>       if(FAILED(hres))
>           return hres;
>   
> +    /* Create new script dispatches for persistent code with named items */
> +    LIST_FOR_EACH_ENTRY(code, &This->ctx->code_list, vbscode_t, entry)
> +    {
> +        if(code->named_item && !code->named_item->script_obj)
> +        {
> +            hres = create_script_disp(This->ctx, &code->named_item->script_obj);
> +            if(FAILED(hres))
> +            {
> +                This->ctx->script_obj->ctx = NULL;
> +                IDispatchEx_Release(&This->ctx->script_obj->IDispatchEx_iface);
> +                return hres;
> +            }
> +        }
> +    }
> +
>       This->ctx->site = pass;
>       IActiveScriptSite_AddRef(This->ctx->site);
>   
> @@ -659,8 +687,14 @@ static HRESULT WINAPI VBScript_AddNamedItem(IActiveScript *iface, LPCOLESTR pstr
>       }
>   
>       item->disp = disp;
> +    item->ref = 1;
>       item->flags = dwFlags;
>       item->name = heap_strdupW(pstrName);
> +    hres = create_script_disp(This->ctx, &item->script_obj);
> +    if(FAILED(hres)) {
> +        heap_free(item->name);
> +        item->name = NULL;
> +    }
>       if(!item->name) {
>           if(disp)
>               IDispatch_Release(disp);


How about creating it on demand in exec_script instead?


Thanks,

Jacek




More information about the wine-devel mailing list