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