defernested.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. var echo = WScript.Echo;
  6. var x0 = 0;
  7. echo("Nested in function expression");
  8. (function(){
  9. var x1 = 1;
  10. function f1() {
  11. var x11 = 11;
  12. echo(x0, x1, x11, typeof f1);
  13. }
  14. f1();
  15. function f2(a2) {
  16. echo(a2, arguments[0], typeof arguments, typeof f1);
  17. }
  18. f2("a2");
  19. })();
  20. echo();
  21. echo("Nested in function expression with arguments");
  22. (function(a0){
  23. var x1 = 1;
  24. function f1() {
  25. echo(x0, x1, a0, typeof f1);
  26. }
  27. f1();
  28. })("a0");
  29. echo();
  30. echo("Nested in named function expression, hidden and unhidden");
  31. (function f(a0){
  32. var x1 = 1;
  33. function f1() {
  34. echo(typeof f, x0, x1, a0, typeof f1);
  35. }
  36. f1();
  37. })("a0");
  38. (function f(a0, f){
  39. var x1 = 1;
  40. function f1() {
  41. echo(typeof f, x0, x1, a0, typeof f1);
  42. }
  43. f1();
  44. })("a0");
  45. echo();
  46. echo("Nested in function expression with eval");
  47. (function(a0){
  48. eval("x1 = 1; var x2 = 2");
  49. function f1() {
  50. echo(x0, x1, x2, a0, typeof f1);
  51. }
  52. f1();
  53. try {
  54. // Make sure global-eval-scoped functions work right in ES6
  55. WScript.Echo(eval('let x; function z() { return z; } z();'));
  56. } catch(e) {}
  57. })("a0");
  58. echo();
  59. echo("Nested in _named_ function expression");
  60. (function f0(){
  61. var x1 = 1;
  62. function f1() {
  63. var x11 = 11;
  64. echo(x0, x1, x11, typeof f1, typeof f0);
  65. }
  66. f1();
  67. function f2(a2) {
  68. echo(a2, arguments[0], typeof arguments, typeof f1, typeof f0);
  69. }
  70. f2("a2");
  71. })();
  72. echo();
  73. echo("Nested in _named_ function expression with arguments");
  74. (function f0(a0){
  75. var x1 = 1;
  76. function f1() {
  77. echo(x0, x1, a0, typeof f1, typeof f0);
  78. }
  79. f1();
  80. })("a0");
  81. echo();
  82. echo("Nested in _named_ function expression with eval");
  83. (function f0(a0, a1){
  84. eval("x1 = 1; var x3 = 3");
  85. var x2 = 2;
  86. function f1() {
  87. echo(x0, x1, x2, x3, a0, a1, typeof f1, typeof f0);
  88. }
  89. f1();
  90. })("a0", "a1");
  91. echo();
  92. echo("Deeply nested");
  93. (function f0(a0, a1){
  94. eval("x1 = 1");
  95. var x2 = 2;
  96. function f1(af1) {
  97. function f2() {
  98. echo(x0, x1, x2, a0, a1, af1, typeof f1, typeof f0);
  99. }
  100. f2();
  101. }
  102. f1("af1");
  103. })("a0", "a1");
  104. echo();
  105. echo("Deeply nested func expr");
  106. (function f0(a0, a1){
  107. eval("x1 = 1");
  108. var x2 = 2;
  109. (function(){
  110. (function(){
  111. function f3() {
  112. echo(x0, x1, x2, a0, a1, typeof f0);
  113. }
  114. f3();
  115. })();
  116. })();
  117. })("a0", "a1");
  118. echo();
  119. echo("Parent func has arguments");
  120. (function() {
  121. function foo(a, b) {
  122. echo(arguments, typeof bar);
  123. function bar(){}
  124. }
  125. foo(1,2);
  126. })();
  127. //-------------------------- eval ---------------------------
  128. var x = "global";
  129. geval = eval;
  130. echo("Child calls eval");
  131. (function(){
  132. var x = "local";
  133. function f1(af1) {
  134. eval("echo(x)");
  135. }
  136. f1();
  137. })();
  138. echo("Deeply nested child calls eval");
  139. (function(){
  140. var x = "local";
  141. function f1() {
  142. function f2() {
  143. (function(){
  144. function f4() {
  145. eval("echo(x)");
  146. }
  147. f4();
  148. })();
  149. }
  150. f2();
  151. }
  152. f1();
  153. })();
  154. echo("Child calls (eval)");
  155. (function(){
  156. var x = "local";
  157. function f1() {
  158. (eval)("echo(x)");
  159. }
  160. f1();
  161. })();
  162. echo("Child calls (,eval)");
  163. (function(){
  164. var x = "local";
  165. function f1() {
  166. (1,eval)("echo(x)");
  167. }
  168. f1();
  169. })();
  170. echo("Child calls geval");
  171. (function(){
  172. var x = "local";
  173. function f1() {
  174. geval("echo(x)");
  175. }
  176. f1();
  177. })();
  178. echo("Child calls leval");
  179. (function(){
  180. var x = "local";
  181. function f1() {
  182. var leval = eval;
  183. function f2() {
  184. leval("echo(x)");
  185. }
  186. f2();
  187. }
  188. f1();
  189. })();
  190. echo("Parent in strict mode, child eval syntax error");
  191. (function(){
  192. "use strict";
  193. function f0() {
  194. function f1() {
  195. eval("arguments = 42;");
  196. }
  197. f1();
  198. };
  199. try {
  200. f0();
  201. } catch (e) {
  202. echo(e); // expect syntax error for "arguments = 42"
  203. }
  204. })();
  205. echo();
  206. //----------------- with -------------------
  207. var a = "global";
  208. var b = "global";
  209. var x = {a:"with"};
  210. echo("func inside with is not deferred");
  211. with (x) {
  212. var f1 = function() {
  213. function f2() {
  214. echo(a, b);
  215. }
  216. f2();
  217. };
  218. f1();
  219. }
  220. echo("simple with (no outer symbol access)");
  221. (function(){
  222. function f0() {
  223. with (x) {
  224. var f1 = function() {
  225. echo(a, b);
  226. };
  227. f1();
  228. }
  229. }
  230. f0();
  231. })();
  232. echo("simple access from with");
  233. (function(){
  234. var a = "local";
  235. var b = "local";
  236. function f0() {
  237. with (x) {
  238. echo(a, b);
  239. }
  240. }
  241. f0();
  242. })();
  243. echo("call func from with");
  244. (function () {
  245. var obj = {};
  246. function foo() {
  247. echo("foo");
  248. }
  249. function bar() {
  250. with (obj) {
  251. foo();
  252. }
  253. }
  254. bar();
  255. })();
  256. echo("call self from with");
  257. (function() {
  258. var i = 0;
  259. function foo() {
  260. echo("foo", i++);
  261. if (i > 0) {
  262. return;
  263. }
  264. with (x) {
  265. foo();
  266. }
  267. }
  268. foo();
  269. })();
  270. echo();
  271. //----------------- try/catch -------------------
  272. echo("parent is catch scope");
  273. (function(){
  274. try {
  275. echo(no_such_var);
  276. } catch(e) {
  277. // This is inside catch, should not be deferred.
  278. (0, function(){
  279. echo(e);
  280. })();
  281. }
  282. })();
  283. echo("parent func contains catch scope");
  284. (function(){
  285. function f0() {
  286. try {
  287. echo(no_such_var);
  288. } catch(e) {
  289. echo(no_such_var);
  290. }
  291. // This can be deferred
  292. (0, function() {
  293. })();
  294. }
  295. try {
  296. f0();
  297. } catch(e) {
  298. echo(e);
  299. }
  300. })();
  301. echo("parent func contains catch scope and eval");
  302. (function(){
  303. function f0() {
  304. eval("");
  305. try {
  306. echo(no_such_var);
  307. } catch(e) {
  308. echo(no_such_var);
  309. }
  310. // This can be deferred
  311. (0, function() {
  312. })();
  313. }
  314. try {
  315. f0();
  316. } catch(e) {
  317. echo(e);
  318. }
  319. })();
  320. echo();
  321. echo("Win8 540999: arguments identifier used as parameter");
  322. (function () {
  323. function foo() {
  324. function unwrapArguments(arguments) {
  325. for (var i = 0; i < arguments.length; i++) {
  326. echo(arguments[i]);
  327. }
  328. }
  329. function bar() {
  330. unwrapArguments();
  331. }
  332. bar();
  333. }
  334. try {
  335. foo();
  336. } catch (e) {
  337. echo(e);
  338. }
  339. })();
  340. echo();
  341. echo("Win8 649401: Same named parameters + eval");
  342. (function () {
  343. function foo(x, x, x, x, x, x) {
  344. function bar() { };
  345. eval('echo("x:", x)'); // eval
  346. }
  347. foo(0);
  348. foo(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  349. })();
  350. echo();
  351. echo("Win8 649401: Same named parameters + arguments");
  352. (function () {
  353. function foo(x, x, x, x, x, x) {
  354. function bar() { };
  355. echo("x:", x);
  356. for (var i = 0; i < arguments.length; i++) {
  357. echo(arguments[i]);
  358. }
  359. }
  360. foo(0);
  361. foo(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  362. })();