[JSC] AI should not propagate AbstractValue relying on constant folding phase
[WebKit-https.git] / JSTests / stress / custom-get-set-inline-caching-one-level-up-proto-chain.js
1 var createCustomTestGetterSetter = $vm.createCustomTestGetterSetter;
2
3 function assert(b, m) {
4     if (!b)
5         throw new Error("Bad:" + m);
6 }
7
8 class Class { };
9
10 let items = [
11     new Class,
12     new Class,
13     new Class,
14     new Class,
15 ];
16
17 let customGetterSetter = createCustomTestGetterSetter();
18 items.forEach((x) => {
19     x.__proto__ = customGetterSetter;
20     assert(x.__proto__ === customGetterSetter);
21 });
22
23 function validate(x, valueResult, accessorResult) {
24     assert(x.customValue === valueResult);
25
26     assert(x.customAccessor === accessorResult);
27
28     let o = {};
29     x.customValue = o;
30     assert(o.result === valueResult);
31
32     o = {};
33     x.customAccessor = o;
34     assert(o.result === accessorResult);
35
36     assert(x.randomProp === 42 || x.randomProp === undefined);
37 }
38 noInline(validate);
39
40
41 let start = Date.now();
42 for (let i = 0; i < 10000; ++i) {
43     for (let i = 0; i < items.length; ++i) {
44         validate(items[i], customGetterSetter, items[i]);
45     }
46 }
47
48 customGetterSetter.randomProp = 42;
49
50 for (let i = 0; i < 10000; ++i) {
51     for (let i = 0; i < items.length; ++i) {
52         validate(items[i], customGetterSetter, items[i]);
53     }
54 }
55
56 items.forEach((x) => {
57     Reflect.setPrototypeOf(x, {
58         get customValue() { return 42; },
59         get customAccessor() { return 22; },
60         set customValue(x) { x.result = 42; },
61         set customAccessor(x) { x.result = 22; },
62     });
63 });
64
65 for (let i = 0; i < 10000; ++i) {
66     for (let i = 0; i < items.length; ++i) {
67         validate(items[i], 42, 22);
68     }
69 }