[JSC] Do not use asArrayModes() with Structures because it discards TypedArray inform...
[WebKit-https.git] / JSTests / stress / get-by-id-direct.js
1 var createBuiltin = $vm.createBuiltin;
2
3 function shouldBe(actual, expected) {
4     if (actual !== expected)
5         throw new Error('bad value: ' + actual);
6 }
7
8 function shouldThrow(func, errorMessage) {
9     var errorThrown = false;
10     var error = null;
11     try {
12         func();
13     } catch (e) {
14         errorThrown = true;
15         error = e;
16     }
17     if (!errorThrown)
18         throw new Error('not thrown');
19     if (String(error) !== errorMessage)
20         throw new Error(`bad error: ${String(error)}`);
21 }
22
23 (function () {
24     var builtin = createBuiltin(`(function (obj) {
25         return @getByIdDirect(obj, "hello");
26     })`);
27     noInline(builtin);
28
29     var obj = { hello: 42, world:33 };
30     for (var i = 0; i < 1e4; ++i)
31         shouldBe(builtin(obj), 42);
32
33     var obj2 = { hello: 22 };
34     for (var i = 0; i < 1e4; ++i) {
35         shouldBe(builtin(obj), 42);
36         shouldBe(builtin(obj2), 22);
37     }
38
39     var obj3 = { };
40     for (var i = 0; i < 1e4; ++i)
41         shouldBe(builtin(obj3), undefined);
42
43     var obj4 = {
44         __proto__: { hello: 33 }
45     };
46     for (var i = 0; i < 1e4; ++i)
47         shouldBe(builtin(obj4), undefined);
48
49     var target5 = "Hello";
50     var target6 = 42;
51     var target7 = false;
52     var target8 = Symbol("Cocoa");
53     for (var i = 0; i < 1e4; ++i) {
54         shouldBe(builtin(target5), undefined);
55         shouldBe(builtin(target6), undefined);
56         shouldBe(builtin(target7), undefined);
57         shouldBe(builtin(target8), undefined);
58     }
59
60     shouldThrow(() => {
61         builtin(null);
62     }, `TypeError: null is not an object`);
63
64     shouldThrow(() => {
65         builtin(undefined);
66     }, `TypeError: undefined is not an object`);
67
68     shouldBe(builtin(obj), 42);
69     shouldBe(builtin(obj2), 22);
70     shouldBe(builtin(obj3), undefined);
71     shouldBe(builtin(obj4), undefined);
72     shouldBe(builtin(target5), undefined);
73     shouldBe(builtin(target6), undefined);
74     shouldBe(builtin(target7), undefined);
75     shouldBe(builtin(target8), undefined);
76 }());
77
78 (function () {
79     var builtin = createBuiltin(`(function (obj) {
80         return @getByIdDirect(obj, "hello");
81     })`);
82     noInline(builtin);
83
84     var obj = { };
85     for (var i = 0; i < 1e4; ++i)
86         shouldBe(builtin(obj), undefined);
87     shouldBe(builtin(obj), undefined);
88     obj.hello = 42;
89     shouldBe(builtin(obj), 42);
90 }());
91
92
93 (function () {
94     var builtin = createBuiltin(`(function (obj) {
95         return @getByIdDirect(obj, "length");
96     })`);
97     noInline(builtin);
98
99     var array = [0, 1, 2];
100     for (var i = 0; i < 1e4; ++i)
101         shouldBe(builtin(array), 3);
102     shouldBe(builtin({}), undefined);
103
104     var obj = { length:2 };
105     for (var i = 0; i < 1e4; ++i) {
106         shouldBe(builtin(array), 3);
107         shouldBe(builtin(obj), 2);
108         shouldBe(builtin("Cocoa"), 5);
109     }
110 }());