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