From 4bf7e4b2ce4b2c24da572c486a1063b6a4e424b3 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 20 Dec 2023 16:25:10 +0100 Subject: [PATCH] Allow for global objects with a mutable prototype chain This is required to define the ShadowRealm global object in IDL. --- index.bs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/index.bs b/index.bs index e37f560e..444c1839 100644 --- a/index.bs +++ b/index.bs @@ -9687,6 +9687,10 @@ from other interfaces. Specifically: will correspond to properties on the object itself rather than on [=interface prototype objects=]. +A [=realm=] can be defined to +have a mutable global prototype chain. +If a [=realm=] is not defined as such, the prototype of its global object can not be changed. +
Placing named properties on an object in the prototype chain @@ -11498,7 +11502,9 @@ with the [{{LegacyNoInterfaceObject}}] [=extended attribute=]. 1. Otherwise, set |proto| to |realm|.\[[Intrinsics]].[[{{%Object.prototype%}}]]. 1. Assert: Type(|proto|) is Object. 1. Let |interfaceProtoObj| be null. - 1. If |interface| is declared with the [{{Global}}] [=extended attribute=], or + 1. If |realm| [=realm/has a mutable global prototype chain=], then: + 1. Set |interfaceProtoObj| to [$OrdinaryObjectCreate$](|proto|). + 1. Otherwise, if |interface| is declared with the [{{Global}}] [=extended attribute=], or |interface| is in the set of [=inherited interfaces=] of an interface that is declared with the [{{Global}}] [=extended attribute=], then: 1. Set |interfaceProtoObj| to [$MakeBasicObject$](« \[[Prototype]], \[[Extensible]] »). @@ -11676,6 +11682,8 @@ is the concatenation of the [=interface=]'s When the \[[SetPrototypeOf]] internal method of a [=named properties object=] |O| is called with ECMAScript language value |V|, the following step is taken: + 1. If |O|'s [=associated realm=] [=realm/has a mutable global prototype chain=], + return [=?=] [$OrdinarySetPrototypeOf$](|O|, |V|). 1. Return [=?=] SetImmutablePrototype(|O|, |V|).
@@ -13494,6 +13502,8 @@ Issue: Define those properties imperatively instead. [=interface=] with the [{{Global}}] [=extended attribute=] is called with ECMAScript language value |V|, the following step is taken: + 1. If |O|'s [=associated realm=] [=realm/has a mutable global prototype chain=], + return [=?=] [$OrdinarySetPrototypeOf$](|O|, |V|). 1. Return [=?=] SetImmutablePrototype(|O|, |V|).