Jacek Caban : jscript: Added Array.isArray implementation.

Alexandre Julliard julliard at winehq.org
Thu Mar 1 13:34:45 CST 2018


Module: wine
Branch: master
Commit: 3bd3d559ce88d7b4198575bf640331e6e5b1ef0c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3bd3d559ce88d7b4198575bf640331e6e5b1ef0c

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Mar  1 19:19:01 2018 +0100

jscript: Added Array.isArray implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/array.c              | 35 ++++++++++++++++++++++++++++++++++-
 dlls/mshtml/tests/documentmode.js |  1 +
 dlls/mshtml/tests/es5.js          | 21 ++++++++++++++++++++-
 3 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index d17b605..b0deca0 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -1079,6 +1079,24 @@ static const builtin_info_t ArrayInst_info = {
     Array_on_put
 };
 
+/* ECMA-262 5.1 Edition    15.4.3.2 */
+static HRESULT ArrayConstr_isArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
+{
+    jsdisp_t *obj;
+
+    TRACE("\n");
+
+    if(!argc || !is_object_instance(argv[0])) {
+        if(r) *r = jsval_bool(FALSE);
+        return S_OK;
+    }
+
+    obj = iface_to_jsdisp(get_object(argv[0]));
+    if(r) *r = jsval_bool(obj && is_class(obj, JSCLASS_ARRAY));
+    if(obj) jsdisp_release(obj);
+    return S_OK;
+}
+
 static HRESULT ArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
         jsval_t *r)
 {
@@ -1153,6 +1171,21 @@ static HRESULT alloc_array(script_ctx_t *ctx, jsdisp_t *object_prototype, ArrayI
     return S_OK;
 }
 
+static const WCHAR isArrayW[] = {'i','s','A','r','r','a','y',0};
+
+static const builtin_prop_t ArrayConstr_props[] = {
+    {isArrayW,    ArrayConstr_isArray,    PROPF_ES5|PROPF_METHOD|1}
+};
+
+static const builtin_info_t ArrayConstr_info = {
+    JSCLASS_FUNCTION,
+    DEFAULT_FUNCTION_VALUE,
+    sizeof(ArrayConstr_props)/sizeof(*ArrayConstr_props),
+    ArrayConstr_props,
+    NULL,
+    NULL
+};
+
 HRESULT create_array_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
 {
     ArrayInstance *array;
@@ -1164,7 +1197,7 @@ HRESULT create_array_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdis
     if(FAILED(hres))
         return hres;
 
-    hres = create_builtin_constructor(ctx, ArrayConstr_value, ArrayW, NULL, PROPF_CONSTR|1, &array->dispex, ret);
+    hres = create_builtin_constructor(ctx, ArrayConstr_value, ArrayW, &ArrayConstr_info, PROPF_CONSTR|1, &array->dispex, ret);
 
     jsdisp_release(&array->dispex);
     return hres;
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index 7287bab..a506a16 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -122,6 +122,7 @@ function test_javascript() {
 
     test_exposed("JSON", g, v >= 8);
     test_exposed("now", Date, true);
+    test_exposed("isArray", Array, v >= 9);
 
     next_test();
 }
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index 3f77c05..29af64e 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -27,6 +27,25 @@ function test_date_now() {
     next_test();
 }
 
+function test_isArray() {
+    function expect_array(a, exr) {
+        var r = Array.isArray(a);
+        ok(r === exr, "isArray returned " + r + " expected " + exr);
+    }
+
+    expect_array([1], true);
+    expect_array(Array, false);
+    expect_array(new Array(), true);
+    expect_array({"1": 1, "2": 2, length: 2}, false);
+
+    function C() {}
+    C.prototype = Array.prototype;
+    expect_array(new C(), false);
+
+    next_test();
+}
+
 var tests = [
-    test_date_now
+    test_date_now,
+    test_isArray
 ];




More information about the wine-cvs mailing list