Jacek Caban : vbscript: Factor out variant_call.

Alexandre Julliard julliard at winehq.org
Mon Oct 28 16:43:36 CDT 2019


Module: wine
Branch: master
Commit: ecaa72855a3be83e96fdb8e57d5232eb354c5886
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ecaa72855a3be83e96fdb8e57d5232eb354c5886

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Oct 28 18:40:29 2019 +0100

vbscript: Factor out variant_call.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/vbscript/interp.c | 88 +++++++++++++++++++++++++++++---------------------
 1 file changed, 52 insertions(+), 36 deletions(-)

diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index d8ed679788..45f15933e6 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -515,6 +515,52 @@ static HRESULT array_access(exec_ctx_t *ctx, SAFEARRAY *array, DISPPARAMS *dp, V
     return hres;
 }
 
+static HRESULT variant_call(exec_ctx_t *ctx, VARIANT *v, unsigned arg_cnt, VARIANT *res)
+{
+    SAFEARRAY *array = NULL;
+    DISPPARAMS dp;
+    HRESULT hres;
+
+    TRACE("%s\n", debugstr_variant(v));
+
+    if(V_VT(v) == (VT_VARIANT|VT_BYREF))
+        v = V_VARIANTREF(v);
+
+    switch(V_VT(v)) {
+    case VT_ARRAY|VT_BYREF|VT_VARIANT:
+        array = *V_ARRAYREF(v);
+        break;
+    case VT_ARRAY|VT_VARIANT:
+        array = V_ARRAY(v);
+        break;
+    case VT_DISPATCH:
+        vbstack_to_dp(ctx, arg_cnt, FALSE, &dp);
+        hres = disp_call(ctx->script, V_DISPATCH(v), DISPID_VALUE, &dp, res);
+        break;
+    default:
+        FIXME("unsupported on %s\n", debugstr_variant(v));
+        return E_NOTIMPL;
+    }
+
+    if(array) {
+        if(!res) {
+            FIXME("no res\n");
+            return E_NOTIMPL;
+        }
+
+        vbstack_to_dp(ctx, arg_cnt, FALSE, &dp);
+        hres = array_access(ctx, array, &dp, &v);
+        if(FAILED(hres))
+            return hres;
+
+        V_VT(res) = VT_BYREF|VT_VARIANT;
+        V_BYREF(res) = v;
+    }
+
+    stack_popn(ctx, arg_cnt);
+    return S_OK;
+}
+
 static HRESULT do_icall(exec_ctx_t *ctx, VARIANT *res)
 {
     BSTR identifier = ctx->instr->arg1.bstr;
@@ -523,56 +569,26 @@ static HRESULT do_icall(exec_ctx_t *ctx, VARIANT *res)
     ref_t ref;
     HRESULT hres;
 
+    TRACE("%s %u\n", debugstr_w(identifier), arg_cnt);
+
     hres = lookup_identifier(ctx, identifier, VBDISP_CALLGET, &ref);
     if(FAILED(hres))
         return hres;
 
     switch(ref.type) {
     case REF_VAR:
-    case REF_CONST: {
-        VARIANT *v;
+    case REF_CONST:
+        if(arg_cnt)
+            return variant_call(ctx, ref.u.v, arg_cnt, res);
 
         if(!res) {
             FIXME("REF_VAR no res\n");
             return E_NOTIMPL;
         }
 
-        v = V_VT(ref.u.v) == (VT_VARIANT|VT_BYREF) ? V_VARIANTREF(ref.u.v) : ref.u.v;
-
-        if(arg_cnt) {
-            SAFEARRAY *array = NULL;
-
-            switch(V_VT(v)) {
-            case VT_ARRAY|VT_BYREF|VT_VARIANT:
-                array = *V_ARRAYREF(v);
-                break;
-            case VT_ARRAY|VT_VARIANT:
-                array = V_ARRAY(v);
-                break;
-            case VT_DISPATCH:
-                vbstack_to_dp(ctx, arg_cnt, FALSE, &dp);
-                hres = disp_call(ctx->script, V_DISPATCH(v), DISPID_VALUE, &dp, res);
-                if(FAILED(hres))
-                    return hres;
-                break;
-            default:
-                FIXME("arguments not implemented\n");
-                return E_NOTIMPL;
-            }
-
-            if(!array)
-                break;
-
-            vbstack_to_dp(ctx, arg_cnt, FALSE, &dp);
-            hres = array_access(ctx, array, &dp, &v);
-            if(FAILED(hres))
-                return hres;
-        }
-
         V_VT(res) = VT_BYREF|VT_VARIANT;
-        V_BYREF(res) = v;
+        V_BYREF(res) = V_VT(ref.u.v) == (VT_VARIANT|VT_BYREF) ? V_VARIANTREF(ref.u.v) : ref.u.v;
         break;
-    }
     case REF_DISP:
         vbstack_to_dp(ctx, arg_cnt, FALSE, &dp);
         hres = disp_call(ctx->script, ref.u.d.disp, ref.u.d.id, &dp, res);




More information about the wine-cvs mailing list