//------------------------------------------------------------------------------------------------------- | |
// 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() {})();"); | |
// Test recursive evals to make sure closure environments remain intact | |
var flg = 0; | |
function TestDirect() { | |
var func = "if(flg == 0) { flg = 1; eval(func); (function(a){(function(){if (a !== undefined) throw 0;})()})(); WScript.Echo('pass direct')}"; | |
eval(func); | |
} | |
TestDirect(); | |
var func = "if(flg == 1) { flg = 2; this.eval(func); (function(a){(function(){if (a !== undefined) throw 0;})()})(); WScript.Echo('pass indirect');}"; | |
function TestIndirect() { | |
this.eval(func); | |
} | |
TestIndirect(); | |
// 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(); |