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