Piotr Caban : vbscript: Add Array implementation.
Alexandre Julliard
julliard at winehq.org
Tue Oct 10 14:41:20 CDT 2017
Module: wine
Branch: master
Commit: 0a15f2e02f5b61ad380f592ef6452148c118f2b8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0a15f2e02f5b61ad380f592ef6452148c118f2b8
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Oct 10 17:07:50 2017 +0200
vbscript: Add Array implementation.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/vbscript/global.c | 42 +++++++++++++++++++++++++++++++++++++++---
dlls/vbscript/tests/api.vbs | 15 +++++++++++++++
2 files changed, 54 insertions(+), 3 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index 7e14776..f523820 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -1792,8 +1792,44 @@ static HRESULT Global_TypeName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt,
static HRESULT Global_Array(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
{
- FIXME("\n");
- return E_NOTIMPL;
+ SAFEARRAYBOUND bounds;
+ SAFEARRAY *sa;
+ VARIANT *data;
+ HRESULT hres;
+ unsigned i;
+
+ TRACE("arg_cnt=%u\n", args_cnt);
+
+ bounds.lLbound = 0;
+ bounds.cElements = args_cnt;
+ sa = SafeArrayCreate(VT_VARIANT, 1, &bounds);
+ if(!sa)
+ return E_OUTOFMEMORY;
+
+ hres = SafeArrayAccessData(sa, (void**)&data);
+ if(FAILED(hres)) {
+ SafeArrayDestroy(sa);
+ return hres;
+ }
+
+ for(i=0; i<args_cnt; i++) {
+ hres = VariantCopyInd(data+i, arg+i);
+ if(FAILED(hres)) {
+ SafeArrayUnaccessData(sa);
+ SafeArrayDestroy(sa);
+ return hres;
+ }
+ }
+ SafeArrayUnaccessData(sa);
+
+ if(res) {
+ V_VT(res) = VT_ARRAY|VT_VARIANT;
+ V_ARRAY(res) = sa;
+ }else {
+ SafeArrayDestroy(sa);
+ }
+
+ return S_OK;
}
static HRESULT Global_Erase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
@@ -2272,7 +2308,7 @@ static const builtin_prop_t global_props[] = {
{DISPID_GLOBAL_DATEDIFF, Global_DateDiff, 0, 3, 5},
{DISPID_GLOBAL_DATEPART, Global_DatePart, 0, 2, 4},
{DISPID_GLOBAL_TYPENAME, Global_TypeName, 0, 1},
- {DISPID_GLOBAL_ARRAY, Global_Array, 0, 1},
+ {DISPID_GLOBAL_ARRAY, Global_Array, 0, 0, MAXDWORD},
{DISPID_GLOBAL_ERASE, Global_Erase, 0, 1},
{DISPID_GLOBAL_FILTER, Global_Filter, 0, 2, 4},
{DISPID_GLOBAL_JOIN, Global_Join, 0, 1, 2},
diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs
index f6b6f69..95ef84f 100644
--- a/dlls/vbscript/tests/api.vbs
+++ b/dlls/vbscript/tests/api.vbs
@@ -212,6 +212,21 @@ arr(0) = 2
arr(1) = 3
Call ok(not isNumeric(arr), "isNumeric(arr) is not true?")
+Call ok(getVT(Array()) = "VT_ARRAY|VT_VARIANT", "getVT(Array()) = " & getVT(Array()))
+x = Array("a1", 2, "a3")
+Call ok(getVT(x) = "VT_ARRAY|VT_VARIANT*", "getVT(array) = " & getVT(x))
+Call ok(getVT(x(0)) = "VT_BSTR*", "getVT(array(0)) = " & getVT(x(0)))
+Call ok(x(0) = "a1", "array(0) = " & x(0))
+Call ok(getVT(x(1)) = "VT_I2*", "getVT(array(1)) = " & getVT(x(1)))
+Call ok(x(1) = 2, "array(1) = " & x(1))
+Call ok(getVT(x(2)) = "VT_BSTR*", "getVT(array(2)) = " & getVT(x(2)))
+Call ok(x(2) = "a3", "array(2) = " & x(2))
+
+Dim new_array
+new_array = x
+x(0) = "new value"
+Call ok(new_array(0) = "a1", "new_array(0) = " & new_array(0))
+
Dim newObject
Set newObject = New ValClass
newObject.myval = 1
More information about the wine-cvs
mailing list