Jacek Caban : vbscript: Factor out invoke_vbdisp.
Alexandre Julliard
julliard at winehq.org
Thu Oct 17 16:01:26 CDT 2019
Module: wine
Branch: master
Commit: 6d55197ee0bf0ac81fac1ea1dbffc44e62561b6e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=6d55197ee0bf0ac81fac1ea1dbffc44e62561b6e
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Oct 17 22:46:12 2019 +0200
vbscript: Factor out invoke_vbdisp.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/vbscript/vbdisp.c | 164 ++++++++++++++++++++++++++-----------------------
1 file changed, 86 insertions(+), 78 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index fb646e7187..60ca5c8b0e 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -248,6 +248,91 @@ static HRESULT invoke_builtin(vbdisp_t *This, const builtin_prop_t *prop, WORD f
return prop->proc(This, args, dp->cArgs, res);
}
+static HRESULT invoke_vbdisp(vbdisp_t *This, DISPID id, DWORD flags, BOOL extern_caller, DISPPARAMS *params, VARIANT *res)
+{
+ if(id < 0)
+ return DISP_E_MEMBERNOTFOUND;
+
+ if(is_func_id(This, id)) {
+ function_t *func;
+
+ TRACE("%p->%s\n", This, debugstr_w(This->desc->funcs[id].name));
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET:
+ func = This->desc->funcs[id].entries[VBDISP_CALLGET];
+ if(!func || (func->type != FUNC_PROPGET && func->type != FUNC_DEFGET)) {
+ WARN("no getter\n");
+ return DISP_E_MEMBERNOTFOUND;
+ }
+
+ return exec_script(This->desc->ctx, FALSE, func, This, params, res);
+
+ case DISPATCH_METHOD:
+ case DISPATCH_METHOD|DISPATCH_PROPERTYGET:
+ func = This->desc->funcs[id].entries[VBDISP_CALLGET];
+ if(!func) {
+ FIXME("no invoke/getter\n");
+ return DISP_E_MEMBERNOTFOUND;
+ }
+
+ return exec_script(This->desc->ctx, FALSE, func, This, params, res);
+ case DISPATCH_PROPERTYPUT:
+ case DISPATCH_PROPERTYPUTREF:
+ case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: {
+ DISPPARAMS dp = {NULL, NULL, 1, 0};
+ BOOL needs_release;
+ VARIANT put_val;
+ HRESULT hres;
+
+ if(arg_cnt(params)) {
+ FIXME("arguments not implemented\n");
+ return E_NOTIMPL;
+ }
+
+ hres = get_propput_arg(This->desc->ctx, params, flags, &put_val, &needs_release);
+ if(FAILED(hres))
+ return hres;
+
+ dp.rgvarg = &put_val;
+ func = This->desc->funcs[id].entries[V_VT(&put_val) == VT_DISPATCH ? VBDISP_SET : VBDISP_LET];
+ if(!func) {
+ FIXME("no letter/setter\n");
+ return DISP_E_MEMBERNOTFOUND;
+ }
+
+ hres = exec_script(This->desc->ctx, FALSE, func, This, &dp, NULL);
+ if(needs_release)
+ VariantClear(&put_val);
+ return hres;
+ }
+ default:
+ FIXME("flags %x\n", flags);
+ return DISP_E_MEMBERNOTFOUND;
+ }
+ }
+
+ if(id >= This->desc->prop_cnt + This->desc->func_cnt) {
+ if(This->desc->builtin_prop_cnt) {
+ unsigned min = 0, max = This->desc->builtin_prop_cnt-1, i;
+
+ while(min <= max) {
+ i = (min+max)/2;
+ if(This->desc->builtin_props[i].id == id)
+ return invoke_builtin(This, This->desc->builtin_props+i, flags, params, res);
+ if(This->desc->builtin_props[i].id < id)
+ min = i+1;
+ else
+ max = i-1;
+ }
+ }
+ return DISP_E_MEMBERNOTFOUND;
+ }
+
+ TRACE("%p->%s\n", This, debugstr_w(This->desc->props[id - This->desc->func_cnt].name));
+ return invoke_variant_prop(This->desc->ctx, This->props+(id-This->desc->func_cnt), flags, params, res);
+}
+
static BOOL run_terminator(vbdisp_t *This)
{
DISPPARAMS dp = {0};
@@ -412,84 +497,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
if(pvarRes)
V_VT(pvarRes) = VT_EMPTY;
- if(id < 0)
- return DISP_E_MEMBERNOTFOUND;
-
- if(is_func_id(This, id)) {
- function_t *func;
-
- switch(wFlags) {
- case DISPATCH_PROPERTYGET:
- func = This->desc->funcs[id].entries[VBDISP_CALLGET];
- if(!func || (func->type != FUNC_PROPGET && func->type != FUNC_DEFGET)) {
- WARN("no getter\n");
- return DISP_E_MEMBERNOTFOUND;
- }
-
- return exec_script(This->desc->ctx, FALSE, func, This, pdp, pvarRes);
-
- case DISPATCH_METHOD:
- case DISPATCH_METHOD|DISPATCH_PROPERTYGET:
- func = This->desc->funcs[id].entries[VBDISP_CALLGET];
- if(!func) {
- FIXME("no invoke/getter\n");
- return DISP_E_MEMBERNOTFOUND;
- }
-
- return exec_script(This->desc->ctx, FALSE, func, This, pdp, pvarRes);
- case DISPATCH_PROPERTYPUT:
- case DISPATCH_PROPERTYPUTREF:
- case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: {
- DISPPARAMS dp = {NULL, NULL, 1, 0};
- BOOL needs_release;
- VARIANT put_val;
- HRESULT hres;
-
- if(arg_cnt(pdp)) {
- FIXME("arguments not implemented\n");
- return E_NOTIMPL;
- }
-
- hres = get_propput_arg(This->desc->ctx, pdp, wFlags, &put_val, &needs_release);
- if(FAILED(hres))
- return hres;
-
- dp.rgvarg = &put_val;
- func = This->desc->funcs[id].entries[V_VT(&put_val) == VT_DISPATCH ? VBDISP_SET : VBDISP_LET];
- if(!func) {
- FIXME("no letter/setter\n");
- return DISP_E_MEMBERNOTFOUND;
- }
-
- hres = exec_script(This->desc->ctx, FALSE, func, This, &dp, NULL);
- if(needs_release)
- VariantClear(&put_val);
- return hres;
- }
- default:
- FIXME("flags %x\n", wFlags);
- return DISP_E_MEMBERNOTFOUND;
- }
- }
-
- if(id < This->desc->prop_cnt + This->desc->func_cnt)
- return invoke_variant_prop(This->desc->ctx, This->props+(id-This->desc->func_cnt), wFlags, pdp, pvarRes);
-
- if(This->desc->builtin_prop_cnt) {
- unsigned min = 0, max = This->desc->builtin_prop_cnt-1, i;
-
- while(min <= max) {
- i = (min+max)/2;
- if(This->desc->builtin_props[i].id == id)
- return invoke_builtin(This, This->desc->builtin_props+i, wFlags, pdp, pvarRes);
- if(This->desc->builtin_props[i].id < id)
- min = i+1;
- else
- max = i-1;
- }
- }
-
- return DISP_E_MEMBERNOTFOUND;
+ return invoke_vbdisp(This, id, wFlags, TRUE, pdp, pvarRes);
}
static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
More information about the wine-cvs
mailing list