Jacek Caban : jscript: Add Object.getOwnPropertyNames implementation.

Alexandre Julliard julliard at winehq.org
Tue Apr 20 16:27:47 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Apr 20 19:12:07 2021 +0200

jscript: Add Object.getOwnPropertyNames implementation.

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

---

 dlls/jscript/dispex.c    |  2 +-
 dlls/jscript/jscript.h   |  1 +
 dlls/jscript/object.c    | 34 ++++++++++++++++++++++++++--------
 dlls/mshtml/tests/es5.js | 31 +++++++++++++++++++++++++++++++
 4 files changed, 59 insertions(+), 9 deletions(-)

diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 61f4df48c86..3955ed34cd2 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -2385,7 +2385,7 @@ HRESULT jsdisp_next_prop(jsdisp_t *obj, DISPID id, enum jsdisp_enum_type enum_ty
             continue;
         if(enum_type != JSDISP_ENUM_ALL && iter->type == PROP_PROTREF)
             continue;
-        if(!(get_flags(obj, iter) & PROPF_ENUMERABLE))
+        if(enum_type != JSDISP_ENUM_OWN && !(get_flags(obj, iter) & PROPF_ENUMERABLE))
             continue;
         *ret = prop_to_id(obj, iter);
         return S_OK;
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index ec2c6583682..02420349d8d 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -292,6 +292,7 @@ void jsdisp_release(jsdisp_t*) DECLSPEC_HIDDEN;
 
 enum jsdisp_enum_type {
     JSDISP_ENUM_ALL,
+    JSDISP_ENUM_OWN,
     JSDISP_ENUM_OWN_ENUMERABLE
 };
 
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c
index a47516c7710..fd5c67833d8 100644
--- a/dlls/jscript/object.c
+++ b/dlls/jscript/object.c
@@ -625,8 +625,7 @@ static HRESULT Object_getPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl
     return S_OK;
 }
 
-static HRESULT Object_keys(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
-                           unsigned argc, jsval_t *argv, jsval_t *r)
+static HRESULT object_keys(script_ctx_t *ctx, jsval_t arg, enum jsdisp_enum_type enum_type, jsval_t *r)
 {
     DISPID id = DISPID_STARTENUM;
     jsdisp_t *obj, *array;
@@ -634,14 +633,12 @@ static HRESULT Object_keys(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
     jsstr_t *key;
     HRESULT hres;
 
-    if(!argc || !is_object_instance(argv[0])) {
-        FIXME("invalid arguments %s\n", debugstr_jsval(argv[0]));
+    if(!is_object_instance(arg) || !get_object(arg)) {
+        FIXME("invalid arguments %s\n", debugstr_jsval(arg));
         return E_NOTIMPL;
     }
 
-    TRACE("(%s)\n", debugstr_jsval(argv[0]));
-
-    obj = to_jsdisp(get_object(argv[0]));
+    obj = to_jsdisp(get_object(arg));
     if(!obj) {
         FIXME("Non-JS object\n");
         return E_NOTIMPL;
@@ -652,7 +649,7 @@ static HRESULT Object_keys(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
         return hres;
 
     do {
-        hres = jsdisp_next_prop(obj, id, JSDISP_ENUM_OWN_ENUMERABLE, &id);
+        hres = jsdisp_next_prop(obj, id, enum_type, &id);
         if(hres != S_OK)
             break;
 
@@ -671,6 +668,26 @@ static HRESULT Object_keys(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
     return hres;
 }
 
+static HRESULT Object_keys(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
+                           unsigned argc, jsval_t *argv, jsval_t *r)
+{
+    jsval_t arg = argc ? argv[0] : jsval_undefined();
+
+    TRACE("(%s)\n", debugstr_jsval(arg));
+
+    return object_keys(ctx, arg, JSDISP_ENUM_OWN_ENUMERABLE, r);
+}
+
+static HRESULT Object_getOwnPropertyNames(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
+                                          unsigned argc, jsval_t *argv, jsval_t *r)
+{
+    jsval_t arg = argc ? argv[0] : jsval_undefined();
+
+    TRACE("(%s)\n", debugstr_jsval(arg));
+
+    return object_keys(ctx, arg, JSDISP_ENUM_OWN, r);
+}
+
 static HRESULT Object_preventExtensions(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 {
     jsdisp_t *obj;
@@ -810,6 +827,7 @@ static const builtin_prop_t ObjectConstr_props[] = {
     {L"defineProperty",           Object_defineProperty,              PROPF_ES5|PROPF_METHOD|2},
     {L"freeze",                   Object_freeze,                      PROPF_ES5|PROPF_METHOD|1},
     {L"getOwnPropertyDescriptor", Object_getOwnPropertyDescriptor,    PROPF_ES5|PROPF_METHOD|2},
+    {L"getOwnPropertyNames",      Object_getOwnPropertyNames,         PROPF_ES5|PROPF_METHOD|1},
     {L"getPrototypeOf",           Object_getPrototypeOf,              PROPF_ES5|PROPF_METHOD|1},
     {L"isExtensible",             Object_isExtensible,                PROPF_ES5|PROPF_METHOD|1},
     {L"isFrozen",                 Object_isFrozen,                    PROPF_ES5|PROPF_METHOD|1},
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index 474c09d3bd7..7e46848d40e 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -892,9 +892,40 @@ sync_test("keys", function() {
     keys = Object.keys(o).sort().join();
     ok(keys === "test", "keys = " + keys);
 
+    Object.defineProperty(o, "defined", { value: 3, enumerable: false });
+    keys = Object.keys(o).sort().join();
+    ok(keys === "test", "keys = " + keys);
+
+    keys = Object.keys([]).sort().join();
+    ok(keys === "", "keys([]) = " + keys);
+
     ok(Object.keys.length === 1, "Object.keys.length = " + Object.keys.length);
 });
 
+sync_test("getOwnPropertyNames", function() {
+    var o = { a: 1, b: 2, c: 3 };
+    var names = Object.getOwnPropertyNames(o).sort().join();
+    ok(names === "a,b,c", "names = " + names);
+
+    o = Object.create(o);
+    names = Object.getOwnPropertyNames(o).sort().join();
+    ok(names === "", "names = " + names);
+
+    o.test = 1;
+    names = Object.getOwnPropertyNames(o).sort().join();
+    ok(names === "test", "names = " + names);
+
+    Object.defineProperty(o, "defined", { value: 3, enumerable: false });
+    names = Object.getOwnPropertyNames(o).sort().join();
+    ok(names === "defined,test", "names = " + names);
+
+    names = Object.getOwnPropertyNames([]).sort().join();
+    todo_wine.
+    ok(names === "length", "names = " + names);
+
+    ok(Object.getOwnPropertyNames.length === 1, "Object.getOwnPropertyNames.length = " + Object.getOwnPropertyNames.length);
+});
+
 sync_test("reduce", function() {
     var r, array;
 




More information about the wine-cvs mailing list