delete3.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  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. function write(v) { WScript.Echo(v + ""); }
  6. var r;
  7. // Delete locals
  8. (function Test1() {
  9. var p;
  10. var q = 10;
  11. write("p : " + p);
  12. r = delete p;
  13. write("delete p: " + r);
  14. write("p : " + p);
  15. write("q : " + q);
  16. r = delete q;
  17. write("delete q: " + r);
  18. write("q : " + q);
  19. }) ();
  20. test2_value = 10;
  21. // Delete globals
  22. (function Test2() {
  23. test2_local = 20;
  24. write("test2_value : " + test2_value);
  25. r = delete test2_value;
  26. write("delete test2_value: " + r);
  27. try {
  28. write("test2_value : " + test2_value);
  29. write("delete test2_value failed");
  30. } catch (e) {
  31. write("delete test2_value passed");
  32. }
  33. write("test2_local : " + test2_local);
  34. r = delete test2_local;
  35. write("delete test2_local: " + r);
  36. try {
  37. write("test2_local : " + test2_local);
  38. write("delete test2_local failed");
  39. } catch (e) {
  40. write("delete test2_local passed");
  41. }
  42. }) ();
  43. // Deleting parameters
  44. (function Test3(x,y,z) {
  45. write("Test3 x : " + x + " y: " + y + " z: " + z);
  46. r = delete x;
  47. write("delete x: " + r);
  48. r = delete y;
  49. write("delete x: " + r);
  50. r = delete z;
  51. write("delete x: " + r);
  52. write("Test3 x : " + x + " y: " + y + " z: " + z);
  53. })(10, "hello");
  54. // Delete arguments[i]
  55. (function Test4(x,y,z) {
  56. write("Test4 x : " + x + " y: " + y + " z: " + z);
  57. write("Test4 arguments[0] : " + arguments[0] + " arguments[1]: " + arguments[1] + " arguments[2]: " + arguments[2]);
  58. r = delete arguments[0];
  59. write("delete arguments[0]: " + r);
  60. r = delete arguments[2];
  61. write("delete arguments[2]: " + r);
  62. write("Test4 x : " + x + " y: " + y + " z: " + z);
  63. write("Test4 arguments[0] : " + arguments[0] + " arguments[1]: " + arguments[1] + " arguments[2]: " + arguments[2]);
  64. }) (10, "hello");
  65. // Delete nested function
  66. (function Test5() {
  67. function test5_func() { return 100;}
  68. r = delete test5_func;
  69. write("Test5: delete function " + r);
  70. write("test5_func() :" + test5_func());
  71. }) ();
  72. // Delete this
  73. (function Test6() {
  74. try {
  75. r = delete this;
  76. } catch (e) {
  77. write("Exception delete this : " + e.message);
  78. }
  79. write("Test6: delete this: " + r);
  80. }) ();
  81. // Delete a global function
  82. function test7_value() {}
  83. (function Test7() {
  84. r = delete test7_value;
  85. write("Test7: delete test7_value: " + r);
  86. }) ();
  87. // Delete arguments
  88. (function Test8() {
  89. r = delete arguments;
  90. write("Test8: delete arguments: " + r);
  91. }) ();
  92. // Delete exception
  93. (function Test9() {
  94. try {
  95. throw 10;
  96. } catch(e) {
  97. r = delete e;
  98. }
  99. write("Test9: delete exception: " + r);
  100. })();
  101. // Delete exception
  102. (function Test10() {
  103. try {
  104. throw new Error("some error");
  105. } catch(e) {
  106. r = delete e;
  107. }
  108. write("Test10: delete exception: " + r);
  109. })();
  110. // Delete variable declared using eval
  111. (function Test11(){
  112. eval("var x = 10;");
  113. r = delete x;
  114. write("Test11: delete x: " + r);
  115. }) ();
  116. // Delete variable declared using eval, in eval
  117. (function Test12(){
  118. eval("var x = 10;");
  119. r = eval("delete x");
  120. write("Test12: delete x: " + r);
  121. }) ();
  122. // Delete variable in eval
  123. (function Test13(){
  124. var x;
  125. r = eval("delete x;");
  126. write("Test13: delete x: " + r);
  127. }) ();
  128. // Delete function in eval
  129. (function Test14(){
  130. function f() { return 100;}
  131. r = eval("delete f;");
  132. write("Test14: delete f: " + r);
  133. }) ();
  134. // Delete function in eval, declared in eval
  135. (function Test15(){
  136. eval("function f() { return 100;}");
  137. r = eval("delete f;");
  138. write("Test15: delete f: " + r);
  139. }) ();
  140. // Delete function, declared in eval
  141. (function Test16(){
  142. eval("function f() { return 100;}");
  143. r = delete f;
  144. write("Test16: delete f: " + r);
  145. }) ();
  146. // Delete arguments in function declared and called in eval
  147. (function Test17(){
  148. r = eval("function test17_value(){ return delete arguments; }; test17_value();");
  149. write("Test17: delete test17_value: " + r);
  150. }) ();
  151. // With cases
  152. // Delete local variable, not in with
  153. (function Test18(){
  154. var test18_value = 10;
  155. var o = {};
  156. with(o){
  157. r = delete test18_value;
  158. }
  159. write("Test18: delete test18_value: " + r);
  160. write("test18_value : " + test18_value);
  161. }) ();
  162. // Delete variable in with
  163. (function Test19(){
  164. var test19_value = 10;
  165. var o = { test19_value : 20 };
  166. with(o){
  167. r = delete test19_value;
  168. }
  169. write("Test19: delete test19_value: " + r);
  170. write("test19_value : " + test19_value);
  171. write("o.test19_value : " + o.test19_value);
  172. }) ();
  173. // Delete local variable, not in with inside eval
  174. (function Test20(){
  175. var test20_value = 10;
  176. var o = {};
  177. with(o){
  178. r = eval("delete test20_value");
  179. }
  180. write("Test20: delete test20_value: " + r);
  181. write("test20_value : " + test20_value);
  182. }) ();
  183. // Delete variable in with, inside eval
  184. (function Test21(){
  185. var test21_value = 10;
  186. var o = { test21_value : 20 };
  187. with(o){
  188. r = eval("delete test21_value");
  189. }
  190. write("Test21: delete test21_value: " + r);
  191. write("test21_value : " + test21_value);
  192. write("o.test21_value : " + o.test21_value);
  193. }) ();
  194. // Delete variable in multi level with!!!
  195. (function Test22(){
  196. var test22_value = 10;
  197. var o1 = { test22_value : 20 };
  198. var o2 = { test22_value : 30 };
  199. var o3 = { test22_value : 40 };
  200. var o4 = { test22_value : 50 };
  201. with(o1){
  202. with(o2){
  203. with(o3){
  204. with(o4){
  205. r = delete test22_value;
  206. }
  207. }
  208. }
  209. }
  210. write("Test22: delete test22_value: " + r);
  211. write("test22_value : " + test22_value);
  212. write("o1.test22_value : " + o1.test22_value);
  213. write("o2.test22_value : " + o2.test22_value);
  214. write("o3.test22_value : " + o3.test22_value);
  215. write("o4.test22_value : " + o4.test22_value);
  216. }) ();
  217. (function Test23(){
  218. var test23_value = 10;
  219. var o1 = { test23_value : 20 };
  220. var o2 = { test23_value : 30 };
  221. var o3 = { test23_value : 40 };
  222. var o4 = { test23_value : 50 };
  223. with(o1){
  224. with(o2){
  225. with(o3){
  226. with(o4){
  227. r = eval("delete test23_value");
  228. }
  229. }
  230. }
  231. }
  232. write("Test23: delete test23_value: " + r);
  233. write("test23_value : " + test23_value);
  234. write("o1.test23_value : " + o1.test23_value);
  235. write("o2.test23_value : " + o2.test23_value);
  236. write("o3.test23_value : " + o3.test23_value);
  237. write("o4.test23_value : " + o4.test23_value);
  238. }) ();
  239. var Test24_value = 1;
  240. (function Test24(){
  241. var Test24_value = 10;
  242. var o = { Test24_value : 20 };
  243. with(o){
  244. r = delete Test24_value;
  245. }
  246. write("Test24: delete Test24_value: " + r);
  247. write("Test24_value : " + Test24_value);
  248. write("o.Test24_value : " + o.Test24_value);
  249. }) ();
  250. var Test25_value = 1;
  251. (function Test25(){
  252. var o = { Test25_value : 20 };
  253. with(o){
  254. r = eval("delete Test25_value");
  255. }
  256. write("Test25: delete Test25_value: " + r);
  257. write("Test25_value : " + Test25_value);
  258. write("o.Test25_value : " + o.Test25_value);
  259. }) ();
  260. var Test26_value = 1;
  261. (function Test26(){
  262. var o = new Object();
  263. with(o){
  264. r = delete Test26_value;
  265. }
  266. write("Test26: delete Test26_value: " + r);
  267. write("Test26_value : " + Test26_value);
  268. write("o.Test26_value : " + o.Test26_value);
  269. }) ();
  270. var Test27_value = 1;
  271. (function Test27(){
  272. var o = new Object();
  273. with(o){
  274. r = delete Test27_value;
  275. }
  276. write("Test27: delete Test27_value: " + r);
  277. write("Test27_value : " + Test27_value);
  278. write("o.Test27_value : " + o.Test27_value);
  279. }) ();
  280. // Function Declaration. And eval with same name
  281. function Func28()
  282. {
  283. write("Func28.1 :" + typeof(Func28));
  284. eval("var Func28 = 1;");
  285. write("Func28.2 :" + typeof(Func28));
  286. r = delete Func28;
  287. write("Func28: delete Func28: " + r);
  288. write("Func28.3 :" + typeof(Func28));
  289. eval("var Func28 = 1;");
  290. write("Func28.4 :" + typeof(Func28));
  291. eval("r = delete Func28;");
  292. write("Func28: delete Func28: " + r);
  293. write("Func28.5 :" + typeof(Func28));
  294. }
  295. Func28();
  296. (function Expr29()
  297. {
  298. write("Expr29.1 :" + typeof(Expr29));
  299. eval("var Expr29 = 1;");
  300. write("Expr29.2 :" + typeof(Expr29));
  301. r = delete Expr29;
  302. write("Expr29: delete Expr29: " + r);
  303. write("Expr29.3 :" + typeof(Expr29));
  304. eval("var Expr29 = 1;");
  305. write("Expr29.4 :" + typeof(Expr29));
  306. eval("r = delete Expr29;");
  307. write("Expr29: delete Expr29: " + r);
  308. write("Expr29.5 :" + typeof(Expr29));
  309. })()
  310. function Func30()
  311. {
  312. write("Func30.1 :" + typeof(Func30));
  313. eval("var Func30 = 1;");
  314. eval('write("Func30.2 :" + typeof(Func30));');
  315. eval('eval("var Func30 = {};");');
  316. eval('write("Func30.3 :" + typeof(Func30));');
  317. var str = '(function Func30_inner() {' +
  318. ' write("Func30.4 :" + typeof(Func30));' +
  319. ' r = delete Func30; ' +
  320. ' write("Func30: delete Func30: " + r);' +
  321. ' write("Func30.5 :" + typeof(Func30));' +
  322. ' r = delete Func30; ' +
  323. ' write("Func30: delete Func30: " + r);' +
  324. ' write("Func30.6 :" + typeof(Func30));' +
  325. '})();';
  326. eval(str);
  327. write("Func30.7 :" + typeof(Func30));
  328. }
  329. Func30();
  330. (function Expr31()
  331. {
  332. write("Expr31.1 :" + typeof(Expr31));
  333. eval("var Expr31 = 1;");
  334. eval('write("Expr31.2 :" + typeof(Expr31));');
  335. eval('eval("var Expr31 = {};");');
  336. eval('write("Expr31.3 :" + typeof(Expr31));');
  337. var str = '(function Expr31_inner() {' +
  338. ' write("Expr31.4 :" + typeof(Expr31));' +
  339. ' r = delete Expr31; ' +
  340. ' write("Expr31: delete Expr31: " + r);' +
  341. ' write("Expr31.5 :" + typeof(Expr31));' +
  342. ' r = delete Expr31; ' +
  343. ' write("Expr31: delete Expr31: " + r);' +
  344. ' write("Expr31.6 :" + typeof(Expr31));' +
  345. '})();';
  346. eval(str);
  347. write("Expr31.7 :" + typeof(Expr31));
  348. })()