1// Copyright 2011 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28// Flags: --builtins-in-stack-traces 29 30 31// Poisonous object that throws a reference error if attempted converted to 32// a primitive values. 33var thrower = { valueOf: function() { FAIL; }, 34 toString: function() { FAIL; } }; 35 36// Tests that a native constructor function is included in the 37// stack trace. 38function testTraceNativeConstructor(nativeFunc) { 39 var nativeFuncName = nativeFunc.name; 40 try { 41 new nativeFunc(thrower); 42 assertUnreachable(nativeFuncName); 43 } catch (e) { 44 assertTrue(e.stack.indexOf(nativeFuncName) >= 0, nativeFuncName); 45 } 46} 47 48// Tests that a native conversion function is included in the 49// stack trace. 50function testTraceNativeConversion(nativeFunc) { 51 var nativeFuncName = nativeFunc.name; 52 try { 53 nativeFunc(thrower); 54 assertUnreachable(nativeFuncName); 55 } catch (e) { 56 assertTrue(e.stack.indexOf(nativeFuncName) >= 0, nativeFuncName); 57 } 58} 59 60 61function testNotOmittedBuiltin(throwing, included) { 62 try { 63 throwing(); 64 assertUnreachable(included); 65 } catch (e) { 66 assertTrue(e.stack.indexOf(included) >= 0, included); 67 } 68} 69 70 71testTraceNativeConversion(String); // Does ToString on argument. 72testTraceNativeConversion(Number); // Does ToNumber on argument. 73testTraceNativeConversion(RegExp); // Does ToString on argument. 74 75testTraceNativeConstructor(String); // Does ToString on argument. 76testTraceNativeConstructor(Number); // Does ToNumber on argument. 77testTraceNativeConstructor(RegExp); // Does ToString on argument. 78testTraceNativeConstructor(Date); // Does ToNumber on argument. 79 80// QuickSort has builtins object as receiver, and is non-native 81// builtin. Should not be omitted with the --builtins-in-stack-traces flag. 82testNotOmittedBuiltin(function(){ [thrower, 2].sort(function (a,b) { 83 (b < a) - (a < b); }); 84 }, "QuickSort"); 85 86// Not omitted even though ADD from runtime.js is a non-native builtin. 87testNotOmittedBuiltin(function(){ thrower + 2; }, "ADD");