Piotr Caban : jscript: Added implementation of Array.reverse.

Alexandre Julliard julliard at winehq.org
Mon Jan 18 10:58:52 CST 2010


Module: wine
Branch: master
Commit: 6f61893685b466357f264a367503cee183f39352
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6f61893685b466357f264a367503cee183f39352

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Jan 15 08:17:30 2010 +0100

jscript: Added implementation of Array.reverse.

---

 dlls/jscript/array.c      |   37 +++++++++++++++++++++++++++++++++++--
 dlls/jscript/tests/api.js |   26 ++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index 873ab6e..bb54493 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -469,8 +469,41 @@ static HRESULT Array_push(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPAR
 static HRESULT Array_reverse(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    DispatchEx *jsthis;
+    DWORD length, k, l;
+    VARIANT v1, v2;
+    HRESULT hres1, hres2;
+
+    TRACE("\n");
+
+    hres1 = get_length(ctx, vthis, ei, &jsthis, &length);
+    if(FAILED(hres1))
+        return hres1;
+
+    for(k=0; k<length/2; k++) {
+        l = length-k-1;
+
+        hres1 = jsdisp_propget_idx(jsthis, k, &v1, ei, sp);
+        hres2 = jsdisp_propget_idx(jsthis, l, &v2, ei, sp);
+
+        if(hres1 == DISP_E_UNKNOWNNAME)
+            jsdisp_delete_idx(jsthis, l);
+        else
+            jsdisp_propput_idx(jsthis, l, &v1, ei, sp);
+
+        if(hres2 == DISP_E_UNKNOWNNAME)
+            jsdisp_delete_idx(jsthis, k);
+        else
+            jsdisp_propput_idx(jsthis, k, &v2, ei, sp);
+    }
+
+    if(retv) {
+        V_VT(retv) = VT_DISPATCH;
+        V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(jsthis);
+        IDispatch_AddRef(V_DISPATCH(retv));
+    }
+
+    return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.4.4.9 */
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 7ad2984..69deab2 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -688,6 +688,31 @@ ok(arr.valueOf === Object.prototype.valueOf, "arr.valueOf !== Object.prototype.v
 ok(arr === arr.valueOf(), "arr !== arr.valueOf");
 
 arr = [1,2,3];
+tmp = arr.reverse();
+ok(tmp === arr, "tmp !== arr");
+ok(arr.length === 3, "arr.length = " + arr.length);
+ok(arr.toString() === "3,2,1", "arr.toString() = " + arr.toString());
+
+arr = [];
+arr[3] = 5;
+arr[5] = 1;
+tmp = arr.reverse();
+ok(tmp === arr, "tmp !== arr");
+ok(arr.length === 6, "arr.length = " + arr.length);
+ok(arr.toString() === "1,,5,,,", "arr.toString() = " + arr.toString());
+
+arr = new Object();
+arr.length = 3;
+arr[0] = "aa";
+arr[2] = 2;
+arr[7] = 3;
+arr.reverse = Array.prototype.reverse;
+tmp = arr.reverse();
+ok(tmp === arr, "tmp !== arr");
+ok(arr.length === 3, "arr.length = " + arr.length);
+ok(arr[0] === 2 && arr[1] === undefined && arr[2] === "aa", "unexpected array");
+
+arr = [1,2,3];
 tmp = arr.unshift(0);
 ok(tmp === (invokeVersion < 2 ? undefined : 4), "[1,2,3].unshift(0) returned " +tmp);
 ok(arr.length === 4, "arr.length = " + arr.length);
@@ -1854,6 +1879,7 @@ testArrayHostThis("shift");
 testArrayHostThis("slice");
 testArrayHostThis("splice");
 testArrayHostThis("unshift");
+testArrayHostThis("reverse");
 
 function testObjectInherit(obj, constr, ts, tls, vo) {
     ok(obj instanceof Object, "obj is not instance of Object");




More information about the wine-cvs mailing list