Jacek Caban : vbscript: Added support for VARIANTREF arguments in multiple argument functions.

Alexandre Julliard julliard at winehq.org
Tue Jan 3 12:52:52 CST 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Dec 30 17:00:02 2011 +0100

vbscript: Added support for VARIANTREF arguments in multiple argument functions.

---

 dlls/vbscript/vbdisp.c |   36 ++++++++++++++++++++++++++++++------
 1 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 5032f4a..ab62c9f 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -16,6 +16,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include <assert.h>
+
 #include "vbscript.h"
 
 #include "wine/debug.h"
@@ -133,7 +135,8 @@ static HRESULT invoke_variant_prop(vbdisp_t *This, VARIANT *v, WORD flags, DISPP
 
 static HRESULT invoke_builtin(vbdisp_t *This, const builtin_prop_t *prop, WORD flags, DISPPARAMS *dp, VARIANT *res)
 {
-    VARIANT *args;
+    VARIANT *args, arg_buf[8];
+    unsigned argn;
 
     switch(flags) {
     case DISPATCH_PROPERTYGET:
@@ -163,15 +166,36 @@ static HRESULT invoke_builtin(vbdisp_t *This, const builtin_prop_t *prop, WORD f
         return E_NOTIMPL;
     }
 
-    if(arg_cnt(dp) < prop->min_args || arg_cnt(dp) > (prop->max_args ? prop->max_args : prop->min_args)) {
+    argn = arg_cnt(dp);
+
+    if(argn < prop->min_args || argn > (prop->max_args ? prop->max_args : prop->min_args)) {
         FIXME("invalid number of arguments\n");
         return E_FAIL;
     }
 
-    if(arg_cnt(dp) == 1 && V_VT(dp->rgvarg) == (VT_BYREF|VT_VARIANT))
-        args = V_VARIANTREF(dp->rgvarg);
-    else
-        args = dp->rgvarg;
+    args = dp->rgvarg;
+
+    if(argn == 1) {
+        if(V_VT(dp->rgvarg) == (VT_BYREF|VT_VARIANT))
+            args = V_VARIANTREF(dp->rgvarg);
+    }else {
+        unsigned i;
+
+        assert(argn < sizeof(arg_buf)/sizeof(*arg_buf));
+
+        for(i=0; i < argn; i++) {
+            if(V_VT(dp->rgvarg+i) == (VT_BYREF|VT_VARIANT)) {
+                for(i=0; i < argn; i++) {
+                    if(V_VT(dp->rgvarg+i) == (VT_BYREF|VT_VARIANT))
+                        arg_buf[i] = *V_VARIANTREF(dp->rgvarg+i);
+                    else
+                        arg_buf[i] = dp->rgvarg[i];
+                }
+                args = arg_buf;
+                break;
+            }
+        }
+    }
 
     return prop->proc(This, args, dp->cArgs, res);
 }




More information about the wine-cvs mailing list