|
3 | 3 | // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
4 | 4 | //-------------------------------------------------------------------------------------------------------
|
5 | 5 |
|
6 |
| -function foo(a = (()=>+x)()) { |
7 |
| - function bar() { eval(''); } |
8 |
| - var x; |
| 6 | +let throwingFunctions = [{ |
| 7 | + msg: "Split-scope parent, param-scope child capturing symbol from parent body scope", |
| 8 | + body: function foo(a = (()=>+x)()) { |
| 9 | + function bar() { eval(''); } |
| 10 | + var x; |
| 11 | + } |
| 12 | +}, |
| 13 | +{ |
| 14 | + msg: "Split-scope parent, param-scope child capturing symbol from parent body scope", |
| 15 | + body: function foo(a = (()=>+x)()) { |
| 16 | + eval(''); |
| 17 | + var x; |
| 18 | + } |
| 19 | +}, |
| 20 | +{ |
| 21 | + msg: "Merged-scope parent, param-scope child capturing symbol from parent body scope", |
| 22 | + body: function foo(a = () => +x) { |
| 23 | + var x = 1; |
| 24 | + return a(); |
| 25 | + } |
| 26 | +}, |
| 27 | +{ |
| 28 | + msg: "Merged-scope parent, param-scope child capturing symbol from parent body scope", |
| 29 | + body: function foo(a = (()=>+x)()) { |
| 30 | + var x; |
| 31 | + } |
| 32 | +}, |
| 33 | +{ |
| 34 | + msg: "Func expr parent, param-scope func expr child capturing symbol from parent body scope", |
| 35 | + body: foo3 = function foo3a(a = (function foo3b() { return +x; })()) { |
| 36 | + var x = 123; |
| 37 | + } |
| 38 | +}, |
| 39 | +{ |
| 40 | + msg: "Func expr parent, param-scope func expr child capturing symbol from parent body scope", |
| 41 | + body: foo3 = function foo3a(a = (function foo3b() { return +x; })()) { |
| 42 | + eval(''); |
| 43 | + var x = 123; |
| 44 | + } |
| 45 | +}, |
| 46 | +{ |
| 47 | + msg: "Func expr parent, param-scope func expr child capturing symbol from parent body scope", |
| 48 | + body: foo3 = function foo3a(a = (function foo3b() { return +x; })()) { |
| 49 | + function bar() { eval(''); } |
| 50 | + var x = 123; |
| 51 | + } |
| 52 | +}, |
| 53 | +{ |
| 54 | + msg: "Param-scope func expr child with nested func expr capturing symbol from parent body scope", |
| 55 | + body: foo5 = function foo5a(a = (function(){(function(b = 123) { +x; })()})()) { |
| 56 | + function bar() { eval(''); } |
| 57 | + var x; |
| 58 | + } |
| 59 | +}, |
| 60 | +{ |
| 61 | + msg: "Multiple nested func expr, inner param-scope function capturing outer func expr name", |
| 62 | + body: foo3 = function foo3a(a = (function foo3b(b = (function foo3c(c = (function foo3d() { +x; })()){})()){})()){ var x;} |
| 63 | +}]; |
| 64 | + |
| 65 | +let nonThrowingFunctions = [{ |
| 66 | + msg: "Func expr parent, param-scope func expr child capturing parent func expr name", |
| 67 | + body: foo3 = function foo3a(a = (function foo3b() { +foo3a; })()) { |
| 68 | + return +a; |
| 69 | + } |
| 70 | +}, |
| 71 | +{ |
| 72 | + msg: "Func expr parent, param-scope func expr child capturing own func expr name", |
| 73 | + body: foo3 = function foo3a(a = (function foo3b() { +foo3b; })()) { |
| 74 | + return +a; |
| 75 | + } |
| 76 | +}, |
| 77 | +{ |
| 78 | + msg: "Func expr parent, param-scope func expr child capturing expression name hint", |
| 79 | + body: foo3 = function foo3a(a = (function foo3b() { +foo3; })()) { |
| 80 | + return +a; |
| 81 | + } |
| 82 | +}, |
| 83 | +{ |
| 84 | + msg: "Func expr parent, param-scope func expr child capturing parent argument name", |
| 85 | + body: foo3 = function foo3a(b = 123, a = (function foo3b() { return +b; })()) { |
| 86 | + if (123 !== a) throw 123; |
| 87 | + } |
| 88 | +}, |
| 89 | +{ |
| 90 | + msg: "Func expr parent, param-scope func expr child capturing symbol from parent body scope", |
| 91 | + body: foo3 = function foo3a(b = 123, a = (function foo3b() { return +b; })()) { |
| 92 | + if (123 !== a) throw 123; |
| 93 | + } |
| 94 | +}, |
| 95 | +{ |
| 96 | + msg: "Multiple nested func expr, inner param-scope function capturing outer func expr name", |
| 97 | + body: foo3 = function foo3a(a = (function foo3b(b = (function foo3c(c = (function foo3d() { foo3d; })()){})()){})()){} |
| 98 | +}, |
| 99 | +{ |
| 100 | + msg: "Multiple nested func expr, inner param-scope function capturing outer func expr name", |
| 101 | + body: foo3 = function foo3a(a = (function foo3b(b = (function foo3c(c = (function foo3d() { foo3c; })()){})()){})()){} |
| 102 | +}, |
| 103 | +{ |
| 104 | + msg: "Multiple nested func expr, inner param-scope function capturing outer func expr name", |
| 105 | + body: foo3 = function foo3a(a = (function foo3b(b = (function foo3c(c = (function foo3d() { foo3b; })()){})()){})()){} |
| 106 | +}, |
| 107 | +{ |
| 108 | + msg: "Multiple nested func expr, inner param-scope function capturing outer func expr name", |
| 109 | + body: foo3 = function foo3a(a = (function foo3b(b = (function foo3c(c = (function foo3d() { foo3a; })()){})()){})()){} |
| 110 | +}, |
| 111 | +{ |
| 112 | + msg: "Multiple nested func expr, inner param-scope function capturing outer func expr name", |
| 113 | + body: foo3 = function foo3a(a = (function foo3b(b = (function foo3c(c = (function foo3d() { foo3; })()){})()){})()){} |
| 114 | +}]; |
| 115 | + |
| 116 | +for (let fn of throwingFunctions) { |
| 117 | + try { |
| 118 | + fn.body(); |
| 119 | + console.log(`fail: ${fn.msg}`); |
| 120 | + } catch { |
| 121 | + console.log("pass"); |
| 122 | + } |
9 | 123 | }
|
10 | 124 |
|
11 |
| -try { |
12 |
| - foo(); |
13 |
| - console.log('fail'); |
14 |
| -} catch { |
15 |
| - console.log("pass"); |
16 |
| -} |
17 |
| - |
18 |
| -function foo2(a = () => x) { var x = 1; return a(); } |
19 |
| - |
20 |
| -try { |
21 |
| - foo2() |
22 |
| - console.log('fail'); |
23 |
| -} catch { |
24 |
| - console.log('pass'); |
25 |
| -} |
26 |
| - |
27 |
| -var foo3 = function foo3a(a = (function foo3b() { +foo3a; })()) { |
28 |
| - a; |
29 |
| -}; |
30 |
| - |
31 |
| -try { |
32 |
| - foo3() |
33 |
| - console.log('pass'); |
34 |
| -} catch { |
35 |
| - console.log('fail'); |
36 |
| -} |
37 |
| - |
38 |
| -var foo4 = function foo4a(a = (function() { +x; })()) { |
39 |
| - function bar() { eval(''); } |
40 |
| - var x; |
41 |
| -}; |
42 |
| - |
43 |
| -try { |
44 |
| - foo4() |
45 |
| - console.log('fail'); |
46 |
| -} catch { |
47 |
| - console.log('pass'); |
48 |
| -} |
49 |
| - |
50 |
| -var foo5 = function foo5a(a = (function(){(function(b = 123) { +x; })()})()) { |
51 |
| - function bar() { eval(''); } |
52 |
| - var x; |
53 |
| -}; |
54 |
| - |
55 |
| -try { |
56 |
| - foo5(); |
57 |
| - console.log('fail'); |
58 |
| -} catch { |
59 |
| - console.log('pass'); |
60 |
| -} |
61 |
| - |
62 |
| -function foo6(a, b = (function() {a; +x;})()) { |
63 |
| - function bar() { eval(''); } |
64 |
| - var x; |
65 |
| -}; |
66 |
| - |
67 |
| -try { |
68 |
| - foo6(); |
69 |
| - console.log('fail'); |
70 |
| -} catch { |
71 |
| - console.log('pass'); |
72 |
| -} |
73 |
| - |
74 |
| -var foo8 = function foo8a(b, a = (function foo8b() { console.log(x); })()) { |
75 |
| - a; |
76 |
| - var x = 'fail'; |
77 |
| -}; |
78 |
| - |
79 |
| -try { |
80 |
| - foo8() |
81 |
| - console.log('fail'); |
82 |
| -} catch { |
83 |
| - console.log('pass'); |
84 |
| -} |
85 |
| - |
86 |
| -var foo9 = function foo9a(b = 'pass', a = (function foo9b() { console.log(b); })()) { |
87 |
| -}; |
88 |
| - |
89 |
| -try { |
90 |
| - foo9() |
91 |
| - console.log('pass'); |
92 |
| -} catch { |
93 |
| - console.log('fail'); |
| 125 | +for (let fn of nonThrowingFunctions) { |
| 126 | + try { |
| 127 | + fn.body(); |
| 128 | + console.log("pass"); |
| 129 | + } catch { |
| 130 | + console.log(`fail: ${fn.msg}`); |
| 131 | + } |
94 | 132 | }
|
0 commit comments