1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
// |reftest|
// Returns the argument in the constructor to allow stamping private fields into
// arbitrary objects.
class OverrideBase {
constructor(o) {
return o;
}
};
class A extends OverrideBase {
#a = 1;
g() {
return this.#a
}
static gs(o) {
return o.#a;
}
static inca(obj) {
obj.#a++;
}
}
var obj = {};
Object.seal(obj);
new A(obj); // Add #a to obj, but not g.
assertEq('g' in obj, false);
assertEq(A.gs(obj), 1);
A.inca(obj);
assertEq(A.gs(obj), 2);
// Ensure that the object remains non-extensible
obj.h = 'hi'
assertEq('h' in obj, false);
Object.freeze(obj);
A.inca(obj); // Despite being frozen, private names are modifiable.
assertEq(A.gs(obj), 3);
assertEq(Object.isFrozen(obj), true);
var proxy = new Proxy({}, {});
assertEq(Object.isFrozen(proxy), false);
new A(proxy);
assertEq(A.gs(proxy), 1);
// Note: this doesn't exercise the non-native object
// path in TestIntegrityLevel like you might expect.
//
// For that see below.
Object.freeze(proxy);
assertEq(Object.isFrozen(proxy), true);
A.inca(proxy);
assertEq(A.gs(proxy), 2)
var target = { a: 10 };
Object.freeze(target);
new A(target);
assertEq(Object.isFrozen(target), true)
var getOwnKeys = [];
var proxy = new Proxy(target, {
getOwnPropertyDescriptor: function (target, key) {
getOwnKeys.push(key);
return Reflect.getOwnPropertyDescriptor(target, key);
},
});
Object.isFrozen(proxy);
assertEq(getOwnKeys.length, 1);
if (typeof reportCompare === 'function') reportCompare(0, 0);
|