13fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
23fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Redistribution and use in source and binary forms, with or without
33fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// modification, are permitted provided that the following conditions are
43fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// met:
53fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//
63fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//     * Redistributions of source code must retain the above copyright
73fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       notice, this list of conditions and the following disclaimer.
83fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//     * Redistributions in binary form must reproduce the above
93fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       copyright notice, this list of conditions and the following
103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       disclaimer in the documentation and/or other materials provided
113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       with the distribution.
123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       contributors may be used to endorse or promote products derived
143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       from this software without specific prior written permission.
153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//
163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Flags: --allow-natives-syntax
293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction init_array(a) {
303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (var i = 0; i < 10; ++i ){
313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    a[i] = i;
323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction init_sparse_array(a) {
363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (var i = 0; i < 10; ++i ){
373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    a[i] = i;
383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  a[5000000] = 256;
403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertTrue(%HasDictionaryElements(a));
413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction testPolymorphicLoads() {
443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  function make_polymorphic_load_function() {
453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    function load(a, i) {
463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return a[i];
473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    var object_array = new Object;
503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    var sparse_object_array = new Object;
513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    var js_array = new Array(10);
523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    var sparse_js_array = new Array(5000001);
533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    init_array(object_array);
553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    init_array(js_array);
563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    init_sparse_array(sparse_object_array);
573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    init_sparse_array(sparse_js_array);
583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    assertEquals(1, load(object_array, 1));
603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    assertEquals(1, load(js_array, 1));
613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    assertEquals(1, load(sparse_object_array, 1));
623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    assertEquals(1, load(sparse_js_array, 1));
633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return load;
653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var object_array = new Object;
683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var sparse_object_array = new Object;
693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var js_array = new Array(10);
703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var sparse_js_array = new Array(5000001);
713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  init_array(object_array);
733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  init_array(js_array);
743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  init_sparse_array(sparse_object_array);
753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  init_sparse_array(sparse_js_array);
763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  load = make_polymorphic_load_function();
783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(undefined, load(js_array, new Object()));
793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  load = make_polymorphic_load_function();
803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(undefined, load(object_array, new Object()));
813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  load = make_polymorphic_load_function();
823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(undefined, load(sparse_js_array, new Object()));
833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  load = make_polymorphic_load_function();
843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(undefined, load(sparse_object_array, new Object()));
853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Try with crankshaft.
873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  load = make_polymorphic_load_function();
883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %OptimizeFunctionOnNextCall(load);
893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(1, load(object_array, 1));
903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(1, load(js_array, 1));
913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(1, load(sparse_object_array, 1));
923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(1, load(sparse_js_array, 1));
933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  load = make_polymorphic_load_function();
953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %OptimizeFunctionOnNextCall(load);
963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(undefined, load(js_array, new Object()));
973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  load = make_polymorphic_load_function();
983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %OptimizeFunctionOnNextCall(load);
993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(undefined, load(object_array, new Object()));
1003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  load = make_polymorphic_load_function();
1013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %OptimizeFunctionOnNextCall(load);
1023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(undefined, load(sparse_js_array, new Object()));
1033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  load = make_polymorphic_load_function();
1043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %OptimizeFunctionOnNextCall(load);
1053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(undefined, load(sparse_object_array, new Object()));
1063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
1073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction testPolymorphicStores() {
1093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  function make_polymorphic_store_function() {
1103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    function store(a, i, val) {
1113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      a[i] = val;
1123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
1133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    var object_array = new Object;
1153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    var sparse_object_array = new Object;
1163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    var js_array = new Array(10);
1173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    var sparse_js_array = new Array(5000001);
1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    init_array(object_array);
1203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    init_array(js_array);
1213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    init_sparse_array(sparse_object_array);
1223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    init_sparse_array(sparse_js_array);
1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    store(object_array, 1, 256);
1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    store(js_array, 1, 256);
1263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    store(sparse_object_array, 1, 256);
1273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    store(sparse_js_array, 1, 256);
1283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return store;
1303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
1313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var object_array = new Object;
1333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var sparse_object_array = new Object;
1343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var js_array = new Array(10);
1353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var sparse_js_array = new Array(5000001);
1363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  init_array(object_array);
1383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  init_array(js_array);
1393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  init_sparse_array(sparse_object_array);
1403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  init_sparse_array(sparse_js_array);
1413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store = make_polymorphic_store_function();
1433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store(object_array, 2, 257);
1443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store = make_polymorphic_store_function();
1453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store(js_array, 2, 257);
1463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store = make_polymorphic_store_function();
1473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store(sparse_object_array, 2, 257);
1483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store = make_polymorphic_store_function();
1493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store(sparse_js_array, 2, 257);
1503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(257, object_array[2]);
1523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(257, js_array[2]);
1533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(257, sparse_js_array[2]);
1543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(257, sparse_object_array[2]);
1553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Now try Crankshaft optimized polymorphic stores
1573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store = make_polymorphic_store_function();
1583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %OptimizeFunctionOnNextCall(store);
1593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store(object_array, 3, 258);
1603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store = make_polymorphic_store_function();
1613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %OptimizeFunctionOnNextCall(store);
1623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store(js_array, 3, 258);
1633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store = make_polymorphic_store_function();
1643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %OptimizeFunctionOnNextCall(store);
1653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store(sparse_object_array, 3, 258);
1663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store = make_polymorphic_store_function();
1673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %OptimizeFunctionOnNextCall(store);
1683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  store(sparse_js_array, 3, 258);
1693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(258, object_array[3]);
1713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(258, js_array[3]);
1723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(258, sparse_js_array[3]);
1733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(258, sparse_object_array[3]);
1743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
1753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1763fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochtestPolymorphicLoads();
1773fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochtestPolymorphicStores();
178