11510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
21510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
31510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org//
41510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Redistribution and use in source and binary forms, with or without
51510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// modification, are permitted provided that the following conditions
61510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// are met:
71510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// 1.  Redistributions of source code must retain the above copyright
81510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org//     notice, this list of conditions and the following disclaimer.
91510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// 2.  Redistributions in binary form must reproduce the above copyright
101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org//     notice, this list of conditions and the following disclaimer in the
111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org//     documentation and/or other materials provided with the distribution.
121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org//
131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgdescription(
251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org"This tests that we can correctly call Function.prototype.apply"
261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org);
271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvar myObject = { apply: function() { return [myObject, "myObject.apply"] } };
291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvar myFunction = function (arg1) {
301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return [this, "myFunction", arg1];
311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org};
321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvar myFunctionWithApply = function (arg1) {
331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return [this, "myFunctionWithApply", arg1];
341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org};
351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgfunction forwarder(f, thisValue, args) {
371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    function g() {
381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org        return f.apply(thisValue, arguments);
391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return g.apply(null, args);
411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgfunction recurseArguments() {
431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    recurseArguments.apply(null, arguments);
441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgmyFunctionWithApply.apply = function (arg1) { return [this, "myFunctionWithApply.apply", arg1] };
471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgFunction.prototype.aliasedApply = Function.prototype.apply;
481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvar arg1Array = ['arg1'];
491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myObject.apply()", '[myObject, "myObject.apply"]');
511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("forwarder(myObject)", '[myObject, "myObject.apply"]');
521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction('arg1')", '[this, "myFunction", "arg1"]');
531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("forwarder(myFunction, null, ['arg1'])", '[this, "myFunction", "arg1"]');
541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction.apply(myObject, ['arg1'])", '[myObject, "myFunction", "arg1"]');
551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction.apply(myObject, arg1Array)", '[myObject, "myFunction", "arg1"]');
561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("forwarder(myFunction, myObject, arg1Array)", '[myObject, "myFunction", "arg1"]');
571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction.apply()", '[this, "myFunction", undefined]');
581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction.apply(null)", '[this, "myFunction", undefined]');
591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction.apply(undefined)", '[this, "myFunction", undefined]');
601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction.aliasedApply(myObject, ['arg1'])", '[myObject, "myFunction", "arg1"]');
611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction.aliasedApply()", '[this, "myFunction", undefined]');
621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction.aliasedApply(null)", '[this, "myFunction", undefined]');
631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunction.aliasedApply(undefined)", '[this, "myFunction", undefined]');
641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunctionWithApply.apply(myObject, ['arg1'])", '[myFunctionWithApply, "myFunctionWithApply.apply", myObject]');
651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunctionWithApply.aliasedApply(myObject, ['arg1'])", '[myObject, "myFunctionWithApply", "arg1"]');
661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunctionWithApply.apply(myObject, arg1Array)", '[myFunctionWithApply, "myFunctionWithApply.apply", myObject]');
671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("forwarder(myFunctionWithApply, myObject, arg1Array)", '[myFunctionWithApply, "myFunctionWithApply.apply", myObject]');
681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldBe("myFunctionWithApply.aliasedApply(myObject, arg1Array)", '[myObject, "myFunctionWithApply", "arg1"]');
691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgfunction stackOverflowTest() {
711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    try {
721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org        var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;
731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org        stackOverflowTest();
741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    } catch(e) {
751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org        // Blow the stack with a sparse array
761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org        shouldThrow("myFunction.apply(null, new Array(5000000))");
771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org        // Blow the stack with a sparse array that is sufficiently large to cause int overflow
781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org        shouldThrow("myFunction.apply(null, new Array(1 << 30))");
791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstackOverflowTest();
821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Blow the stack recursing with arguments
841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgshouldThrow("recurseArguments.apply(null, new Array(50000))");
85