| function shouldThrowTDZ(func) { |
| var hasThrown = false; |
| try { |
| func(); |
| } catch(e) { |
| hasThrown = e instanceof ReferenceError; |
| } |
| if (!hasThrown) |
| throw new Error("Did not throw TDZ error"); |
| } |
| |
| function test(f, n = 1000) { |
| for (let i = 0; i < n; i++) |
| f(); |
| } |
| |
| test(function() { |
| function foo() { |
| eval("20"); |
| let eval; |
| } |
| shouldThrowTDZ(foo); |
| }); |
| |
| test(function() { |
| function foo() { |
| eval("20"); |
| let {eval} = {eval:450}; |
| } |
| shouldThrowTDZ(foo); |
| }); |
| |
| test(function() { |
| function foo() { |
| eval("20"); |
| const eval = 45; |
| } |
| shouldThrowTDZ(foo); |
| }); |
| |
| test(function() { |
| function foo() { |
| eval("20"); |
| } |
| shouldThrowTDZ(foo); |
| let eval; |
| }); |
| |
| test(function() { |
| function foo() { |
| eval("20"); |
| } |
| shouldThrowTDZ(foo); |
| let {eval} = {eval:450}; |
| }); |
| |
| test(function() { |
| function foo() { |
| eval("20"); |
| } |
| shouldThrowTDZ(foo); |
| const eval = 45; |
| }); |
| |
| { |
| let threw = false; |
| try { |
| eval(20); |
| let eval; |
| } catch(e) { |
| threw = e instanceof ReferenceError; |
| } |
| if (!threw) |
| throw new Error("Bad") |
| } |
| |
| { |
| let threw = false; |
| try { |
| eval(20); |
| const eval = 25; |
| } catch(e) { |
| threw = e instanceof ReferenceError; |
| } |
| if (!threw) |
| throw new Error("Bad") |
| } |