| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- // "outer" is called in a loop but can't re-use its scope because "inner" escapes.
- // The escape isn't detected with /forcedeferparse, because inner2 isn't visible to the
- // byte code gen.
- // So executing inner2 must invalidate the cache.
- // If the cache is not invalidated, the call to escaped[1] will get the value of "x"
- // from the scope cached when we executed escaped[0].
- function outer() {
- var x = "yes!";
- function inner() {
- eval('WScript.Echo(x); x = "no!"');
- }
- function inner2() {
- return inner;
- }
- return inner2();
- }
- var escaped = [2];
- for (var i = 0; i < 2; i++) {
- escaped[i] = outer();
- }
- for (i = 0; i < escaped.length; i++) {
- escaped[i]();
- }
- // As above, but the escape of "inner" is hidden by eval.
- // Cache must be invalidated by the runtime when it does GetPropertyScoped.
- function outer2() {
- var x = "yes!";
- function inner() {
- eval('WScript.Echo(x); x = "no!"');
- }
- function inner2() {
- return eval('inner');
- }
- return inner2();
- }
- for (i = 0; i < 2; i++) {
- escaped[i] = outer2();
- }
- for (i = 0; i < escaped.length; i++) {
- escaped[i]();
- }
|