1f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 2f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// Redistribution and use in source and binary forms, with or without 3f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// modification, are permitted provided that the following conditions are 4f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// met: 5f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// 6f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// * Redistributions of source code must retain the above copyright 7f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// notice, this list of conditions and the following disclaimer. 8f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// * Redistributions in binary form must reproduce the above 9f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// copyright notice, this list of conditions and the following 10f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// disclaimer in the documentation and/or other materials provided 11f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// with the distribution. 12f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// * Neither the name of Google Inc. nor the names of its 13f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// contributors may be used to endorse or promote products derived 14f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// from this software without specific prior written permission. 15f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// 16f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 281af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org// Flags: --nocrankshaft 29f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 30f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgvar functionToCatch; 31f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgvar lineNumber; 32f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 33f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgfunction catchLineNumber () { 34f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org var x = {}; 35f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 36f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org Error.prepareStackTrace = function (error, stackTrace) { 37f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org stackTrace.some(function (frame) { 38f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org if (frame.getFunction() == functionToCatch) { 39f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org lineNumber = frame.getLineNumber(); 40f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org return true; 41f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org } 42f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org return false; 43f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org }); 44f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org return lineNumber; 45f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org }; 46f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 47f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org Error.captureStackTrace(x); 48f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org return x.stack; 49f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org} 50f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 51f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgfunction log() { 52f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org catchLineNumber(); 53f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org} 54f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 55f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgfunction foo() {} 56f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 57f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgfunction test1() { 58f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org log(foo() == foo() 59f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org ? 'a' 60f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org : 'b'); 61f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org} 62f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 63f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgfunction test2() { 64f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org var o = { foo: function () {}} 65f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org log(o.foo() == o.foo() 66f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org ? 'a' 67f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org : 'b'); 68f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org} 69f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 70f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgfunction test3() { 71f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org var o = { log: log, foo: function() { } }; 72f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org o.log(o.foo() == o.foo() 73f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org ? 'a' 74f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org : 'b'); 75f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 76f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org} 77f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 78f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgfunction test(f, expectedLineNumber) { 79f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org functionToCatch = f; 80f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org f(); 81f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 82f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org assertEquals(expectedLineNumber, lineNumber); 83f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org} 84f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 85f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgtest(test1, 58); 86f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgtest(test2, 65); 87f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgtest(test3, 72); 88f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 89f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgeval(test1.toString() + "//@ sourceUrl=foo"); 90f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgeval(test2.toString() + "//@ sourceUrl=foo"); 91f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgeval(test3.toString() + "//@ sourceUrl=foo"); 92f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 93f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgtest(test1, 2); 94f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgtest(test2, 3); 95f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgtest(test3, 3); 96