Jacek Caban : jscript: Add Object.isExtensible implementation.
Alexandre Julliard
julliard at winehq.org
Thu Apr 1 16:09:30 CDT 2021
Module: wine
Branch: master
Commit: 7dadcaf81904265ea76055cb12fe7577922e8c36
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7dadcaf81904265ea76055cb12fe7577922e8c36
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Apr 1 18:18:47 2021 +0200
jscript: Add Object.isExtensible implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/object.c | 22 ++++++++++++++++++++++
dlls/mshtml/tests/es5.js | 15 +++++++++++++++
2 files changed, 37 insertions(+)
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c
index da91b744128..8ff040853ef 100644
--- a/dlls/jscript/object.c
+++ b/dlls/jscript/object.c
@@ -693,12 +693,34 @@ static HRESULT Object_preventExtensions(script_ctx_t *ctx, vdisp_t *jsthis, WORD
return S_OK;
}
+static HRESULT Object_isExtensible(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
+{
+ jsdisp_t *obj;
+
+ if(!argc || !is_object_instance(argv[0]) || !get_object(argv[0])) {
+ WARN("argument is not an object\n");
+ return JS_E_OBJECT_EXPECTED;
+ }
+
+ TRACE("(%s)\n", debugstr_jsval(argv[0]));
+
+ obj = to_jsdisp(get_object(argv[0]));
+ if(!obj) {
+ FIXME("Non-JS object\n");
+ return E_NOTIMPL;
+ }
+
+ if(r) *r = jsval_bool(obj->extensible);
+ return S_OK;
+}
+
static const builtin_prop_t ObjectConstr_props[] = {
{L"create", Object_create, PROPF_ES5|PROPF_METHOD|2},
{L"defineProperties", Object_defineProperties, PROPF_ES5|PROPF_METHOD|2},
{L"defineProperty", Object_defineProperty, PROPF_ES5|PROPF_METHOD|2},
{L"getOwnPropertyDescriptor", Object_getOwnPropertyDescriptor, PROPF_ES5|PROPF_METHOD|2},
{L"getPrototypeOf", Object_getPrototypeOf, PROPF_ES5|PROPF_METHOD|1},
+ {L"isExtensible", Object_isExtensible, PROPF_ES5|PROPF_METHOD|1},
{L"keys", Object_keys, PROPF_ES5|PROPF_METHOD|1},
{L"preventExtensions", Object_preventExtensions, PROPF_ES5|PROPF_METHOD|1},
};
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index 3eccc38fada..8d38070b387 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -958,6 +958,8 @@ sync_test("preventExtensions", function() {
r = Object.preventExtensions(o);
ok(r === o, "r != o");
+ r = Object.isExtensible(o);
+ ok(r === false, "isExtensible(o) returned " + r);
function Constr() {}
o = Object.preventExtensions(new Constr());
@@ -965,8 +967,21 @@ sync_test("preventExtensions", function() {
ok(o.prop === 1, "o.prop = " + o.prop);
o.prop = 2;
ok(o.prop === 1, "o.prop = " + o.prop);
+ r = Object.isExtensible(o);
+ ok(r === false, "isExtensible(o) returned " + r);
+
+ r = Object.isExtensible({});
+ ok(r === true, "isExtensible(o) returned " + r);
+
+ try {
+ Object.isExtensible(1);
+ ok(false, "exception expected");
+ }catch(e) {
+ ok(e.name === "TypeError", "got " + e.name + " exception");
+ }
ok(Object.preventExtensions.length === 1, "Object.preventExtensions.length = " + Object.preventExtensions.length);
+ ok(Object.isExtensible.length === 1, "Object.isExtensible.length = " + Object.isExtensible.length);
});
sync_test("head_setter", function() {
More information about the wine-cvs
mailing list