//------------------------------------------------------------------------------------------------------- | |
// 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());'); |