16d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
26d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// Redistribution and use in source and binary forms, with or without
36d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// modification, are permitted provided that the following conditions are
46d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// met:
56d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//
66d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//     * Redistributions of source code must retain the above copyright
76d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//       notice, this list of conditions and the following disclaimer.
86d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//     * Redistributions in binary form must reproduce the above
96d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//       copyright notice, this list of conditions and the following
106d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//       disclaimer in the documentation and/or other materials provided
116d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//       with the distribution.
126d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//     * Neither the name of Google Inc. nor the names of its
136d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//       contributors may be used to endorse or promote products derived
146d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//       from this software without specific prior written permission.
156d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org//
166d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
286d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// Check that reduce and reduceRight call the callback function with
296d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// undefined as the receiver (which for non-strict functions is
306d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// transformed to the global object).
316d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
326d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// Check receiver for reduce and reduceRight.
336d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
346d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgvar global = this;
356d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgfunction non_strict(){ assertEquals(global, this); }
366d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgfunction strict(){ "use strict"; assertEquals(void 0, this); }
376d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgfunction strict_null(){ "use strict"; assertEquals(null, this); }
386d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
396d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].reduce(non_strict);
406d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].reduce(strict);
416d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].reduceRight(non_strict);
426d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].reduceRight(strict);
436d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
446d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// Check the receiver for callbacks in other array methods.
466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].every(non_strict);
476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].every(non_strict, undefined);
486d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].every(non_strict, null);
496d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].every(strict);
506d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].every(strict, undefined);
516d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].every(strict_null, null);
526d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
536d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].filter(non_strict);
546d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].filter(non_strict, undefined);
556d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].filter(non_strict, null);
566d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].filter(strict);
576d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].filter(strict, undefined);
586d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].filter(strict_null, null);
596d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
606d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].forEach(non_strict);
616d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].forEach(non_strict, undefined);
626d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].forEach(non_strict, null);
636d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].forEach(strict);
646d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].forEach(strict, undefined);
656d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].forEach(strict_null, null);
666d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
676d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].map(non_strict);
686d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].map(non_strict, undefined);
696d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].map(non_strict, null);
706d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].map(strict);
716d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].map(strict, undefined);
726d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].map(strict_null, null);
736d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
746d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].some(non_strict);
756d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].some(non_strict, undefined);
766d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].some(non_strict, null);
776d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].some(strict);
786d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].some(strict, undefined);
796d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org[2, 3].some(strict_null, null);
80