Piotr Caban : jscript: Added Array length setting implementation.

Alexandre Julliard julliard at winehq.org
Tue Jul 14 10:37:21 CDT 2009


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

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Tue Jul 14 02:06:59 2009 +0200

jscript: Added Array length setting implementation.

---

 dlls/jscript/array.c      |   28 ++++++++++++++++++++++++++++
 dlls/jscript/dispex.c     |   16 ++++++++++++++++
 dlls/jscript/jscript.h    |    1 +
 dlls/jscript/tests/api.js |    7 +++++++
 4 files changed, 52 insertions(+), 0 deletions(-)

diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index 75d3871..6db4d89 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -16,6 +16,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include <math.h>
+
 #include "jscript.h"
 
 #include "wine/debug.h"
@@ -60,6 +62,32 @@ static HRESULT Array_length(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
         V_VT(retv) = VT_I4;
         V_I4(retv) = This->length;
         break;
+    case DISPATCH_PROPERTYPUT: {
+        VARIANT num;
+        DOUBLE len = -1;
+        DWORD i;
+        HRESULT hres;
+
+        hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &num);
+        if(V_VT(&num) == VT_I4)
+            len = V_I4(&num);
+        else
+            len = floor(V_R8(&num));
+
+        if(len!=(DWORD)len) {
+            FIXME("Throw RangeError\n");
+            return E_FAIL;
+        }
+
+        for(i=len; i<This->length; i++) {
+            hres = jsdisp_delete_idx(dispex, i);
+            if(FAILED(hres))
+                return hres;
+        }
+
+        This->length = len;
+        break;
+    }
     default:
         FIXME("unimplemented flags %x\n", flags);
         return E_NOTIMPL;
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 01f4d49..509fb50 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -1010,3 +1010,19 @@ HRESULT disp_propget(IDispatch *disp, DISPID id, LCID lcid, VARIANT *val, jsexce
 
     return hres;
 }
+
+HRESULT jsdisp_delete_idx(DispatchEx *obj, DWORD idx)
+{
+    static const WCHAR formatW[] = {'%','d',0};
+    WCHAR buf[12];
+    dispex_prop_t *prop;
+    HRESULT hres;
+
+    sprintfW(buf, formatW, idx);
+
+    hres = find_prop_name(obj, buf, &prop);
+    if(FAILED(hres) || !prop)
+        return hres;
+
+    return delete_prop(prop);
+}
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 258f3d3..a6c34ba 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -132,6 +132,7 @@ HRESULT jsdisp_propput_idx(DispatchEx*,DWORD,LCID,VARIANT*,jsexcept_t*,IServiceP
 HRESULT jsdisp_propget_name(DispatchEx*,LPCWSTR,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
 HRESULT jsdisp_propget_idx(DispatchEx*,DWORD,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
 HRESULT jsdisp_get_id(DispatchEx*,const WCHAR*,DWORD,DISPID*);
+HRESULT jsdisp_delete_idx(DispatchEx*,DWORD);
 
 HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const builtin_info_t*,DWORD,
         DispatchEx*,DispatchEx**);
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index db03fdb..a6895e3 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -494,6 +494,13 @@ ok(arr.sort() === arr, "arr.sort() !== arr");
 for(var i=0; i < arr.length; i++)
     ok(arr[i] === tmp[i], "arr[" + i + "] = " + arr[i] + " expected " + tmp[i]);
 
+arr = ["1", "2", "3"];
+arr.length = 1;
+ok(arr.length === 1, "arr.length = " + arr.length);
+arr.length = 3;
+ok(arr.length === 3, "arr.length = " + arr.length);
+ok(arr.toString() === "1,,", "arr.toString() = " + arr.toString());
+
 ok(arr.valueOf === Object.prototype.valueOf, "arr.valueOf !== Object.prototype.valueOf");
 ok(arr === arr.valueOf(), "arr !== arr.valueOf");
 




More information about the wine-cvs mailing list