Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2010 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 // Flags: --allow-natives-syntax
     29 
     30 // Check that constants and computed properties are overwriting each other
     31 // correctly, i.e., the last initializer for any name is stored in the object.
     32 
     33 
     34 // Tests for the full code generator (if active).
     35 
     36 var foo1 = {
     37   bar: 6,
     38   bar: 7
     39 };
     40 
     41 var foo2 = {
     42   bar: function(a){},
     43   bar: 7
     44 };
     45 
     46 var foo3 = {
     47   bar: function(a){},
     48   bar: function(b){},
     49   bar: 7
     50 };
     51 
     52 var foo4 = {
     53   bar: function(b){},
     54   bar: 4,
     55   bar: function(){return 7},
     56 };
     57 
     58 var foo5 = {
     59   13: function(a){},
     60   13: 7
     61 }
     62 
     63 var foo6 = {
     64   14.31: function(a){},
     65   14.31: 7
     66 }
     67 
     68 var foo7 = {
     69   15: 6,
     70   15: 7
     71 }
     72 
     73 function foo8(i) {
     74   var obj = {
     75     x: {a: i},
     76     x: 7
     77   };
     78   return obj.x;
     79 };
     80 
     81 assertEquals(7, foo1.bar);
     82 assertEquals(7, foo2.bar);
     83 assertEquals(7, foo3.bar);
     84 assertEquals(7, foo4.bar());
     85 assertEquals(7, foo5[13]);
     86 assertEquals(7, foo6[14.31]);
     87 assertEquals(7, foo7[15]);
     88 
     89 assertEquals(7, foo8(1));
     90 assertEquals(7, foo8(1));
     91 %OptimizeFunctionOnNextCall(foo8);
     92 assertEquals(7, foo8(1));
     93 
     94 
     95 // Test for the classic code generator.
     96 
     97 function fun(x) {
     98   var inner = { j: function(x) { return x; }, j: 7 };
     99   return inner.j;
    100 }
    101 
    102 assertEquals(7, fun(7) );
    103 
    104 // Check that the initializers of computed properties are executed, even if
    105 // no store instructions are generated for the literals.
    106 
    107 var glob1 = 0;
    108 
    109 var bar1 = { x: glob1++, x: glob1++, x: glob1++, x: 7};
    110 
    111 assertEquals(3, glob1);
    112 
    113 
    114 var glob2 = 0;
    115 
    116 function fun2() {
    117   var r = { y: glob2++, y: glob2++, y: glob2++, y: 7};
    118   return r.y;
    119 }
    120 
    121 var y = fun2();
    122 assertEquals(7, y);
    123 assertEquals(3, glob2);
    124 
    125 var glob3 = 0;
    126 
    127 function fun3() {
    128   var r = { 113: glob3++, 113: glob3++, 113: glob3++, 113: 7};
    129   return r[113];
    130 }
    131 
    132 var y = fun3();
    133 assertEquals(7, y);
    134 assertEquals(3, glob3);
    135