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