JavaScriptCore bytecompiler does not compute scope depth correctly
[WebKit-https.git] / LayoutTests / fast / js / resources / const.js
1 description(
2 "This test checks that const declarations in JavaScript work and are readonly."
3 );
4
5
6 shouldThrow("const redef='a'; const redef='a';");
7
8 const x = "RIGHT";
9 x = "WRONG";
10 shouldBe("x", '"RIGHT"');
11
12 const z = "RIGHT", y = "RIGHT";
13 y = "WRONG";
14 shouldBe("y", '"RIGHT"');
15
16 const one = 1;
17
18 var a;
19
20 // PostIncResolveNode
21 a = one++;
22 shouldBe("a", "1");
23 shouldBe("one", "1");
24
25 // PostDecResolveNode
26 a = one--;
27 shouldBe("a", "1");
28 shouldBe("one", "1");
29
30 // PreIncResolveNode
31 a = ++one;
32 shouldBe("a", "2");
33 shouldBe("one", "1");
34
35 // PreDecResolveNode
36 a = --one;
37 shouldBe("a", "0");
38 shouldBe("one", "1");
39
40 // ReadModifyConstNode
41 a = one += 2;
42 shouldBe("a", "3");
43 shouldBe("one", "1");
44
45 // AssignConstNode
46 a = one = 2;
47 shouldBe("a", "2");
48 shouldBe("one", "1");
49
50 // PostIncResolveNode
51 shouldBe("function f() { const one = 1; one++; return one; } f();", "1");
52 shouldBe("function f() { const oneString = '1'; return oneString++; } f();", "1");
53 shouldBe("function f() { const one = 1; return one++; } f();", "1");
54
55 // PostDecResolveNode
56 shouldBe("function f() { const one = 1; one--; return one; } f();", "1");
57 shouldBe("function f() { const oneString = '1'; return oneString--; } f();", "1");
58 shouldBe("function f() { const one = 1; return one--; } f();", "1");
59
60 // PreIncResolveNode
61 shouldBe("function f() { const one = 1; ++one; return one; } f();", "1");
62 shouldBe("function f() { const one = 1; return ++one; } f();", "2");
63
64 // PreDecResolveNode
65 shouldBe("function f() { const one = 1; --one; return one; } f();", "1");
66 shouldBe("function f() { const one = 1; return --one; } f();", "0");
67
68 // ReadModifyConstNode
69 shouldBe("function f() { const one = 1; one += 2; return one; } f();", "1");
70 shouldBe("function f() { const one = 1; return one += 2; } f();", "3");
71
72 // AssignConstNode
73 shouldBe("function f() { const one = 1; one = 2; return one; } f();", "1");
74 shouldBe("function f() { const one = 1; return one = 2; } f();", "2");
75
76 // PostIncResolveNode
77 shouldBe("one++", "1");
78 shouldBe("one", "1");
79
80 // PostDecResolveNode
81 shouldBe("one--", "1");
82 shouldBe("one", "1");
83
84 // PreIncResolveNode
85 shouldBe("++one", "2");
86 shouldBe("one", "1");
87
88 // PreDecResolveNode
89 shouldBe("--one", "0");
90 shouldBe("one", "1");
91
92 // ReadModifyConstNode
93 shouldBe("one += 1", "2");
94 shouldBe("one", "1");
95
96 // AssignConstNode
97 shouldBe("one = 2", "2");
98 shouldBe("one", "1");
99
100 var object = { inWith1: "RIGHT", inWith2: ""}
101 with (object) {
102     const inWith1 = "WRONG";
103     const inWith2 = "RIGHT";
104     inWith2 = "WRONG";
105 }
106 shouldBe("object.inWith1", "'RIGHT'");
107 shouldBe("inWith2", "'RIGHT'");
108
109 shouldBe("(function(){ one = 2; return one; })()", "1")
110 var f = function g() { g="FAIL"; return g; };
111 shouldBe("f()", "f");
112
113 shouldBe("const a;", "undefined");
114
115 // Make sure we don't override properties placed on the global object
116 var ranConstInitialiser = false;
117 const bodyId = (ranConstInitialiser = true, "Const initialiser overwrote existing property");
118 shouldBe("bodyId", "document.getElementById('bodyId')");
119 shouldBeTrue("ranConstInitialiser");
120
121 // Make sure that dynamic scopes (catch, with) don't break const declarations
122 function tryCatch1() {
123     var bar;
124     eval("try {\
125         stuff();\
126     } catch (e) {\
127         print(\"here.\");\
128         const bar = 5;\
129     }");
130     return bar;
131 }
132
133 function tryCatch2() {
134     var bar;
135     try {
136         stuff();
137     } catch (e) {
138         print("here.");
139         const bar = 5;
140     }
141     return bar;
142 }
143
144 tryCatch1Result = tryCatch1();
145 shouldBe("tryCatch1Result", "5");
146 tryCatch2Result = tryCatch2();
147 shouldBe("tryCatch2Result", "5");
148
149 function with1() {
150     var bar;
151     eval("with({foo:42}) const bar = 5;");
152     return bar;
153 }
154
155 function with2() {
156     var bar;
157     with({foo:42}) const bar = 5;
158     return bar;
159 }
160
161 with1Result = with1();
162 shouldBe("with1Result", "5");
163 with2Result = with2();
164 shouldBe("with2Result", "5");
165
166 var successfullyParsed = true;