From 7dadcaf81904265ea76055cb12fe7577922e8c36 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 1 Apr 2021 18:18:47 +0200 Subject: [PATCH] jscript: Add Object.isExtensible implementation. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- 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() {