blob: 4842c8898892ccac76fc63de5fba0d69d304fa24 [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.
//-------------------------------------------------------------------------------------------------------
// 1. Use eval to initialize an object.
var x = eval("({" + '"' + "3d-cube" + '"' + ":[1]})");
WScript.Echo(x["3d-cube"][0]);
WScript.Echo(x);
// 2. Use eval to assign a global variable
eval("var i = " + '"' + "3d-cube" + '"' + ";");
var str1 = "var x;"
var str2 = "x = 9; g(); x = 8;"
// 3. Use eval to define nested functions. Use nested eval to
// manipulate local variables. Access a global variable
// with the same name as a local.
eval("function f()" +
"{" +
" eval(str1);" +
" function g() { WScript.Echo(x); };" +
" eval(str2);" +
" return g;" +
"}; " +
"WScript.Echo(x[i][0]);" );
// 4. Use eval to call the function defined within the previous eval
// and get back the nested function.
var z = eval("f()");
eval("z()");
// 5. Call function containing eval taking multiple params; pass it too few.
// Test of ArgIn_A handling when params are homed to a heap location.
function foo(a, b, c) {
eval("WScript.Echo(a);");
eval("WScript.Echo(b);");
eval("WScript.Echo(c);");
}
foo("foo.a", "foo.b");
(function () {
function foo(a) {
WScript.Echo(foo);
eval("bar(false)");
function bar(x) {
if (x)
foo(x);
}
};
foo(true);
})();
// 6. Function declarations inside eval should go to the enclosing scope
// (but not to a "with" object).
var O = {xxx:'O.xxx'};
with (O)
{
eval('function xxx(){}');
}
WScript.Echo(O.xxx);
WScript.Echo(xxx);
(function () { eval("function foobaz() {}") })();
try {
foobaz();
WScript.Echo("fail");
} catch(e) {
WScript.Echo("pass");
}
// 7. Check 'this' inside eval. See WOOB 1127689.
function F(obj)
{
this.name = "F";
WScript.Echo("inside eval: this.name = " + obj.eval('this.name'));
}
this.name = "global object";
var f = new F(this);
var test11glob=42;
function test11() {
var result;
function test()
{
return this.test11glob
}
WScript.Echo(test());
WScript.Echo(eval("test()"));
}
test11();
// Make sure that deeply aliased eval call does the right thing.
var G = this;
G.NSEval = G["eval"];
function alias() {
var x = 'hello';
// In compat mode, print hello. In standards mode, print the global x.
// And in compat mode, run with deferred parsing to make sure the aliasing
// of "this" persists across parser instances.
G.NSEval('WScript.Echo(x)');
}
alias();
// bug 1147044
eval("with ({}) (function fibonacci() {})();");
// 8. Set up a custom eval that indirectly calls built-in eval, evoke it, and verify the effect.
var q = eval;
var eval = function(s) {
// Do some extra stuff.
WScript.Echo("Custom eval:");
for (var index = 0; index < arguments.length; index++)
{
WScript.Echo("arg " + index + " = \'" + arguments[index] + "\'");
}
q(s);
}
eval("x[i][0] = 2;");
WScript.Echo(x[i][0]);
// 9. Test that the extra scope chain parameter is hidden.
eval = (function (x, y) { WScript.Echo(y + ''); });
eval('hello');
// 10. Test jitting of a store to a closure-captured block-scoped variable.
function test5810363() {
(function () {
if (false) {
(function () {
eval('');
}());
function func13() {
}
while (func13 = func13) {
}
}
}());
}
test5810363();
test5810363();
test5810363();