1d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 2d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 3d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 4d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Redistribution and use in source and binary forms, with or without 5d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// modification, are permitted provided that the following conditions 6d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// are met: 7d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 1. Redistributions of source code must retain the above copyright 8d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// notice, this list of conditions and the following disclaimer. 9d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 2. Redistributions in binary form must reproduce the above copyright 10d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// notice, this list of conditions and the following disclaimer in the 11d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// documentation and/or other materials provided with the distribution. 12d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 13d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 14d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 17d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 20d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 24d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgdescription("This test how deep we can recurse, and that we get an exception when we do, as opposed to a stack overflow."); 25d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 26d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org function simpleRecursion(depth) { 27d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org if (depth) 28d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org simpleRecursion(depth - 1); 29d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 30d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 31d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org try { 32d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org simpleRecursion(17472); 33d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } catch (ex) { 34d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org debug("FAIL: " + ex); 35d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 36d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 37d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org try { 38d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org simpleRecursion(10000000); 39d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } catch (ex) { 40d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var msg = String(eval(ex)); 41d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org shouldBe("msg", "'RangeError: Maximum call stack size exceeded.'"); 42d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 43d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 44d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org try { 45d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org simpleRecursion(1000000000); 46d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } catch (ex) { 47d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var msg = String(eval(ex)); 48d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org shouldBe("msg", "'RangeError: Maximum call stack size exceeded.'"); 49d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 50d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 51d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var tooFewArgsDepth = 0; 52d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 53d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org function tooFewArgsRecursion(a) { 54d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org if (tooFewArgsDepth) { 55d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org tooFewArgsDepth--; 56d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org tooFewArgsRecursion(); 57d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 58d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 59d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 60d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org try { 61d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org tooFewArgsDepth = 10000000; 62d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org tooFewArgsRecursion(); 63d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } catch (ex) { 64d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var msg = String(eval(ex)); 65d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org shouldBe("msg", "'RangeError: Maximum call stack size exceeded.'"); 66d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 67d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 68d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org function tooManyArgsRecursion(depth) { 69d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org if (depth) 70d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org tooManyArgsRecursion(depth - 1, 1); 71d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 72d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 73d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org try { 74d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org tooManyArgsRecursion(10000000, 1); 75d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } catch (ex) { 76d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org var msg = String(eval(ex)); 77d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org shouldBe("msg", "'RangeError: Maximum call stack size exceeded.'"); 78f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org } 79