1a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 2a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Redistribution and use in source and binary forms, with or without 3a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// modification, are permitted provided that the following conditions are 4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// met: 5a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// 6a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// * Redistributions of source code must retain the above copyright 7a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// notice, this list of conditions and the following disclaimer. 8a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// * Redistributions in binary form must reproduce the above 9a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// copyright notice, this list of conditions and the following 10a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// disclaimer in the documentation and/or other materials provided 11a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// with the distribution. 12a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// * Neither the name of Google Inc. nor the names of its 13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// contributors may be used to endorse or promote products derived 14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// from this software without specific prior written permission. 15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// 16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 28a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org// Flags: --allow-natives-syntax 29a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 30a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt with count operation on parameter. 31a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar max_smi = 1073741823; 32a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar o = {x:0}; 33a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 34a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign1(x) { x += 1; o.x = x; } 35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassign1(max_smi); 36a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(max_smi + 1, o.x); 37a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 38a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassign1(1.1); 39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(2.1, o.x); 40a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 42a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt with count operation on named property. 43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign2(p) { p.x += 1 } 44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 45a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = "42"; 46a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassign2(o); 47a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("421", o.x); 48a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 49a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgvar s = max_smi - 10; 50a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = s; 51a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor(var i = 0; i < 20; i++) { 52a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assign2(o); 53a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org if (i == 4) { 54a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org %OptimizeFunctionOnNextCall(assign2); 55a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } 56a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 57a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(max_smi + 10, o.x); 58a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 59a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 60a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt with count operation on keyed property. 61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign3(a, b) { a[b] += 1; } 62a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 63a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo = ["42"]; 64a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassign3(o, 0); 65a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("421", o[0]); 66a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 67a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgvar s = max_smi - 10; 68a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo[0] = s; 69a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor(var i = 0; i < 20; i++) { 70a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assign3(o, 0); 71a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org if (i == 4) { 72a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org %OptimizeFunctionOnNextCall(assign3); 73a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } 74a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 75a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(max_smi + 10, o[0]); 76a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 77a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign3(o, "0"); 78a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 79a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(max_smi + 11, o[0]); 80a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 81a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test bailout when accessing a non-existing array element. 82a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo[0] = 0; 83a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor(var i = 0; i < 5; i++) { 84a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assign3(o, 0); 85a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 86a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign3); 87a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign3(o, 0); 88a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign3(o, 1); 89a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 90a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test bailout with count operation in a value context. 91a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign5(x,y) { return (x += 1) + y; } 92a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; ++i) assertEquals(4, assign5(2, 1)); 93a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign5); 94a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(4, assign5(2, 1)); 95a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 96a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(4.1, assign5(2, 1.1)); 97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(4.1, assign5(2.1, 1)); 98a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 99a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign7(o,y) { return (o.x += 1) + y; } 100a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo = {x:0}; 101a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; ++i) { 102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org o.x = 42; 103a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assertEquals(44, assign7(o, 1)); 104a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 105a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign7); 106a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgo.x = 42; 107a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(44, assign7(o, 1)); 108a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = 42; 110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(44.1, assign7(o, 1.1)); 111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = 42.1; 112a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(44.1, assign7(o, 1)); 113a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign9(o,y) { return (o[0] += 1) + y; } 115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgq = [0]; 116a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; ++i) { 117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org q[0] = 42; 118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assertEquals(44, assign9(q, 1)); 119a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 120a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign9); 121a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgq[0] = 42; 122a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(44, assign9(q, 1)); 123a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgq[0] = 42; 125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(44.1, assign9(q, 1.1)); 126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgq[0] = 42.1; 127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(44.1, assign9(q, 1)); 128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 129a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt because of a failed map check on the load. 130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign10(p) { return p.x += 1 } 131a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar g1 = {x:0}; 132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar g2 = {y:0, x:42}; 133a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; ++i) { 134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org g1.x = 42; 135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assertEquals(43, assign10(g1)); 136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assertEquals(43, g1.x); 137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 138a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign10); 139a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgg1.x = 42; 140a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(43, assign10(g1)); 141a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(43, g1.x); 142a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(43, assign10(g2)); 144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(43, g2.x); 145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt because of a failed map check on the store. 147a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// The binary operation changes the map as a side effect. 148a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo = {x:0}; 149a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar g3 = { valueOf: function() { o.y = "bar"; return 42; }}; 150a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign11(p) { return p.x += 1; } 151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 152a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; i++) { 153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org o.x = "a"; 154a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assign11(o); 155a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 156a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign11); 157a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgo.x = "a"; 158a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign11(o); 159a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 160a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("a11", assign11(o)); 161a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = g3; 162a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(43, assign11(o)); 163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("bar", o.y); 164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo = [0]; 166a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar g4 = { valueOf: function() { o.y = "bar"; return 42; }}; 167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign12(p) { return p[0] += 1; } 168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 169a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; i++) { 170a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org o[0] = "a"; 171a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assign12(o); 172a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 173a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign12); 174a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgo[0] = "a"; 175a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign12(o); 176a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("a11", assign12(o)); 178a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo[0] = g4; 179a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(43, assign12(o)); 180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("bar", o.y); 181