18b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 28b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Redistribution and use in source and binary forms, with or without 38b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// modification, are permitted provided that the following conditions are 48b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// met: 58b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// 68b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// * Redistributions of source code must retain the above copyright 78b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// notice, this list of conditions and the following disclaimer. 88b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// * Redistributions in binary form must reproduce the above 98b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// copyright notice, this list of conditions and the following 108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// disclaimer in the documentation and/or other materials provided 118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// with the distribution. 128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// * Neither the name of Google Inc. nor the names of its 138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// contributors may be used to endorse or promote products derived 148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// from this software without specific prior written permission. 158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// 168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvar global = 0; 298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvar MAX = 1000000; 308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Attempt to inline strcit in non-strict. 328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction strictToBeInlined(n) { 348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch "use strict"; 358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch global = "strict"; 368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (n == MAX) { undefined_variable_strict = "value"; } 378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction nonstrictCallStrict(n) { 408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch strictToBeInlined(n); 418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch(function testInlineStrictInNonStrict() { 448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch for (var i = 0; i <= MAX; i ++) { 458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch try { 468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch nonstrictCallStrict(i); 478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } catch (e) { 488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch assertInstanceof(e, ReferenceError); 498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch assertEquals(MAX, i); 508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return; 518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch fail("ReferenceError after MAX iterations", "no exception"); 548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch})(); 558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Attempt to inline non-strict in strict. 578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction nonstrictToBeInlined(n) { 598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch global = "nonstrict"; 608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (n == MAX) { undefined_variable_nonstrict = "The nonstrict value"; } 618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction strictCallNonStrict(n) { 648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch "use strict"; 658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch nonstrictToBeInlined(n); 668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch(function testInlineNonStrictInStrict() { 698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch for (var i = 0; i <= MAX; i ++) { 708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch try { 718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch strictCallNonStrict(i); 728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } catch (e) { 738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch fail("no exception", "exception"); 748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch assertEquals("The nonstrict value", undefined_variable_nonstrict); 778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch})(); 788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Optimize strict function. 808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction strictAssignToUndefined(n) { 828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch "use strict"; 838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch global = "strict"; 848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (n == MAX) { undefined_variable_strict_2 = "value"; } 858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch(function testOptimizeStrictAssignToUndefined() { 888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch for (var i = 0; i <= MAX; i ++) { 898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch try { 908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch strictAssignToUndefined(i); 918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } catch (e) { 928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch assertInstanceof(e, ReferenceError); 938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch assertEquals(MAX, i); 948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return; 958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch fail("ReferenceError after MAX iterations", "no exception"); 988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch})(); 99