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