1b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Copyright 2010 the V8 project authors. All rights reserved. 2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without 3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are 4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met: 5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions of source code must retain the above copyright 7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// notice, this list of conditions and the following disclaimer. 8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions in binary form must reproduce the above 9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// copyright notice, this list of conditions and the following 10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// disclaimer in the documentation and/or other materials provided 11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// with the distribution. 12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contributors may be used to endorse or promote products derived 14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// from this software without specific prior written permission. 15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Regression test for bugs when deoptimizing after assignments in effect 29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contexts. 30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Bug 989 is that there was an extra value on the expression stack when 32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// deoptimizing after an assignment in effect context (the value of the 33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// assignment was lingering). This is hard to observe in the unoptimized 34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// code. 35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// This test uses comma expressions to put assignments in effect contexts, 37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// references to deleted global variables to force deoptimization, and 38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// function calls to observe an extra value. 39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction first(x, y) { return x; } 41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvar y = 0; 42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvar o = {}; 43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdocho.x = 0; 44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdocho[0] = 0; 45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Assignment to global variable. 47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx0 = 0; 48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test0() { return first((y = 1, typeof x0), 2); } 49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Call the function once to compile it. 50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test0()); 51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Delete to force deoptimization on the next call. 52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x0; 53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test0()); 54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Compound assignment to global variable. 56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx1 = 0; 57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test1() { return first((y += 1, typeof x1), 2); } 58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test1(), 'test1 before'); 59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x1; 60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test1(), 'test1 after'); 61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Pre and post-increment of global variable. 63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx2 = 0; 64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test2() { return first((++y, typeof x2), 2); } 65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test2(), 'test2 before'); 66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x2; 67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test2(), 'test2 after'); 68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx3 = 0; 70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test3() { return first((y++, typeof x3), 2); } 71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test3(), 'test3 before'); 72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x3; 73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test3(), 'test3 after'); 74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Assignment, compound assignment, and pre and post-increment of named 77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// properties. 78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx4 = 0; 79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test4() { return first((o.x = 1, typeof x4), 2); } 80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test4()); 81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x4; 82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test4()); 83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx5 = 0; 85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test5() { return first((o.x += 1, typeof x5), 2); } 86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test5()); 87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x5; 88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test5()); 89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx6 = 0; 91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test6() { return first((++o.x, typeof x6), 2); } 92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test6()); 93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x6; 94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test6()); 95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx7 = 0; 97b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test7() { return first((o.x++, typeof x7), 2); } 98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test7()); 99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x7; 100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test7()); 101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Assignment, compound assignment, and pre and post-increment of indexed 104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// properties. 105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx8 = 0; 106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test8(index) { return first((o[index] = 1, typeof x8), 2); } 107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test8()); 108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x8; 109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test8()); 110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx9 = 0; 112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test9(index) { return first((o[index] += 1, typeof x9), 2); } 113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test9()); 114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x9; 115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test9()); 116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx10 = 0; 118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test10(index) { return first((++o[index], typeof x10), 2); } 119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test10()); 120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x10; 121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test10()); 122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochx11 = 0; 124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction test11(index) { return first((o[index]++, typeof x11), 2); } 125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('number', test11()); 126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdelete x11; 127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertEquals('undefined', test11()); 128