blob: 2aa00b79775720bf8853376af319c0e4df2e3fbc [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.
//-------------------------------------------------------------------------------------------------------
var echo = WScript.Echo;
var x0 = 0;
echo("Nested in function expression");
(function(){
var x1 = 1;
function f1() {
var x11 = 11;
echo(x0, x1, x11, typeof f1);
}
f1();
function f2(a2) {
echo(a2, arguments[0], typeof arguments, typeof f1);
}
f2("a2");
})();
echo();
echo("Nested in function expression with arguments");
(function(a0){
var x1 = 1;
function f1() {
echo(x0, x1, a0, typeof f1);
}
f1();
})("a0");
echo();
echo("Nested in named function expression, hidden and unhidden");
(function f(a0){
var x1 = 1;
function f1() {
echo(typeof f, x0, x1, a0, typeof f1);
}
f1();
})("a0");
(function f(a0, f){
var x1 = 1;
function f1() {
echo(typeof f, x0, x1, a0, typeof f1);
}
f1();
})("a0");
echo();
echo("Nested in function expression with eval");
(function(a0){
eval("x1 = 1; var x2 = 2");
function f1() {
echo(x0, x1, x2, a0, typeof f1);
}
f1();
try {
// Make sure global-eval-scoped functions work right in ES6
WScript.Echo(eval('let x; function z() { return z; } z();'));
} catch(e) {}
})("a0");
echo();
echo("Nested in _named_ function expression");
(function f0(){
var x1 = 1;
function f1() {
var x11 = 11;
echo(x0, x1, x11, typeof f1, typeof f0);
}
f1();
function f2(a2) {
echo(a2, arguments[0], typeof arguments, typeof f1, typeof f0);
}
f2("a2");
})();
echo();
echo("Nested in _named_ function expression with arguments");
(function f0(a0){
var x1 = 1;
function f1() {
echo(x0, x1, a0, typeof f1, typeof f0);
}
f1();
})("a0");
echo();
echo("Nested in _named_ function expression with eval");
(function f0(a0, a1){
eval("x1 = 1; var x3 = 3");
var x2 = 2;
function f1() {
echo(x0, x1, x2, x3, a0, a1, typeof f1, typeof f0);
}
f1();
})("a0", "a1");
echo();
echo("Deeply nested");
(function f0(a0, a1){
eval("x1 = 1");
var x2 = 2;
function f1(af1) {
function f2() {
echo(x0, x1, x2, a0, a1, af1, typeof f1, typeof f0);
}
f2();
}
f1("af1");
})("a0", "a1");
echo();
echo("Deeply nested func expr");
(function f0(a0, a1){
eval("x1 = 1");
var x2 = 2;
(function(){
(function(){
function f3() {
echo(x0, x1, x2, a0, a1, typeof f0);
}
f3();
})();
})();
})("a0", "a1");
echo();
echo("Parent func has arguments");
(function() {
function foo(a, b) {
echo(arguments, typeof bar);
function bar(){}
}
foo(1,2);
})();
//-------------------------- eval ---------------------------
var x = "global";
geval = eval;
echo("Child calls eval");
(function(){
var x = "local";
function f1(af1) {
eval("echo(x)");
}
f1();
})();
echo("Deeply nested child calls eval");
(function(){
var x = "local";
function f1() {
function f2() {
(function(){
function f4() {
eval("echo(x)");
}
f4();
})();
}
f2();
}
f1();
})();
echo("Child calls (eval)");
(function(){
var x = "local";
function f1() {
(eval)("echo(x)");
}
f1();
})();
echo("Child calls (,eval)");
(function(){
var x = "local";
function f1() {
(1,eval)("echo(x)");
}
f1();
})();
echo("Child calls geval");
(function(){
var x = "local";
function f1() {
geval("echo(x)");
}
f1();
})();
echo("Child calls leval");
(function(){
var x = "local";
function f1() {
var leval = eval;
function f2() {
leval("echo(x)");
}
f2();
}
f1();
})();
echo("Parent in strict mode, child eval syntax error");
(function(){
"use strict";
function f0() {
function f1() {
eval("arguments = 42;");
}
f1();
};
try {
f0();
} catch (e) {
echo(e); // expect syntax error for "arguments = 42"
}
})();
echo();
//----------------- with -------------------
var a = "global";
var b = "global";
var x = {a:"with"};
echo("func inside with is not deferred");
with (x) {
var f1 = function() {
function f2() {
echo(a, b);
}
f2();
};
f1();
}
echo("simple with (no outer symbol access)");
(function(){
function f0() {
with (x) {
var f1 = function() {
echo(a, b);
};
f1();
}
}
f0();
})();
echo("simple access from with");
(function(){
var a = "local";
var b = "local";
function f0() {
with (x) {
echo(a, b);
}
}
f0();
})();
echo("call func from with");
(function () {
var obj = {};
function foo() {
echo("foo");
}
function bar() {
with (obj) {
foo();
}
}
bar();
})();
echo("call self from with");
(function() {
var i = 0;
function foo() {
echo("foo", i++);
if (i > 0) {
return;
}
with (x) {
foo();
}
}
foo();
})();
echo();
//----------------- try/catch -------------------
echo("parent is catch scope");
(function(){
try {
echo(no_such_var);
} catch(e) {
// This is inside catch, should not be deferred.
(0, function(){
echo(e);
})();
}
})();
echo("parent func contains catch scope");
(function(){
function f0() {
try {
echo(no_such_var);
} catch(e) {
echo(no_such_var);
}
// This can be deferred
(0, function() {
})();
}
try {
f0();
} catch(e) {
echo(e);
}
})();
echo("parent func contains catch scope and eval");
(function(){
function f0() {
eval("");
try {
echo(no_such_var);
} catch(e) {
echo(no_such_var);
}
// This can be deferred
(0, function() {
})();
}
try {
f0();
} catch(e) {
echo(e);
}
})();
echo();
echo("Win8 540999: arguments identifier used as parameter");
(function () {
function foo() {
function unwrapArguments(arguments) {
for (var i = 0; i < arguments.length; i++) {
echo(arguments[i]);
}
}
function bar() {
unwrapArguments();
}
bar();
}
try {
foo();
} catch (e) {
echo(e);
}
})();
echo();
echo("Win8 649401: Same named parameters + eval");
(function () {
function foo(x, x, x, x, x, x) {
function bar() { };
eval('echo("x:", x)'); // eval
}
foo(0);
foo(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
})();
echo();
echo("Win8 649401: Same named parameters + arguments");
(function () {
function foo(x, x, x, x, x, x) {
function bar() { };
echo("x:", x);
for (var i = 0; i < arguments.length; i++) {
echo(arguments[i]);
}
}
foo(0);
foo(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
})();