Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2008 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 function f0() {
     29   return this;
     30 }
     31 
     32 function f1(a) {
     33   return a;
     34 }
     35 
     36 assertSame(this, f0.apply(), "1-0");
     37 
     38 assertSame(this, f0.apply(this), "2a");
     39 assertSame(this, f0.apply(this, new Array(1)), "2b");
     40 assertSame(this, f0.apply(this, new Array(2)), "2c");
     41 assertSame(this, f0.apply(this, new Array(4242)), "2d");
     42 
     43 assertSame(this, f0.apply(null), "3a");
     44 assertSame(this, f0.apply(null, new Array(1)), "3b");
     45 assertSame(this, f0.apply(null, new Array(2)), "3c");
     46 assertSame(this, f0.apply(this, new Array(4242)), "3d");
     47 
     48 assertSame(this, f0.apply(void 0), "4a");
     49 assertSame(this, f0.apply(void 0, new Array(1)), "4b");
     50 assertSame(this, f0.apply(void 0, new Array(2)), "4c");
     51 
     52 assertEquals(void 0, f1.apply(), "1-1");
     53 
     54 assertEquals(void 0, f1.apply(this), "5a");
     55 assertEquals(void 0, f1.apply(this, new Array(1)), "5b");
     56 assertEquals(void 0, f1.apply(this, new Array(2)), "5c");
     57 assertEquals(void 0, f1.apply(this, new Array(4242)), "5d");
     58 assertEquals(42, f1.apply(this, new Array(42, 43)), "5e");
     59 assertEquals("foo", f1.apply(this, new Array("foo", "bar", "baz", "bo")), "5f");
     60 
     61 assertEquals(void 0, f1.apply(null), "6a");
     62 assertEquals(void 0, f1.apply(null, new Array(1)), "6b");
     63 assertEquals(void 0, f1.apply(null, new Array(2)), "6c");
     64 assertEquals(void 0, f1.apply(null, new Array(4242)), "6d");
     65 assertEquals(42, f1.apply(null, new Array(42, 43)), "6e");
     66 assertEquals("foo", f1.apply(null, new Array("foo", "bar", "baz", "bo")), "6f");
     67 
     68 assertEquals(void 0, f1.apply(void 0), "7a");
     69 assertEquals(void 0, f1.apply(void 0, new Array(1)), "7b");
     70 assertEquals(void 0, f1.apply(void 0, new Array(2)), "7c");
     71 assertEquals(void 0, f1.apply(void 0, new Array(4242)), "7d");
     72 assertEquals(42, f1.apply(void 0, new Array(42, 43)), "7e");
     73 assertEquals("foo", f1.apply(void 0, new Array("foo", "bar", "ba", "b")), "7f");
     74 
     75 var arr = new Array(42, "foo", "fish", "horse");
     76 function j(a, b, c, d, e, f, g, h, i, j, k, l) {
     77   return "" + a + b + c + d + e + f + g + h + i + j + k + l;
     78 }
     79 
     80 
     81 var expect = "42foofishhorse";
     82 for (var i = 0; i < 8; i++)
     83   expect += "undefined";
     84 assertEquals(expect, j.apply(undefined, arr), "apply to undefined");
     85 
     86 assertThrows("f0.apply(this, 1);");
     87 assertThrows("f0.apply(this, 1, 2);");
     88 assertThrows("f0.apply(this, 1, new Array(2));");
     89 
     90 function f() {
     91   var doo = "";
     92   for (var i = 0; i < arguments.length; i++) {
     93     doo += arguments[i];
     94   }
     95   return doo;
     96 }
     97 
     98 assertEquals("42foofishhorse", f.apply(this, arr), "apply to this");
     99 
    100 function s() {
    101   var doo = this;
    102   for (var i = 0; i < arguments.length; i++) {
    103     doo += arguments[i];
    104   }
    105   return doo;
    106 }
    107 
    108 assertEquals("bar42foofishhorse", s.apply("bar", arr), "apply to string");
    109 
    110 function al() {
    111   assertEquals(Object(345), this);
    112   return arguments.length + arguments[arguments.length - 1];
    113 }
    114 
    115 for (var j = 1; j < 0x40000000; j <<= 1) {
    116   try {
    117     var a = new Array(j);
    118     a[j - 1] = 42;
    119     assertEquals(42 + j, al.apply(345, a));
    120   } catch (e) {
    121     assertTrue(e.toString().indexOf("Maximum call stack size exceeded") != -1);
    122     for (; j < 0x40000000; j <<= 1) {
    123       var caught = false;
    124       try {
    125         a = new Array(j);
    126         a[j - 1] = 42;
    127         al.apply(345, a);
    128         assertUnreachable("Apply of array with length " + a.length +
    129                           " should have thrown");
    130       } catch (e) {
    131         assertTrue(e.toString().indexOf("Maximum call stack size exceeded") != -1);
    132         caught = true;
    133       }
    134       assertTrue(caught, "exception not caught");
    135     }
    136     break;
    137   }
    138 }
    139 
    140 var primes = new Array(0);
    141 
    142 function isPrime(possible_prime) {
    143   for (var d = 0; d < primes.length; d++) {
    144     var p = primes[d];
    145     if (possible_prime % p == 0)
    146       return false;
    147     if (p * p > possible_prime)
    148       return true;
    149   }
    150   return true;
    151 }
    152 
    153 for (var i = 2; i < 10000; i++) {
    154   if (isPrime(i)) {
    155     primes.push(i);
    156   }
    157 }
    158 
    159 assertEquals(1229, primes.length);
    160 
    161 var same_primes = Array.prototype.constructor.apply(Array, primes);
    162 
    163 for (var i = 0; i < primes.length; i++)
    164   assertEquals(primes[i], same_primes[i], "prime" + primes[i]);
    165 assertEquals(primes.length, same_primes.length, "prime-length");
    166 
    167 
    168 Array.prototype["1"] = "sep";
    169 
    170 var holey = new Array(3);
    171 holey[0] = "mor";
    172 holey[2] = "er";
    173 
    174 assertEquals("morseper", String.prototype.concat.apply("", holey),
    175              "moreseper0");
    176 assertEquals("morseper", String.prototype.concat.apply("", holey, 1),
    177              "moreseper1");
    178 assertEquals("morseper", String.prototype.concat.apply("", holey, 1, 2),
    179              "moreseper2");
    180 assertEquals("morseper", String.prototype.concat.apply("", holey, 1, 2, 3),
    181              "morseper3");
    182 assertEquals("morseper", String.prototype.concat.apply("", holey, 1, 2, 3, 4),
    183              "morseper4");
    184 
    185 primes[0] = "";
    186 primes[1] = holey;
    187 assertThrows("String.prototype.concat.apply.apply('foo', primes)");
    188 assertEquals("morseper",
    189     String.prototype.concat.apply.apply(String.prototype.concat, primes),
    190     "moreseper-prime");
    191 
    192 delete(Array.prototype["1"]);
    193 
    194 // Check correct handling of non-array argument lists.
    195 assertSame(this, f0.apply(this, {}), "non-array-1");
    196 assertSame(this, f0.apply(this, { length:1 }), "non-array-2");
    197 assertEquals(void 0, f1.apply(this, { length:1 }), "non-array-3");
    198 assertEquals(void 0, f1.apply(this, { 0:"foo" }), "non-array-4");
    199 assertEquals("foo", f1.apply(this, { length:1, 0:"foo" }), "non-array-5");
    200