static HRESULT get_func_obj_entry(DispatchEx *This, func_info_t *func, func_obj_entry_t **ret) { dispex_dynamic_data_t *dynamic_data; func_obj_entry_t *entry; dynamic_data = get_dynamic_data(This); if(!dynamic_data) return E_OUTOFMEMORY; if(!dynamic_data->func_disps) { dynamic_data->func_disps = heap_alloc_zero(This->data->data->func_disp_cnt * sizeof(*dynamic_data->func_disps)); if(!dynamic_data->func_disps) return E_OUTOFMEMORY; } entry = dynamic_data->func_disps + func->func_disp_idx; if(!entry->func_obj) { entry->func_obj = create_func_disp(This, func); if(!entry->func_obj) return E_OUTOFMEMORY; IDispatchEx_AddRef(&entry->func_obj->dispex.IDispatchEx_iface); V_VT(&entry->val) = VT_DISPATCH; V_DISPATCH(&entry->val) = (IDispatch*)&entry->func_obj->dispex.IDispatchEx_iface; } *ret = entry; return S_OK; }
HRESULT init_dispex(DispatchEx *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, DispatchEx *prototype) { TRACE("%p (%p)\n", dispex, prototype); dispex->lpIDispatchExVtbl = &DispatchExVtbl; dispex->ref = 1; dispex->builtin_info = builtin_info; dispex->props = heap_alloc((dispex->buf_size=4) * sizeof(dispex_prop_t)); if(!dispex->props) return E_OUTOFMEMORY; dispex->prototype = prototype; if(prototype) IDispatchEx_AddRef(_IDispatchEx_(prototype)); dispex->prop_cnt = 1; dispex->props[0].name = NULL; dispex->props[0].flags = 0; if(builtin_info->value_prop.invoke) { dispex->props[0].type = PROP_BUILTIN; dispex->props[0].u.p = &builtin_info->value_prop; }else { dispex->props[0].type = PROP_DELETED; } script_addref(ctx); dispex->ctx = ctx; return S_OK; }
static HRESULT get_func_obj_entry(DispatchEx *This, func_info_t *func, func_obj_entry_t **ret) { dispex_dynamic_data_t *dynamic_data; dynamic_data = get_dynamic_data(This); if(!dynamic_data) return E_OUTOFMEMORY; if(!dynamic_data->func_disps) { dynamic_data->func_disps = heap_alloc_zero(This->data->data->func_disp_cnt * sizeof(*dynamic_data->func_disps)); if(!dynamic_data->func_disps) return E_OUTOFMEMORY; } if(!dynamic_data->func_disps[func->func_disp_idx].func_obj) { func_disp_t *func_obj; func_obj = create_func_disp(This, func); if(!func_obj) return E_OUTOFMEMORY; dynamic_data->func_disps[func->func_disp_idx].func_obj = func_obj; IDispatchEx_AddRef(&func_obj->dispex.IDispatchEx_iface); dynamic_data->func_disps[func->func_disp_idx].val = (IDispatch*)&func_obj->dispex.IDispatchEx_iface; } *ret = dynamic_data->func_disps+func->func_disp_idx; return S_OK; }
static ULONG WINAPI Function_AddRef(IUnknown *iface) { func_disp_t *This = impl_from_IUnknown(iface); TRACE("(%p)\n", This); return IDispatchEx_AddRef(&This->obj->IDispatchEx_iface); }
static ULONG WINAPI Function_AddRef(IUnknown *iface) { func_disp_t *This = FUNCTION_THIS(iface); TRACE("(%p)\n", This); return IDispatchEx_AddRef(DISPATCHEX(This->obj)); }
static HRESULT constructor_call(DispatchEx *constr, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { if(flags != DISPATCH_PROPERTYGET) return jsdisp_call_value(constr, flags, dp, retv, ei, sp); V_VT(retv) = VT_DISPATCH; V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(constr); IDispatchEx_AddRef(_IDispatchEx_(constr)); return S_OK; }
void collect_objects(script_ctx_t *ctx) { vbdisp_t *iter, *iter2; LIST_FOR_EACH_ENTRY_SAFE(iter, iter2, &ctx->objects, vbdisp_t, entry) run_terminator(iter); while(!list_empty(&ctx->objects)) { iter = LIST_ENTRY(list_head(&ctx->objects), vbdisp_t, entry); IDispatchEx_AddRef(&iter->IDispatchEx_iface); clean_props(iter); iter->desc = NULL; list_remove(&iter->entry); list_init(&iter->entry); IDispatchEx_Release(&iter->IDispatchEx_iface); } }