1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met: 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions of source code must retain the above copyright 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// notice, this list of conditions and the following disclaimer. 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions in binary form must reproduce the above 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// copyright notice, this list of conditions and the following 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// disclaimer in the documentation and/or other materials provided 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// with the distribution. 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Neither the name of Google Inc. nor the names of its 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// contributors may be used to endorse or promote products derived 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// from this software without specific prior written permission. 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --expose-gc --allow-natives-syntax 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction clear_all_ics() { 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %NotifyContextDisposed(); 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch gc(); 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch gc(); 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch gc(); 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test: verify that a monomorphic call retains the structural knowledge 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// of a global call, correctly throwing either ReferenceError or 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TypeError on undefined depending on how the call is made. 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() { 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo = function(arg) { return arg + 1; } 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function f() { foo(1); } 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Drive to monomorphic 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch f(); f(); f(); 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete foo; 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { f(); }, ReferenceError); 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo = function(arg) { return arg * 2; } 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertDoesNotThrow(function() { f(); }); 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch f(); f(); f(); 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete foo; 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { f(); }, ReferenceError); 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch clear_all_ics(); 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo = function(arg) { return arg * 3; } 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch f(); 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %OptimizeFunctionOnNextCall(f); 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch f(); 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete foo; 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { f(); }, ReferenceError); 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo = function(arg) { return arg * 3; } 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function g() { this.foo(1); } 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch g(); g(); g(); 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete foo; 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { g(); }, TypeError); 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo = function(arg) { return arg * 3; } 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch g(); 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %OptimizeFunctionOnNextCall(g); 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch g(); 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete foo; 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { g(); }, TypeError); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})(); 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test: verify that a load with IC does the right thing. 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() { 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var foo = function() { return a; } 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a = 3; 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo(); foo(); foo(); 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete a; 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { foo(); }, ReferenceError); 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a = "hi"; 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo(); 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch clear_all_ics(); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo(); 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %OptimizeFunctionOnNextCall(foo); 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo(); 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete a; 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { foo(); }, ReferenceError); 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo = function() { return this.a; } 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertDoesNotThrow(function() { foo(); }); 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})(); 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test: verify that a store with IC does the right thing. 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// If store is contextual and strict mode is set, throw a ReferenceError 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// if the variable isn't found. 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() { 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var foo = function() { a = 3; } 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var bar = function() { "use strict"; a = 3; } 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo(); foo(); foo(); 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete a; 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { bar(); }, ReferenceError); 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a = 6; 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch foo(); foo(); foo(); 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bar(); bar(); 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch clear_all_ics(); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bar(); 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %OptimizeFunctionOnNextCall(bar); 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bar(); 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete a; 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { bar(); }, ReferenceError); 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})(); 117