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