dfd892f7d9d98cdf43a39c82b43a60679961a11f
[WebKit-https.git] / JSTests / stress / eval-func-decl-within-eval-with-reassign-to-var.js
1 var assert = function (result, expected, message) {
2     if (result !== expected) {
3         throw new Error('Error in assert. Expected "' + expected + '" but was "' + result + '":' + message );
4     }
5 };
6
7 var assertThrow = function (cb, expected) {
8     let error = null;
9     try {
10         cb();
11     } catch(e) {
12         error = e;  
13     }
14     if (error === null) {
15         throw new Error('Error is expected. Expected "' + expected + '" but error was not thrown."');
16     }
17     if (error.toString() !== expected) {
18         throw new Error('Error is expected. Expected "' + expected + '" but error was "' + error + '"');
19     }
20 };
21
22 function foo() {
23     {
24         var f = 20;
25         eval('var f = 15; eval(" { function f() { }; } ")');
26         assert(typeof f, "function");
27     }
28     assert(typeof f, "function", "#1");
29 }
30
31 for (var i = 0; i < 10000; i++) {
32     foo();
33     assertThrow(() => f, "ReferenceError: Can't find variable: f");
34 }
35
36 function boo() {
37     {
38         var l = 20;
39         eval('{ let l = 15; eval(" { function l() { }; } ")}');
40         assert(l, 20, "#3");
41     }
42     assert(typeof l, 'number', "#4");
43 }
44
45 for (var i = 0; i < 10000; i++){
46     boo();
47     assertThrow(() => l, "ReferenceError: Can't find variable: l");
48 }
49
50 function foobar() { 
51     eval("if (false) { function _bar() { } }"); 
52     assert(_bar, undefined); 
53 }
54
55 for (var i = 0; i < 10000; i++){
56     foobar();
57     assertThrow(() => _bar, "ReferenceError: Can't find variable: _bar");
58 }
59
60 // Fixme:  https://bugs.webkit.org/show_bug.cgi?id=167837
61 // Current test does not work because it should raise exception
62 // that f could not be redeclared
63 /*
64 function goo() {
65     {   
66         var error = false;
67         try {
68             let f = 20;
69             eval('var f = 15; eval(" { function f() { }; } ")');
70         } catch (e) {
71             error = e instanceof SyntaxError;
72         }
73         assert(error, true, "syntax error should be raisen");
74     }
75     assert(typeof f, "undefined", "#6");
76 }
77
78 for (var i = 0; i < 10000; i++) {
79     goo();
80     assert(typeof f, "undefined", "#7");
81 }
82 */
83
84 function hoo() {
85     {
86         let h = 20;
87         eval('var h = 15; eval(" if (false){ function h() { }; } ");');
88         assert(h, 15);
89     }
90     assert(typeof h, "undefined");
91 }
92
93 for (var i = 0; i < 10000; i++) {
94     hoo();
95     assertThrow(() => h, "ReferenceError: Can't find variable: h");
96 }
97
98 function joo() {
99     {
100         var h = 20;
101         eval('var h = 15; eval(" if (false){ function h() { }; } ")');
102         assert(typeof h, "number");
103     }
104     assert(typeof h, "number", "#10");
105 }
106
107 for (var i = 0; i < 10000; i++){
108     joo();
109     assertThrow(() => h, "ReferenceError: Can't find variable: h");
110 }
111
112 function koo() {
113     {
114         var k = 20;
115         eval('var k = 15; eval(" if (true){ function k() { }; } ")');
116         assert(typeof k, "function" );
117     }
118     assert(typeof k, "function", "#12");
119 }
120
121 for (var i = 0; i < 10000; i++){
122     koo();
123     assertThrow(() => h, "ReferenceError: Can't find variable: h");
124 }
125
126 function loo() { 
127     let h = 20; 
128     eval("var h; if (false) { function h() { } }"); 
129     return h; 
130 }
131
132 assert(loo(), 20);
133
134 for (var i = 0; i < 10000; i++) {
135     loo();
136     assertThrow(() => h, "ReferenceError: Can't find variable: h");
137 }