vbscript: Add Array implementation.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
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_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 @@
     {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(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