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