blob: e1e82328a527908e00c9790fe9231b49685ef47e [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// 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());');