Jacek Caban : vbscript: Pass arguments to builtin functions in natural order.

Alexandre Julliard julliard at winehq.org
Wed Oct 17 14:32:26 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Oct 17 09:54:12 2012 +0200

vbscript: Pass arguments to builtin functions in natural order.

---

 dlls/vbscript/global.c |   79 +++++++++++++++++++++++------------------------
 dlls/vbscript/vbdisp.c |   33 +++++--------------
 2 files changed, 48 insertions(+), 64 deletions(-)

diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index 4a4dd8e..69686f5 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -648,16 +648,16 @@ static HRESULT Global_Left(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VAR
 
     TRACE("(%s %s)\n", debugstr_variant(args+1), debugstr_variant(args));
 
-    if(V_VT(args+1) == VT_BSTR) {
-        str = V_BSTR(args+1);
+    if(V_VT(args) == VT_BSTR) {
+        str = V_BSTR(args);
     }else {
-        hres = to_string(args+1, &conv_str);
+        hres = to_string(args, &conv_str);
         if(FAILED(hres))
             return hres;
         str = conv_str;
     }
 
-    hres = to_int(args, &len);
+    hres = to_int(args+1, &len);
     if(FAILED(hres))
         return hres;
 
@@ -690,18 +690,18 @@ static HRESULT Global_Right(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VA
     int len, str_len;
     HRESULT hres;
 
-    TRACE("(%s %s)\n", debugstr_variant(args+1), debugstr_variant(args));
+    TRACE("(%s %s)\n", debugstr_variant(args), debugstr_variant(args+1));
 
     if(V_VT(args+1) == VT_BSTR) {
-        str = V_BSTR(args+1);
+        str = V_BSTR(args);
     }else {
-        hres = to_string(args+1, &conv_str);
+        hres = to_string(args, &conv_str);
         if(FAILED(hres))
             return hres;
         str = conv_str;
     }
 
-    hres = to_int(args, &len);
+    hres = to_int(args+1, &len);
     if(FAILED(hres))
         return hres;
 
@@ -734,11 +734,23 @@ static HRESULT Global_Mid(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARI
     BSTR str;
     HRESULT hres;
 
-    TRACE("\n");
+    TRACE("(%s %s ...)\n", debugstr_variant(args), debugstr_variant(args+1));
 
-    switch(args_cnt) {
-    case 3:
-        hres = to_int(args, &len);
+    assert(args_cnt == 2 || args_cnt == 3);
+
+    if(V_VT(args) != VT_BSTR) {
+        FIXME("args[0] = %s\n", debugstr_variant(args));
+        return E_NOTIMPL;
+    }
+
+    str = V_BSTR(args);
+
+    hres = to_int(args+1, &start);
+    if(FAILED(hres))
+        return hres;
+
+    if(args_cnt == 3) {
+        hres = to_int(args+2, &len);
         if(FAILED(hres))
             return hres;
 
@@ -746,21 +758,6 @@ static HRESULT Global_Mid(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARI
             FIXME("len = %d\n", len);
             return E_FAIL;
         }
-        /* fallthrough */
-    case 2:
-        hres = to_int(args+args_cnt-2, &start);
-        if(FAILED(hres))
-            return hres;
-
-        if(V_VT(args+args_cnt-1) != VT_BSTR) {
-            FIXME("args[0] = %s\n", debugstr_variant(args+args_cnt-1));
-            return E_NOTIMPL;
-        }
-
-        str = V_BSTR(args+args_cnt-1);
-        break;
-    default:
-        assert(0);
     }
 
 
@@ -987,16 +984,18 @@ static HRESULT Global_InStr(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VA
 
     TRACE("\n");
 
+    assert(2 <= args_cnt && args_cnt <= 4);
+
     switch(args_cnt) {
     case 2:
         startv = NULL;
-        str1v = args+1;
-        str2v = args;
+        str1v = args;
+        str2v = args+1;
         break;
     case 3:
-        startv = args+2;
+        startv = args;
         str1v = args+1;
-        str2v = args;
+        str2v = args+2;
         break;
     case 4:
         FIXME("unsupported compare argument %s\n", debugstr_variant(args));
@@ -1227,7 +1226,7 @@ static HRESULT Global_InputBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt,
     return E_NOTIMPL;
 }
 
-static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
+static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
 {
     BSTR prompt;
     HRESULT hres;
@@ -1239,7 +1238,7 @@ static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VA
         return E_NOTIMPL;
     }
 
-    hres = to_string(arg, &prompt);
+    hres = to_string(args, &prompt);
     if(FAILED(hres))
         return hres;
 
@@ -1425,7 +1424,7 @@ static HRESULT Global_FormatDateTime(vbdisp_t *This, VARIANT *arg, unsigned args
     return E_NOTIMPL;
 }
 
-static HRESULT Global_WeekdayName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
+static HRESULT Global_WeekdayName(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
 {
     int weekday, first_day = 0, abbrev = 0;
     BSTR ret;
@@ -1435,17 +1434,17 @@ static HRESULT Global_WeekdayName(vbdisp_t *This, VARIANT *arg, unsigned args_cn
 
     assert(1 <= args_cnt && args_cnt <= 3);
 
-    hres = to_int(arg+args_cnt-1, &weekday);
+    hres = to_int(args, &weekday);
     if(FAILED(hres))
         return hres;
 
     if(args_cnt > 1) {
-        hres = to_int(arg+args_cnt-2, &abbrev);
+        hres = to_int(args+1, &abbrev);
         if(FAILED(hres))
             return hres;
 
         if(args_cnt == 3) {
-            hres = to_int(arg, &first_day);
+            hres = to_int(args+2, &first_day);
             if(FAILED(hres))
                 return hres;
         }
@@ -1458,7 +1457,7 @@ static HRESULT Global_WeekdayName(vbdisp_t *This, VARIANT *arg, unsigned args_cn
     return return_bstr(res, ret);
 }
 
-static HRESULT Global_MonthName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
+static HRESULT Global_MonthName(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
 {
     int month, abbrev = 0;
     BSTR ret;
@@ -1468,12 +1467,12 @@ static HRESULT Global_MonthName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt,
 
     assert(args_cnt == 1 || args_cnt == 2);
 
-    hres = to_int(arg+args_cnt-1, &month);
+    hres = to_int(args, &month);
     if(FAILED(hres))
         return hres;
 
     if(args_cnt == 2) {
-        hres = to_int(arg, &abbrev);
+        hres = to_int(args+1, &abbrev);
         if(FAILED(hres))
             return hres;
     }
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 27c4aa3..aff9361 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -138,8 +138,8 @@ static HRESULT invoke_variant_prop(VARIANT *v, WORD flags, DISPPARAMS *dp, VARIA
 
 static HRESULT invoke_builtin(vbdisp_t *This, const builtin_prop_t *prop, WORD flags, DISPPARAMS *dp, VARIANT *res)
 {
-    VARIANT *args, arg_buf[8];
-    unsigned argn;
+    VARIANT args[8];
+    unsigned argn, i;
 
     switch(flags) {
     case DISPATCH_PROPERTYGET:
@@ -176,28 +176,13 @@ static HRESULT invoke_builtin(vbdisp_t *This, const builtin_prop_t *prop, WORD f
         return E_FAIL;
     }
 
-    args = dp->rgvarg;
+    assert(argn < sizeof(args)/sizeof(*args));
 
-    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;
-            }
-        }
+    for(i=0; i < argn; i++) {
+        if(V_VT(dp->rgvarg+dp->cArgs-i-1) == (VT_BYREF|VT_VARIANT))
+            args[i] = *V_VARIANTREF(dp->rgvarg+dp->cArgs-i-1);
+        else
+            args[i] = dp->rgvarg[dp->cArgs-i-1];
     }
 
     return prop->proc(This, args, dp->cArgs, res);




More information about the wine-cvs mailing list