1ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 2ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Redistribution and use in source and binary forms, with or without 3ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// modification, are permitted provided that the following conditions are 4ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// met: 5ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// 6ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// * Redistributions of source code must retain the above copyright 7ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// notice, this list of conditions and the following disclaimer. 8ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// * Redistributions in binary form must reproduce the above 9ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// copyright notice, this list of conditions and the following 10ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// disclaimer in the documentation and/or other materials provided 11ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// with the distribution. 12ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// * Neither the name of Google Inc. nor the names of its 13ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// contributors may be used to endorse or promote products derived 14ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// from this software without specific prior written permission. 15ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// 16ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 28ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Flags: --allow-natives-syntax 29ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 30ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Test deopt after generic store with effect context. 31ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar pro = { x : 1 } 32ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar a = {} 33ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orga.__proto__ = pro 34ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgdelete pro.x 35ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 36ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgfunction g(o) { 37ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return 7 + (o.z = 1, 20); 38ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org} 39ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 40ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgg(a); 41ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgg(a); 42ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org%OptimizeFunctionOnNextCall(g); 43ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgObject.defineProperty(pro, "z", { 44ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org set: function(v) { %DeoptimizeFunction(g); }, 45ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org get: function() { return 20; } 46ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}); 47ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 48ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertEquals(27, g(a)); 49ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 50ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Test deopt after polymorphic as monomorphic store with effect context. 51ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 52ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar i = { z : 2, r : 1 } 53ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar j = { z : 2 } 54ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar p = { a : 10 } 55ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar pp = { a : 20, b : 1 } 56ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 57ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgfunction bar(o, p) { 58ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return 7 + (o.z = 1, p.a); 59ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org} 60ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 61ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar(i, p); 62ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar(i, p); 63ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar(j, p); 64ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org%OptimizeFunctionOnNextCall(bar); 65ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertEquals(27, bar(i, pp)); 66ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 67ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Test deopt after polymorphic store with effect context. 68ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 69ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar i = { r : 1, z : 2 } 70ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar j = { z : 2 } 71ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar p = { a : 10 } 72ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar pp = { a : 20, b : 1 } 73ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 74ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgfunction bar1(o, p) { 75ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return 7 + (o.z = 1, p.a); 76ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org} 77ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 78ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar1(i, p); 79ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar1(i, p); 80ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar1(j, p); 81ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org%OptimizeFunctionOnNextCall(bar1); 82ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertEquals(27, bar1(i, pp)); 83