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