Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2013 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 --smi-only-arrays --expose-gc
     29 // Flags: --noalways-opt
     30 
     31 // Test element kind of objects.
     32 // Since --smi-only-arrays affects builtins, its default setting at compile
     33 // time sticks if built with snapshot.  If --smi-only-arrays is deactivated
     34 // by default, only a no-snapshot build actually has smi-only arrays enabled
     35 // in this test case.  Depending on whether smi-only arrays are actually
     36 // enabled, this test takes the appropriate code path to check smi-only arrays.
     37 
     38 // support_smi_only_arrays = %HasFastSmiElements(new Array(1,2,3,4,5,6,7,8));
     39 support_smi_only_arrays = true;
     40 
     41 if (support_smi_only_arrays) {
     42   print("Tests include smi-only arrays.");
     43 } else {
     44   print("Tests do NOT include smi-only arrays.");
     45 }
     46 
     47 var elements_kind = {
     48   fast_smi_only            :  'fast smi only elements',
     49   fast                     :  'fast elements',
     50   fast_double              :  'fast double elements',
     51   dictionary               :  'dictionary elements',
     52   external_byte            :  'external byte elements',
     53   external_unsigned_byte   :  'external unsigned byte elements',
     54   external_short           :  'external short elements',
     55   external_unsigned_short  :  'external unsigned short elements',
     56   external_int             :  'external int elements',
     57   external_unsigned_int    :  'external unsigned int elements',
     58   external_float           :  'external float elements',
     59   external_double          :  'external double elements',
     60   external_pixel           :  'external pixel elements'
     61 }
     62 
     63 function getKind(obj) {
     64   if (%HasFastSmiElements(obj)) return elements_kind.fast_smi_only;
     65   if (%HasFastObjectElements(obj)) return elements_kind.fast;
     66   if (%HasFastDoubleElements(obj)) return elements_kind.fast_double;
     67   if (%HasDictionaryElements(obj)) return elements_kind.dictionary;
     68 }
     69 
     70 function isHoley(obj) {
     71   if (%HasFastHoleyElements(obj)) return true;
     72   return false;
     73 }
     74 
     75 function assertKind(expected, obj, name_opt) {
     76   if (!support_smi_only_arrays &&
     77       expected == elements_kind.fast_smi_only) {
     78     expected = elements_kind.fast;
     79   }
     80   assertEquals(expected, getKind(obj), name_opt);
     81 }
     82 
     83 if (support_smi_only_arrays) {
     84 
     85   function get_literal(x) {
     86     var literal = [1, 2, x];
     87     return literal;
     88   }
     89 
     90   get_literal(3);
     91   // It's important to store a from before we crankshaft get_literal, because
     92   // mementos won't be created from crankshafted code at all.
     93   a = get_literal(3);
     94   %OptimizeFunctionOnNextCall(get_literal);
     95   get_literal(3);
     96   assertOptimized(get_literal);
     97   assertTrue(%HasFastSmiElements(a));
     98   // a has a memento so the transition caused by the store will affect the
     99   // boilerplate.
    100   a[0] = 3.5;
    101 
    102   // We should have transitioned the boilerplate array to double, and
    103   // crankshafted code should de-opt on the unexpected elements kind
    104   b = get_literal(3);
    105   assertTrue(%HasFastDoubleElements(b));
    106   assertEquals([1, 2, 3], b);
    107   assertUnoptimized(get_literal);
    108 
    109   // Optimize again
    110   get_literal(3);
    111   %OptimizeFunctionOnNextCall(get_literal);
    112   b = get_literal(3);
    113   assertTrue(%HasFastDoubleElements(b));
    114   assertOptimized(get_literal);
    115 
    116 
    117   // Test: make sure allocation site information is updated through a
    118   // transition from SMI->DOUBLE->FAST
    119   (function() {
    120     function bar(a, b, c) {
    121       return [a, b, c];
    122     }
    123 
    124     a = bar(1, 2, 3);
    125     a[0] = 3.5;
    126     a[1] = 'hi';
    127     b = bar(1, 2, 3);
    128     assertKind(elements_kind.fast, b);
    129   })();
    130 }
    131