13e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// Copyright 2010 the V8 project authors. All rights reserved. 23e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// Redistribution and use in source and binary forms, with or without 33e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// modification, are permitted provided that the following conditions are 43e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// met: 53e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// 63e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// * Redistributions of source code must retain the above copyright 73e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// notice, this list of conditions and the following disclaimer. 83e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// * Redistributions in binary form must reproduce the above 93e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// copyright notice, this list of conditions and the following 103e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// disclaimer in the documentation and/or other materials provided 113e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// with the distribution. 123e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// * Neither the name of Google Inc. nor the names of its 133e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// contributors may be used to endorse or promote products derived 143e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// from this software without specific prior written permission. 153e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// 163e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 283e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu// Flags: --always-full-compiler 293e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 303e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhuvar functionToCatch; 313e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhuvar lineNumber; 323e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 333e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhufunction catchLineNumber () { 343e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu var x = {}; 353e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 363e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu Error.prepareStackTrace = function (error, stackTrace) { 373e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu stackTrace.some(function (frame) { 383e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu if (frame.getFunction() == functionToCatch) { 393e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu lineNumber = frame.getLineNumber(); 403e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu return true; 413e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu } 423e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu return false; 433e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu }); 443e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu return lineNumber; 453e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu }; 463e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 473e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu Error.captureStackTrace(x); 483e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu return x.stack; 493e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu} 503e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 513e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhufunction log() { 523e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu catchLineNumber(); 533e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu} 543e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 553e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhufunction foo() {} 563e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 573e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhufunction test1() { 583e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu log(foo() == foo() 593e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu ? 'a' 603e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu : 'b'); 613e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu} 623e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 633e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhufunction test2() { 643e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu var o = { foo: function () {}} 653e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu log(o.foo() == o.foo() 663e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu ? 'a' 673e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu : 'b'); 683e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu} 693e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 703e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhufunction test3() { 713e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu var o = { log: log, foo: function() { } }; 723e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu o.log(o.foo() == o.foo() 733e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu ? 'a' 743e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu : 'b'); 753e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 763e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu} 773e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 783e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhufunction test(f, expectedLineNumber) { 793e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu functionToCatch = f; 803e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu f(); 813e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 823e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu assertEquals(expectedLineNumber, lineNumber); 833e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu} 843e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 853e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhutest(test1, 58); 863e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhutest(test2, 65); 873e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhutest(test3, 72); 883e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 893e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhueval(test1.toString() + "//@ sourceUrl=foo"); 903e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhueval(test2.toString() + "//@ sourceUrl=foo"); 913e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhueval(test3.toString() + "//@ sourceUrl=foo"); 923e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 933e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhutest(test1, 2); 943e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhutest(test2, 3); 953e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhutest(test3, 3); 96