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