| //------------------------------------------------------------------------------------------------------- | |
| // Copyright (C) Microsoft. All rights reserved. | |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
| //------------------------------------------------------------------------------------------------------- | |
| // Let/const redecl/reassign cases in presence of eval. | |
| // Eval creates its own block scope, preventing let and const variables from leaking out. | |
| function write(x) { WScript.Echo(x) } | |
| // Global scope. | |
| const z = 'global z'; | |
| let w = 'global w'; | |
| eval('let x = "global x"; const y = "global y"; write(z);'); | |
| try { write(x); } catch (e) { write(e); } | |
| try { write(y); } catch (e) { write(e); } | |
| // Try redeclaration at global scope. | |
| try { | |
| eval('var z = "global var z";'); | |
| } | |
| catch(e) { | |
| write(e); | |
| } | |
| try { | |
| eval('var w = "global var w";'); | |
| } | |
| catch(e) { | |
| write(e); | |
| } | |
| // Block scope in global function. | |
| try { | |
| const z = 'global block z'; | |
| eval('let x = "global block x"; const y = "global block y"; write(z);'); | |
| try { write(x); } catch (e) { write(e); } | |
| try { write(y); } catch (e) { write(e); } | |
| // function declared in global block. | |
| outer(); | |
| function outer() { | |
| let w = 'outer w'; | |
| // Try redeclaration at function scope. | |
| try { | |
| eval('var w = "outer var w";'); | |
| } | |
| catch(e) { | |
| write(e); | |
| } | |
| write(w); | |
| try { | |
| const z = 'outer z'; | |
| eval('let x = "outer x"; const y = "outer y"; write(z);'); | |
| try { write(x); } catch (e) { write(e); } | |
| try { write(y); } catch (e) { write(e); } | |
| // Try assigning const y; shouldn't see const y and instead create function var y | |
| eval('y = "outer var y";'); | |
| write(y); | |
| // function nested within function body. | |
| inner(); | |
| write(y); | |
| function inner() { | |
| let w = 'inner w'; | |
| // Try redeclaration at function scope. | |
| try { | |
| eval('var w = "inner var w";'); | |
| } | |
| catch(e) { | |
| write(e); | |
| } | |
| write(w); | |
| try { | |
| const z = 'inner z'; | |
| // const y shouldn't affect outer y | |
| eval('let x = "inner x"; const y = "inner y"; write(z);'); | |
| try { write(x); } catch (e) { write(e); } | |
| write(y); // outer var y | |
| } | |
| catch(e) { | |
| write(e); | |
| } | |
| function foo() { | |
| let yy = "b"; | |
| const yx = "a"; | |
| yy += "a"; | |
| eval("WScript.Echo(yy);") | |
| WScript.Echo(yy); | |
| } | |
| foo(); | |
| } | |
| } | |
| catch(e) { | |
| write(e); | |
| } | |
| } | |
| } | |
| catch(e) { | |
| write(e); | |
| } | |
| // BLUE Bug 454963 (shouldn't crash) | |
| { | |
| with ({}) | |
| eval(""); | |
| function f() { x; } | |
| let x; | |
| } | |
| this.eval('let x = 0; function f() { return x; }; WScript.Echo(f());'); |