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>
This commit is contained in:
Piotr Caban 2017-10-10 17:07:50 +02:00 committed by Alexandre Julliard
parent cfcc0dda15
commit 0a15f2e02f
2 changed files with 54 additions and 3 deletions

View File

@ -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},

View File

@ -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