blob: 988e9709bb7a5c026823fbfd45b5bbeffb8cd73f [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00005
6function assertUndef(x) {
7 assertEquals(undefined, x);
8}
9
10
11// IfStatement [13.6.7]
12
13assertUndef(eval('42; if (true) ; else 0;')); // ES5: 42
14assertUndef(eval('42; if (true) ;')); // ES5: 42
15assertUndef(eval('42; if (false) 0;')); // ES5: 42
16
17assertEquals(1, eval('42; if (true) 1;'));
18assertEquals(1, eval('42; if (true) 1; else 0;'));
19assertEquals(0, eval('42; if (false) 1; else 0;'));
20
21
22// IterationStatement [13.7]
23
24assertUndef(eval('42; do ; while (false);')); // ES5: 42
25assertUndef(eval('42; var x = 1; do ; while (x--);')); // ES5: 42
26assertUndef(eval('42; while (false) 0;')); // ES5: 42
27assertUndef(eval('42; while (true) break;')); // ES5: 42
28assertUndef(eval('42; bla: while (true) break bla;')); // ES5: 42
29assertUndef(eval('42; var x = 1; while (x--) ;')); // ES5: 42
30assertUndef(eval('42; for (; false; ) 0;')); // ES5: 42
31assertUndef(eval('42; for (var x = 1; x; x--) ;')); // ES5: 42
32assertUndef(eval('42; for (var x in ["foo", "bar"]) ;'));
33assertUndef(eval('42; for (var x of ["foo", "bar"]) ;'));
34assertUndef(eval('42; for (let x = 1; x; x--) ;'));
35assertUndef(eval('42; for (let x in ["foo", "bar"]) ;'));
36assertUndef(eval('42; for (let x of ["foo", "bar"]) ;'));
37assertUndef(eval('42; for (const x in ["foo", "bar"]) ;'));
38assertUndef(eval('42; for (const x of ["foo", "bar"]) ;'));
39
40assertEquals(1, eval('42; var x = 10; do x--; while (x);'));
41assertEquals(1, eval('42; var x = 10; while (x) x--;'));
42assertEquals(1, eval('42; for (var x = 10; x; x--) x;'));
43assertEquals(1, eval('42; for (var x = 10; x; --x) x;'));
44assertEquals(1, eval('42; for (let x = 10; x; --x) x;'));
45assertEquals(1, eval('42; var y = 2; for (var x in ["foo", "bar"]) y--;'));
46assertEquals(1, eval('42; var y = 2; for (const x in ["foo", "bar"]) y--;'));
47assertEquals(1, eval('42; var y = 2; for (let x in ["foo", "bar"]) y--;'));
48assertEquals(1, eval('42; var y = 2; for (var x of ["foo", "bar"]) y--;'));
49assertEquals(1, eval('42; var y = 2; for (const x of ["foo", "bar"]) y--;'));
50assertEquals(1, eval('42; var y = 2; for (let x of ["foo", "bar"]) y--;'));
51
52
53// WithStatement [13.11.7]
54
55assertUndef(eval('42; with ({}) ;')); // ES5: 42
56
57assertEquals(1, eval('42; with ({}) 1;'));
58
59
60// SwitchStatement [13.12.11]
61
62assertUndef(eval('42; switch (0) {};')); // ES5: 42
63assertUndef(eval('42; switch (0) { case 1: 1; };')); // ES5: 42
64assertUndef(eval('42; switch (0) { case 0: ; };')); // ES5: 42
65assertUndef(eval('42; switch (0) { default: ; };')); // ES5: 42
66assertUndef(eval('42; switch (0) { case 0: break; }')); // ES5: 42
67
68assertEquals(1, eval('42; switch (0) { case 0: 1; }'));
69assertEquals(1, eval('42; switch (0) { case 0: 1; break; }'));
70assertEquals(1, eval('42; switch (0) { case 0: 1; case 666: break; }'));
71assertEquals(2, eval('42; switch (0) { case 0: 1; case 666: 2; break; }'));
72
73
74// TryStatement [13.15.8]
75
76assertUndef(eval('42; try { } catch(e) { };')); // ES5: 42
77assertUndef(eval('42; try { } catch(e) { 0; };')); // ES5: 42
78assertUndef(eval('42; try { throw "" } catch(e) { };')); // ES5: 42
79assertUndef(eval('42; try { throw "" } catch(e) { } finally { };')); // ES5: 42
80assertUndef(eval('42; try { } finally { 666 };')); // ES5: 42
81
82
83// Some combinations
84
85assertUndef(eval('42; switch (0) { case 0: if (true) break; }')); // ES5: 42
86assertUndef(eval('42; switch (0) { case 0: 1; if (true) ; }')); // ES5: 1
87assertUndef(eval('42; switch (0) { case 0: 1; try { break } catch(e) { }; }')); // ES5: 1
88
89assertEquals(0, eval('42; switch (0) { case 0: 0; case 1: break; }'));
90assertEquals(0, eval('42; while (1) { 0; break; }'))
91assertEquals(0, eval('42; bla: while (1) { 0; break bla; }'))
92assertEquals(0, eval('42; while (1) { with ({}) { 0; break; } }'))
93assertEquals(0, eval('42; while (1) { try { 0; break } catch(e) {666} }'))
94assertEquals(0, eval(
95 '42; while (1) { try { 0; break } catch(e) {666} finally {666} }'))
96assertEquals(0, eval(
97 '42; while (1) { try { throw "" } catch(e) {666} finally {0; break} }'))
98assertEquals(0, eval(
99 '42; while (1) { try { throw "" } catch(e) {0; break} finally {666} }'))
100assertEquals(0, eval(
101 '42; while (1) { try { 666 } finally {0; break} }'));
102assertEquals(0, eval(
103 '42; while (1) { try { 666; break } finally {0; break} }'));
104assertEquals(0, eval(
105 '42; lab: try { 666; break lab } finally {0; break lab}'));
106assertEquals(undefined, eval(
107 'var b = 1; ' +
108 'outer: while (1) { while (1) { if (b--) 42; else break outer; }; 666 }'));
109
110// The following is not what ES6 says, but see ES bug 4540.
111assertUndef(eval('42; switch (0) { case 0: 1; if (true) break; }')); // ES5: 1
112
113
114
115////////////////////////////////////////////////////////////////////////////////
116//
117// The following are copied from webkit/eval-throw-return and adapted.
118
119function throwFunc() {
120 throw "";
121}
122
123function throwOnReturn(){
124 1;
125 return throwFunc();
126}
127
128function twoFunc() {
129 2;
130}
131
132assertEquals(1, eval("1;"));
133assertUndef(eval("1; try { foo = [2,3,throwFunc(), 4]; } catch (e){}"));
134assertUndef(eval("1; try { 2; throw ''; } catch (e){}"));
135assertUndef(eval("1; try { 2; throwFunc(); } catch (e){}"));
136assertEquals(3, eval("1; try { 2; throwFunc(); } catch (e){3;} finally {}"));
137assertEquals(3, eval("1; try { 2; throwFunc(); } catch (e){3;} finally {4;}"));
138assertUndef(eval("function blah() { 1; }; blah();"));
139assertUndef(eval("var x = 1;"));
140assertEquals(1, eval("if (true) { 1; } else { 2; }"));
141assertEquals(2, eval("if (false) { 1; } else { 2; }"));
142assertUndef(eval("try{1; if (true) { 2; throw ''; } else { 2; }} catch(e){}"));
143assertEquals(2, eval("1; var i = 0; do { ++i; 2; } while(i!=1);"));
144assertUndef(eval(
145 "try{1; var i = 0; do { ++i; 2; throw ''; } while (i!=1);} catch(e){}"));
146assertUndef(eval("1; try{2; throwOnReturn();} catch(e){}"));
147assertUndef(eval("1; twoFunc();"));
148assertEquals(2, eval("1; with ( { a: 0 } ) { 2; }"));