1f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// Redistribution and use in source and binary forms, with or without
3f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// modification, are permitted provided that the following conditions are
4f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// met:
5f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//
6f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//     * Redistributions of source code must retain the above copyright
7f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//       notice, this list of conditions and the following disclaimer.
8f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//     * Redistributions in binary form must reproduce the above
9f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//       copyright notice, this list of conditions and the following
10f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//       disclaimer in the documentation and/or other materials provided
11f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//       with the distribution.
12f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//     * Neither the name of Google Inc. nor the names of its
13f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//       contributors may be used to endorse or promote products derived
14f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//       from this software without specific prior written permission.
15f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org//
16f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
28f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvar o = [ function f0() { throw new Error(); },
29f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org          function f1() { o[0](); },
30f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org          function f2() { o[1](); },
31f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org          function f3() { o[2](); } ];
32f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
33f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgError.prepareStackTrace = function(error, frames) {
34f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Error.prepareStackTrace = undefined;  // Prevent recursion.
35f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  try {
36f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    assertEquals(5, frames.length);
37f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    // Don't check the last frame since that's the top-level code.
38f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    for (var i = 0; i < frames.length - 1; i++) {
39f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(o[i], frames[i].getFunction());
40f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(o, frames[i].getThis());
41f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      // Private fields are no longer accessible.
42f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(undefined, frames[i].receiver);
43f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(undefined, frames[i].fun);
44f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(undefined, frames[i].pos);
45f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    }
46f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return "success";
47f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  } catch (e) {
48f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return "fail";
49f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
50f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
51f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
52f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgtry {
53f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  o[3]();
54f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org} catch (e) {
55f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  assertEquals("success", e.stack);
56f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org};
57f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
58f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
59f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvar o = [ function f0() { throw new Error(); },
60f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org          function f1() { o[0](); },
61f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org          function f2() { "use strict"; o[1](); },
62f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org          function f3() { o[2](); } ];
63f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
64f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgError.prepareStackTrace = function(error, frames) {
65f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Error.prepareStackTrace = undefined;  // Prevent recursion.
66f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  try {
67f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    assertEquals(5, frames.length);
68f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    for (var i = 0; i < 2; i++) {
69f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      // The first two frames are still classic mode.
70f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(o[i], frames[i].getFunction());
71f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(o, frames[i].getThis());
72f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    }
73f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    for (var i = 2; i < frames.length; i++) {
74f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      // The rest are poisoned by the first strict mode function.
75f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(undefined, frames[i].getFunction());
76f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(undefined, frames[i].getThis());
77f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    }
78f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    for (var i = 0; i < frames.length - 1; i++) {
79f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      // Function name remains accessible.
80f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals("f"+i, frames[i].getFunctionName());
81f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    }
82f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return "success";
83f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  } catch (e) {
84f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return e;
85f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
86f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
87f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
88f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgtry {
89f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  o[3]();
90f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org} catch (e) {
91f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  assertEquals("success", e.stack);
92f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org};
93f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
94f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
95f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvar o = [ function f0() { "use strict"; throw new Error(); },
96f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org          function f1() { o[0](); },
97f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org          function f2() { o[1](); },
98f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org          function f3() { o[2](); } ];
99f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
100f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgError.prepareStackTrace = function(error, frames) {
101f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Error.prepareStackTrace = undefined;  // Prevent recursion.
102f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  try {
103f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    assertEquals(5, frames.length);
104f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    for (var i = 0; i < frames.length; i++) {
105f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      // The rest are poisoned by the first strict mode function.
106f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(undefined, frames[i].getFunction());
107f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      assertEquals(undefined, frames[i].getThis());
108f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      if (i < frames.length - 1) {  // Function name remains accessible.
109f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        assertEquals("f"+i, frames[i].getFunctionName());
110f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      }
111f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    }
112f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return "success";
113f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  } catch (e) {
114f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return e;
115f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
116f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
117f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
118f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgtry {
119f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  o[3]();
120f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org} catch (e) {
121f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  assertEquals("success", e.stack);
122f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org};
123