Module: wine Branch: master Commit: 41d7f8fc4686c85a4e2aabcd1c2d91611aec34a5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=41d7f8fc4686c85a4e2aabcd1c...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Oct 18 18:47:56 2010 +0200
jscript: Added VBArray.getItem() implementation.
---
dlls/jscript/tests/api.js | 5 +++++ dlls/jscript/vbarray.c | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 07fa59b..d891fba 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -1904,6 +1904,8 @@ exception_test(function() {new VBArray(new VBArray(createArray()));}, "TypeError exception_test(function() {(new VBArray(createArray())).lbound("aaa");}, "RangeError", -2146828279); exception_test(function() {(new VBArray(createArray())).lbound(3);}, "RangeError", -2146828279); exception_test(function() {tmp = new Object(); tmp.lb = VBArray.prototype.lbound; tmp.lb();}, "TypeError", -2146823275); +exception_test(function() {tmp = new Object(); tmp.lb = VBArray.prototype.lbound; tmp.lb();}, "TypeError", -2146823275); +exception_test(function() {(new VBArray(createArray())).getItem(3);}, "RangeError", -2146828279);
function testThisExcept(func, number) { exception_test(function() {func.call(new Object())}, "TypeError", number); @@ -2259,5 +2261,8 @@ ok(tmp.lbound(1) == 0, "tmp.lbound(1) = " + tmp.lbound(1)); ok(tmp.lbound(2, 1) == 2, "tmp.lbound(2, 1) = " + tmp.lbound(2, 1)); ok(tmp.ubound() == 4, "tmp.ubound() = " + tmp.ubound()); ok(tmp.ubound("2") == 3, "tmp.ubound("2") = " + tmp.ubound("2")); +ok(tmp.getItem(1, 2) == 3, "tmp.getItem(1, 2) = " + tmp.getItem(1, 2)); +ok(tmp.getItem(2, 3) == 33, "tmp.getItem(2, 3) = " + tmp.getItem(2, 3)); +ok(tmp.getItem(3, 2) == 13, "tmp.getItem(3, 2) = " + tmp.getItem(3, 2));
reportSuccess(); diff --git a/dlls/jscript/vbarray.c b/dlls/jscript/vbarray.c index 2ad3db1..887e19b 100644 --- a/dlls/jscript/vbarray.c +++ b/dlls/jscript/vbarray.c @@ -63,8 +63,41 @@ static HRESULT VBArray_dimensions(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, static HRESULT VBArray_getItem(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VBArrayInstance *vbarray; + int i, *indexes, size; + VARIANT out; + HRESULT hres; + + TRACE("\n"); + + vbarray = vbarray_this(vthis); + if(!vbarray) + return throw_type_error(ctx, ei, IDS_NOT_VBARRAY, NULL); + + size = arg_cnt(dp); + if(size < SafeArrayGetDim(vbarray->safearray)) + return throw_range_error(ctx, ei, IDS_SUBSCRIPT_OUT_OF_RANGE, NULL); + + indexes = heap_alloc(sizeof(int)*size); + for(i=0; i<size; i++) { + hres = to_int32(ctx, get_arg(dp, i), ei, indexes+i); + if(FAILED(hres)) { + heap_free(indexes); + return hres; + } + } + + hres = SafeArrayGetElement(vbarray->safearray, indexes, (void*)&out); + heap_free(indexes); + if(hres == DISP_E_BADINDEX) + return throw_range_error(ctx, ei, IDS_SUBSCRIPT_OUT_OF_RANGE, NULL); + else if(FAILED(hres)) + return hres; + + if(retv) + hres = VariantCopy(retv, &out); + + return hres; }
static HRESULT VBArray_lbound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,