Module: wine Branch: master Commit: 0a15f2e02f5b61ad380f592ef6452148c118f2b8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0a15f2e02f5b61ad380f592ef6...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Oct 10 17:07:50 2017 +0200
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
---
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