Fix Proxy tests

This commit is contained in:
Alexey Shvayka 2020-04-19 00:05:38 +03:00 committed by Rick Waldron
parent fe0d4dc781
commit 1394a4f33e
2 changed files with 88 additions and 31 deletions

View File

@ -3,25 +3,55 @@
/*--- /*---
esid: sec-getfunctionrealm esid: sec-getfunctionrealm
description: > description: >
The realm of a proxy exotic object is the realm of its target function. The realm of a Proxy exotic object is the realm of its target function.
GetFunctionRealm is called recursively. GetFunctionRealm is called recursively.
info: | info: |
7.3.22 GetFunctionRealm ( obj ) Boolean ( value )
[...]
3. Let O be ? OrdinaryCreateFromConstructor(NewTarget, "%Boolean.prototype%", « [[BooleanData]] »).
[...]
5. Return O.
OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )
[...]
2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto).
3. Return OrdinaryObjectCreate(proto, internalSlotsList).
GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )
[...]
3. Let proto be ? Get(constructor, "prototype").
4. If Type(proto) is not Object, then
a. Let realm be ? GetFunctionRealm(constructor).
b. Set proto to realm's intrinsic object named intrinsicDefaultProto.
5. Return proto.
GetFunctionRealm ( obj )
[...] [...]
2. If obj has a [[Realm]] internal slot, then 2. If obj has a [[Realm]] internal slot, then
a. Return obj.[[Realm]]. a. Return obj.[[Realm]].
[...] [...]
4. If obj is a Proxy exotic object, then 4. If obj is a Proxy exotic object, then
a. If obj.[[ProxyHandler]] is null, throw a TypeError exception. [...]
b. Let proxyTarget be obj.[[ProxyTarget]]. b. Let proxyTarget be obj.[[ProxyTarget]].
c. Return ? GetFunctionRealm(proxyTarget). c. Return ? GetFunctionRealm(proxyTarget).
features: [cross-realm, Proxy] features: [cross-realm, Reflect, Proxy]
---*/ ---*/
var other = $262.createRealm().global; var realm1 = $262.createRealm().global;
var C = new other.Function(); var realm2 = $262.createRealm().global;
C.prototype = null; var realm3 = $262.createRealm().global;
var P = new Proxy(new Proxy(C, {}), {}); var realm4 = $262.createRealm().global;
assert.sameValue(Object.getPrototypeOf(new P()), other.Object.prototype); var newTarget = new realm1.Function();
newTarget.prototype = null;
var newTargetProxy = new realm2.Proxy(newTarget, {});
var newTargetProxyProxy = new realm3.Proxy(newTargetProxy, {});
var boolean = Reflect.construct(realm4.Boolean, [], newTargetProxyProxy);
assert(boolean instanceof realm1.Boolean);
assert.sameValue(Object.getPrototypeOf(boolean), realm1.Boolean.prototype);

View File

@ -3,24 +3,51 @@
/*--- /*---
esid: sec-getfunctionrealm esid: sec-getfunctionrealm
description: > description: >
The realm of a proxy exotic object is the realm of its target function The realm of a Proxy exotic object is the realm of its target function.
info: | info: |
7.3.22 GetFunctionRealm ( obj ) Array ( )
[...]
4. Let proto be ? GetPrototypeFromConstructor(newTarget, "%Array.prototype%").
5. Return ! ArrayCreate(0, proto).
OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )
[...]
2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto).
3. Return OrdinaryObjectCreate(proto, internalSlotsList).
GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )
[...]
3. Let proto be ? Get(constructor, "prototype").
4. If Type(proto) is not Object, then
a. Let realm be ? GetFunctionRealm(constructor).
b. Set proto to realm's intrinsic object named intrinsicDefaultProto.
5. Return proto.
GetFunctionRealm ( obj )
[...] [...]
2. If obj has a [[Realm]] internal slot, then 2. If obj has a [[Realm]] internal slot, then
a. Return obj.[[Realm]]. a. Return obj.[[Realm]].
[...] [...]
4. If obj is a Proxy exotic object, then 4. If obj is a Proxy exotic object, then
a. If obj.[[ProxyHandler]] is null, throw a TypeError exception. [...]
b. Let proxyTarget be obj.[[ProxyTarget]]. b. Let proxyTarget be obj.[[ProxyTarget]].
c. Return ? GetFunctionRealm(proxyTarget). c. Return ? GetFunctionRealm(proxyTarget).
features: [cross-realm, Proxy] features: [cross-realm, Reflect, Proxy]
---*/ ---*/
var other = $262.createRealm().global; var realm1 = $262.createRealm().global;
var C = new other.Function(); var realm2 = $262.createRealm().global;
C.prototype = null; var realm3 = $262.createRealm().global;
var P = new Proxy(C, {});
assert.sameValue(Object.getPrototypeOf(new P()), other.Object.prototype); var newTarget = new realm1.Function();
newTarget.prototype = false;
var newTargetProxy = new realm2.Proxy(newTarget, {});
var array = Reflect.construct(realm3.Array, [], newTargetProxy);
assert(array instanceof realm1.Array);
assert.sameValue(Object.getPrototypeOf(array), realm1.Array.prototype);