Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2011 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 function init_array(a) {
     30   for (var i = 0; i < 10; ++i ){
     31     a[i] = i;
     32   }
     33 }
     34 
     35 function init_sparse_array(a) {
     36   for (var i = 0; i < 10; ++i ){
     37     a[i] = i;
     38   }
     39   a[5000000] = 256;
     40   assertTrue(%HasDictionaryElements(a));
     41 }
     42 
     43 function testPolymorphicLoads() {
     44   function make_polymorphic_load_function() {
     45     function load(a, i) {
     46       return a[i];
     47     }
     48 
     49     var object_array = new Object;
     50     var sparse_object_array = new Object;
     51     var js_array = new Array(10);
     52     var sparse_js_array = new Array(5000001);
     53 
     54     init_array(object_array);
     55     init_array(js_array);
     56     init_sparse_array(sparse_object_array);
     57     init_sparse_array(sparse_js_array);
     58 
     59     assertEquals(1, load(object_array, 1));
     60     assertEquals(1, load(js_array, 1));
     61     assertEquals(1, load(sparse_object_array, 1));
     62     assertEquals(1, load(sparse_js_array, 1));
     63 
     64     return load;
     65   }
     66 
     67   var object_array = new Object;
     68   var sparse_object_array = new Object;
     69   var js_array = new Array(10);
     70   var sparse_js_array = new Array(5000001);
     71 
     72   init_array(object_array);
     73   init_array(js_array);
     74   init_sparse_array(sparse_object_array);
     75   init_sparse_array(sparse_js_array);
     76 
     77   load = make_polymorphic_load_function();
     78   assertEquals(undefined, load(js_array, new Object()));
     79   load = make_polymorphic_load_function();
     80   assertEquals(undefined, load(object_array, new Object()));
     81   load = make_polymorphic_load_function();
     82   assertEquals(undefined, load(sparse_js_array, new Object()));
     83   load = make_polymorphic_load_function();
     84   assertEquals(undefined, load(sparse_object_array, new Object()));
     85 
     86   // Try with crankshaft.
     87   load = make_polymorphic_load_function();
     88   %OptimizeFunctionOnNextCall(load);
     89   assertEquals(1, load(object_array, 1));
     90   assertEquals(1, load(js_array, 1));
     91   assertEquals(1, load(sparse_object_array, 1));
     92   assertEquals(1, load(sparse_js_array, 1));
     93 
     94   load = make_polymorphic_load_function();
     95   %OptimizeFunctionOnNextCall(load);
     96   assertEquals(undefined, load(js_array, new Object()));
     97   load = make_polymorphic_load_function();
     98   %OptimizeFunctionOnNextCall(load);
     99   assertEquals(undefined, load(object_array, new Object()));
    100   load = make_polymorphic_load_function();
    101   %OptimizeFunctionOnNextCall(load);
    102   assertEquals(undefined, load(sparse_js_array, new Object()));
    103   load = make_polymorphic_load_function();
    104   %OptimizeFunctionOnNextCall(load);
    105   assertEquals(undefined, load(sparse_object_array, new Object()));
    106 }
    107 
    108 function testPolymorphicStores() {
    109   function make_polymorphic_store_function() {
    110     function store(a, i, val) {
    111       a[i] = val;
    112     }
    113 
    114     var object_array = new Object;
    115     var sparse_object_array = new Object;
    116     var js_array = new Array(10);
    117     var sparse_js_array = new Array(5000001);
    118 
    119     init_array(object_array);
    120     init_array(js_array);
    121     init_sparse_array(sparse_object_array);
    122     init_sparse_array(sparse_js_array);
    123 
    124     store(object_array, 1, 256);
    125     store(js_array, 1, 256);
    126     store(sparse_object_array, 1, 256);
    127     store(sparse_js_array, 1, 256);
    128 
    129     return store;
    130   }
    131 
    132   var object_array = new Object;
    133   var sparse_object_array = new Object;
    134   var js_array = new Array(10);
    135   var sparse_js_array = new Array(5000001);
    136 
    137   init_array(object_array);
    138   init_array(js_array);
    139   init_sparse_array(sparse_object_array);
    140   init_sparse_array(sparse_js_array);
    141 
    142   store = make_polymorphic_store_function();
    143   store(object_array, 2, 257);
    144   store = make_polymorphic_store_function();
    145   store(js_array, 2, 257);
    146   store = make_polymorphic_store_function();
    147   store(sparse_object_array, 2, 257);
    148   store = make_polymorphic_store_function();
    149   store(sparse_js_array, 2, 257);
    150 
    151   assertEquals(257, object_array[2]);
    152   assertEquals(257, js_array[2]);
    153   assertEquals(257, sparse_js_array[2]);
    154   assertEquals(257, sparse_object_array[2]);
    155 
    156   // Now try Crankshaft optimized polymorphic stores
    157   store = make_polymorphic_store_function();
    158   %OptimizeFunctionOnNextCall(store);
    159   store(object_array, 3, 258);
    160   store = make_polymorphic_store_function();
    161   %OptimizeFunctionOnNextCall(store);
    162   store(js_array, 3, 258);
    163   store = make_polymorphic_store_function();
    164   %OptimizeFunctionOnNextCall(store);
    165   store(sparse_object_array, 3, 258);
    166   store = make_polymorphic_store_function();
    167   %OptimizeFunctionOnNextCall(store);
    168   store(sparse_js_array, 3, 258);
    169 
    170   assertEquals(258, object_array[3]);
    171   assertEquals(258, js_array[3]);
    172   assertEquals(258, sparse_js_array[3]);
    173   assertEquals(258, sparse_object_array[3]);
    174 }
    175 
    176 testPolymorphicLoads();
    177 testPolymorphicStores();
    178