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