Piotr Caban : jscript: Added Array_slice implementation.
Alexandre Julliard
julliard at winehq.org
Tue Jul 14 10:37:24 CDT 2009
Module: wine
Branch: master
Commit: 2325e2cdb8fe9b7c7eb5de4f4be4a5f4ad3e5909
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2325e2cdb8fe9b7c7eb5de4f4be4a5f4ad3e5909
Author: Piotr Caban <piotr.caban at gmail.com>
Date: Tue Jul 14 01:36:43 2009 +0200
jscript: Added Array_slice implementation.
---
dlls/jscript/array.c | 77 +++++++++++++++++++++++++++++++++++++++++++-
dlls/jscript/tests/api.js | 17 ++++++++++
2 files changed, 92 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index e5d6b2d..9b43142 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -421,8 +421,81 @@ static HRESULT Array_shift(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS
static HRESULT Array_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ DispatchEx *arr;
+ VARIANT v;
+ DOUBLE range;
+ DWORD length, start, end, idx;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(is_class(dispex, JSCLASS_ARRAY)) {
+ length = ((ArrayInstance*)dispex)->length;
+ }else {
+ FIXME("not Array this\n");
+ return E_NOTIMPL;
+ }
+
+ if(arg_cnt(dp)) {
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(V_VT(&v) == VT_I4)
+ range = V_I4(&v);
+ else
+ range = floor(V_R8(&v));
+
+ if(-range>length || isnan(range)) start = 0;
+ else if(range < 0) start = range+length;
+ else if(range <= length) start = range;
+ else start = length;
+ }
+ else start = 0;
+
+ if(arg_cnt(dp)>1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(V_VT(&v) == VT_I4)
+ range = V_I4(&v);
+ else
+ range = floor(V_R8(&v));
+
+ if(-range>length) end = 0;
+ else if(range < 0) end = range+length;
+ else if(range <= length) end = range;
+ else end = length;
+ }
+ else end = length;
+
+ hres = create_array(dispex->ctx, (end>start)?end-start:0, &arr);
+ if(FAILED(hres))
+ return hres;
+
+ for(idx=start; idx<end; idx++) {
+ hres = jsdisp_propget_idx(dispex, idx, lcid, &v, ei, sp);
+ if(hres == DISP_E_UNKNOWNNAME)
+ continue;
+
+ if(SUCCEEDED(hres))
+ hres = jsdisp_propput_idx(arr, idx-start, lcid, &v, ei, sp);
+
+ if(FAILED(hres)) {
+ jsdisp_release(arr);
+ return hres;
+ }
+ }
+
+ if(retv) {
+ V_VT(retv) = VT_DISPATCH;
+ V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(arr);
+ }
+ else
+ jsdisp_release(arr);
+
+ return S_OK;
}
static HRESULT sort_cmp(script_ctx_t *ctx, DispatchEx *cmp_func, VARIANT *v1, VARIANT *v2, jsexcept_t *ei,
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 7e3df38..1e3a6dc 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -524,6 +524,23 @@ tmp = arr.concat([2]);
ok(tmp.length === 3, "tmp.length = " + tmp.length);
ok(tmp[1] === undefined, "tmp[1] = " + tmp[1]);
+arr = [1,false,'a',null,undefined,'a'];
+ok(arr.slice(0,6).toString() === "1,false,a,,,a", "arr.slice(0,6).toString() = " + arr.slice(0,6));
+ok(arr.slice(0,6).length === 6, "arr.slice(0,6).length = " + arr.slice(0,6).length);
+ok(arr.slice().toString() === "1,false,a,,,a", "arr.slice().toString() = " + arr.slice());
+ok(arr.slice("abc").toString() === "1,false,a,,,a", "arr.slice(\"abc\").toString() = " + arr.slice("abc"));
+ok(arr.slice(3,8).toString() === ",,a", "arr.slice(3,8).toString() = " + arr.slice(3,8));
+ok(arr.slice(3,8).length === 3, "arr.slice(3,8).length = " + arr.slice(3,8).length);
+ok(arr.slice(1).toString() === "false,a,,,a", "arr.slice(1).toString() = " + arr.slice(1));
+ok(arr.slice(-2).toString() === ",a", "arr.slice(-2).toString() = " + arr.slice(-2));
+ok(arr.slice(3,1).toString() === "", "arr.slice(3,1).toString() = " + arr.slice(3,1));
+tmp = arr.slice(0,6);
+for(var i=0; i < arr.length; i++)
+ ok(arr[i] === tmp[i], "arr[" + i + "] = " + arr[i] + " expected " + tmp[i]);
+arr[12] = 2;
+ok(arr.slice(5).toString() === "a,,,,,,,2", "arr.slice(5).toString() = " + arr.slice(5).toString());
+ok(arr.slice(5).length === 8, "arr.slice(5).length = " + arr.slice(5).length);
+
var num = new Number(2);
ok(num.toString() === "2", "num(2).toString !== 2");
var num = new Number();
More information about the wine-cvs
mailing list