mirror of https://github.com/tc39/test262.git
Add a case for non extensible targets of proxies GetPrototypeOf (#2122)
This commit is contained in:
parent
5bd2e28406
commit
f4e60b8f20
|
@ -0,0 +1,38 @@
|
||||||
|
// Copyright (C) 2019 ta7sudan. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-proxy-object-internal-methods-and-internal-slots-getprototypeof
|
||||||
|
description: >
|
||||||
|
instanceof operator will return true if trap result is the prototype of the function.
|
||||||
|
info: |
|
||||||
|
Runtime Semantics: InstanceofOperator ( V, target )
|
||||||
|
|
||||||
|
5. Return ? OrdinaryHasInstance(target, V).
|
||||||
|
|
||||||
|
OrdinaryHasInstance ( C, O )
|
||||||
|
|
||||||
|
4. Let P be ? Get(C, "prototype").
|
||||||
|
...
|
||||||
|
6. Repeat,
|
||||||
|
a. Set O to ? O.[[GetPrototypeOf]]().
|
||||||
|
b. If O is null, return false.
|
||||||
|
c. If SameValue(P, O) is true, return true.
|
||||||
|
|
||||||
|
[[GetPrototypeOf]] ( )
|
||||||
|
|
||||||
|
7. Let handlerProto be ? Call(trap, handler, « target »).
|
||||||
|
8. If Type(handlerProto) is neither Object nor Null, throw a TypeError exception.
|
||||||
|
9. Let extensibleTarget be ? IsExtensible(target).
|
||||||
|
10. If extensibleTarget is true, return handlerProto.
|
||||||
|
features: [Proxy]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
function Custom() {}
|
||||||
|
|
||||||
|
var p = new Proxy({}, {
|
||||||
|
getPrototypeOf() {
|
||||||
|
return Custom.prototype;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert(p instanceof Custom);
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright (C) 2019 ta7sudan. All rights reserved.
|
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
|
||||||
/*---
|
|
||||||
esid: sec-proxy-object-internal-methods-and-internal-slots-getprototypeof
|
|
||||||
description: >
|
|
||||||
instanceof operator will return true if trap result is the prototype of
|
|
||||||
the function.
|
|
||||||
features: [Proxy]
|
|
||||||
---*/
|
|
||||||
|
|
||||||
function CustomClass() {}
|
|
||||||
|
|
||||||
var p = new Proxy({}, {
|
|
||||||
getPrototypeOf: function() {
|
|
||||||
return CustomClass.prototype;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
assert(p instanceof CustomClass, 'Expected p to be the instance of CustomClass, but was not.');
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-proxy-object-internal-methods-and-internal-slots-getprototypeof
|
||||||
|
description: >
|
||||||
|
instanceof operator observes the TypeError from a custom trap result that would return true if
|
||||||
|
the target were extensible.
|
||||||
|
info: |
|
||||||
|
Runtime Semantics: InstanceofOperator ( V, target )
|
||||||
|
|
||||||
|
5. Return ? OrdinaryHasInstance(target, V).
|
||||||
|
|
||||||
|
OrdinaryHasInstance ( C, O )
|
||||||
|
|
||||||
|
4. Let P be ? Get(C, "prototype").
|
||||||
|
...
|
||||||
|
6. Repeat,
|
||||||
|
a. Set O to ? O.[[GetPrototypeOf]]().
|
||||||
|
b. If O is null, return false.
|
||||||
|
c. If SameValue(P, O) is true, return true.
|
||||||
|
|
||||||
|
[[GetPrototypeOf]] ( )
|
||||||
|
|
||||||
|
7. Let handlerProto be ? Call(trap, handler, « target »).
|
||||||
|
8. If Type(handlerProto) is neither Object nor Null, throw a TypeError exception.
|
||||||
|
9. Let extensibleTarget be ? IsExtensible(target).
|
||||||
|
10. If extensibleTarget is true, return handlerProto.
|
||||||
|
11. Let targetProto be ? target.[[GetPrototypeOf]]().
|
||||||
|
12. If SameValue(handlerProto, targetProto) is false, throw a TypeError exception.
|
||||||
|
features: [Proxy]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
function Custom() {}
|
||||||
|
|
||||||
|
var target = {};
|
||||||
|
|
||||||
|
var p = new Proxy(target, {
|
||||||
|
getPrototypeOf() {
|
||||||
|
return Custom.prototype;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.preventExtensions(target);
|
||||||
|
|
||||||
|
assert.throws(TypeError, () => {
|
||||||
|
p instanceof Custom
|
||||||
|
});
|
Loading…
Reference in New Issue