shift_unshift.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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. // original
  6. var x = [0, 1, 2, 3];
  7. WScript.Echo(x);
  8. x.shift(); // [1, 2, 3]
  9. WScript.Echo(x);
  10. x.unshift(); // [1, 2, 3]
  11. WScript.Echo(x);
  12. WScript.Echo(x.unshift(0)); // [0, 1, 2, 3]
  13. WScript.Echo(x);
  14. x.unshift("a", "b", "c"); // ["a", "b", "c", 0, 1, 2, 3]
  15. WScript.Echo(x);
  16. //Array subclassing
  17. var SubArray = function()
  18. {
  19. };
  20. SubArray.prototype = new Array;
  21. var newlist = new SubArray;
  22. //push 3 items in the subarray
  23. newlist.push(1);
  24. newlist.push(2);
  25. newlist.push(3); //[1,2,3]
  26. WScript.Echo(newlist[0]); //1
  27. WScript.Echo(newlist.shift()); //1
  28. WScript.Echo(newlist.length); //2
  29. WScript.Echo(newlist.shift()); //2
  30. WScript.Echo(newlist.length); //1
  31. WScript.Echo(newlist.shift()); //3
  32. WScript.Echo(newlist[0]); //undefined
  33. WScript.Echo(newlist.length); //0
  34. WScript.Echo(newlist.unshift(2,3,4)); //3
  35. WScript.Echo(newlist[0]); //[2,3,4]
  36. WScript.Echo(newlist.pop()); //4
  37. WScript.Echo(newlist.unshift(5,6,7)); //[5,6,7,2,3]
  38. WScript.Echo(newlist.length); //5
  39. for(i=0;i<7;i++)
  40. WScript.Echo(newlist.shift());
  41. WScript.Echo(newlist.length); //0
  42. WScript.Echo(newlist.unshift(5,6,7)); //[5,6,7]
  43. WScript.Echo(newlist.length); //3
  44. WScript.Echo(newlist.unshift()); //3
  45. //
  46. // A few more tests of compat and overflow
  47. //
  48. function echo(v) {
  49. WScript.Echo(v);
  50. }
  51. function guarded_call(func) {
  52. try {
  53. func();
  54. } catch (e) {
  55. echo(e.name + " : " + e.message);
  56. }
  57. }
  58. function dump_array(arr) {
  59. echo("length: " + arr.length);
  60. for (var p in arr) {
  61. if (+p == p) {
  62. echo(" " + p + ": " + arr[p]);
  63. }
  64. }
  65. }
  66. echo("--- unshift 0");
  67. var a = [100, 101, 102];
  68. guarded_call(function () {
  69. echo(a.unshift());
  70. });
  71. echo(a);
  72. echo("--- unshift 1");
  73. var a = [];
  74. guarded_call(function () {
  75. var base = 4294967290;
  76. for (var i = 0; i < 10; i++) {
  77. a[base + i] = 100 + i;
  78. }
  79. delete a[base + 3];
  80. echo(a.unshift(200, 201, 202, 203));
  81. });
  82. dump_array(a);
  83. echo("Test: unshift should throw when length is not writable."); // WOOB 1139814.
  84. var a = {};
  85. var origLength = 1;
  86. Object.defineProperty(a, "length", { value: origLength, writable: false });
  87. a[0] = 0;
  88. try {
  89. Array.prototype.unshift.apply(a, ["x"]);
  90. } catch (ex) {
  91. echo("e instanceOf TypeError = " + (ex instanceof TypeError));
  92. }
  93. echo("a.length = " + a.length); // This should be unmodified.
  94. // Note that at this point although unshift throws, the array instance is modified as side-effect.
  95. // This is according to the spec (spec bug).
  96. //Bug 61822: array length was getting hoisted
  97. function test0(){
  98. var obj1 = {};
  99. var func0 = function(argObj0,argMath1){
  100. var __loopvar4 = 0;
  101. do {
  102. if (__loopvar4 > 3) break;
  103. __loopvar4++;
  104. } while(((argObj0.length-- ) - (ary.unshift(argObj0.prop0, d, argObj0.prop2))))
  105. }
  106. Object.prototype.method0 = func0;
  107. var ary = new Array(10);
  108. var d = 1;
  109. obj1.method0(ary);
  110. WScript.Echo("ary.length = " + (ary.length|0));
  111. };
  112. test0();
  113. function test1(arr)
  114. {
  115. for(var __loopvar4 = 0; __loopvar4 < 2; __loopvar4++)
  116. {
  117. arr.length --;
  118. arr.shift();
  119. }
  120. return arr.length;
  121. }
  122. WScript.Echo("arr.length = " + test1(new Array(10)));
  123. // OS 9357224: Array.prototype.unshift does not marshal parameters correctly
  124. function crossSiteUnshift() {
  125. var sc0 = WScript.LoadScript('', 'samethread');
  126. sc0.ary = [1];
  127. return sc0.eval('Array.prototype.unshift.call(ary, null)');
  128. }
  129. WScript.Echo("Crosssite new length: " + crossSiteUnshift()); // 2
  130. //
  131. // To check bailouts for inlined unshift
  132. //
  133. var a = ['1','d','e'];
  134. var x;
  135. var n=1; var m = 2;
  136. var d;
  137. function foo()
  138. {
  139. var x=2;
  140. var b = ['c','f'];
  141. a.unshift(b,x,x=1);
  142. a.unshift(b,x,x=2, a.unshift());
  143. a.unshift(b,x,x=3, a);
  144. a.unshift(b,x,x=4, n++, d = m+n); //n++ and d = m + n should only be calculated once
  145. WScript.Echo (n); //2
  146. WScript.Echo (d); //4
  147. a.unshift(b,x,x=5, d=Math.sin(n) + 1);
  148. WScript.Echo (x); //5
  149. }
  150. Array.prototype.unshift = function(){WScript.Echo ("Overridden unshift")};
  151. foo();
  152. WScript.Echo (a);