[JSC] Do not use asArrayModes() with Structures because it discards TypedArray inform...
[WebKit-https.git] / JSTests / stress / function-configurable-properties.js
1 function shouldBe(actual, expected) {
2     if (actual !== expected)
3         throw new Error("Failed assertion: actual " + actual + " should be " + expected);
4 }
5 function shouldNotBe(actual, expected) {
6     if (actual === expected)
7         throw new Error("Failed assertion: actual " + actual + " should not be " + expected);
8 }
9
10 function readX(f) {
11     return f.x;
12 }
13 noInline(readX);
14
15 function readY(f) {
16     return f.y;
17 }
18 noInline(readY);
19
20 var lazyPropNames = [ "name", "length" ];
21
22 function test(propName, foo) {
23     foo.x = 20;
24     for (var i = 0; i < 1000; i++)
25         shouldBe(readX(foo), 20);
26
27     // Reify the lazy property.
28     var propValue = foo[propName];
29
30     // Verify that we can still access the property after the reification of foo.name.
31     for (var i = 0; i < 1000; i++)
32         shouldBe(readX(foo), 20);
33
34     foo.y = 25;
35     for (var i = 0; i < 1000; i++)
36         shouldBe(readY(foo), 25);
37
38     // Verify that the property has the configurable attribute.
39     var desc = Object.getOwnPropertyDescriptor(foo, propName);
40     shouldBe(desc.configurable, true);
41     shouldBe(desc.writable, false);
42     shouldBe(desc.enumerable, false);
43     shouldBe(desc.value, propValue);
44
45     shouldBe(eval("foo[propName] = 5, foo[propName]"), propValue);
46     shouldBe(eval("foo." + propName + " = 5, foo." + propName), propValue);
47     for (var prop in foo)
48         shouldNotBe(prop, propName);
49
50     Object.defineProperty(foo, propName, {
51         value: propValue,
52         writable: true,
53         enumerable: true,
54         configurable: true
55     });
56
57     shouldBe(eval("foo[propName] = 5, foo[propName]"), 5);
58     shouldBe(eval("foo." + propName + " = 25, foo." + propName), 25);
59     var found = false;
60     for (var prop in foo) {
61         if (prop === propName) {
62             found = true;
63             break;
64         }
65     }
66     shouldBe(found, true);
67     
68     shouldBe(eval("delete foo." + propName), true);
69
70     delete foo.y;
71     shouldBe(foo.y, undefined);
72 }
73
74 function runTest() {
75     for (var i = 0; i < lazyPropNames.length; i++)
76         test(lazyPropNames[i], new Function(""));
77 }
78
79 runTest();