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