1ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Copyright 2009 the V8 project authors. All rights reserved. 2ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Redistribution and use in source and binary forms, with or without 3ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// modification, are permitted provided that the following conditions are 4ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// met: 5ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// 6ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// * Redistributions of source code must retain the above copyright 7ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// notice, this list of conditions and the following disclaimer. 8ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// * Redistributions in binary form must reproduce the above 9ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// copyright notice, this list of conditions and the following 10ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// disclaimer in the documentation and/or other materials provided 11ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// with the distribution. 12ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// * Neither the name of Google Inc. nor the names of its 13ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// contributors may be used to endorse or promote products derived 14ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// from this software without specific prior written permission. 15ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// 16ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Testing basic functionality of the arguments object. 28ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Introduced to ensure that the fast compiler does the right thing. 29ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// The arguments object itself. 30ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ return arguments;}(42)[0], 31ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "return arguments value"); 32ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ return arguments;}(42)[0], 33ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "arguments in plain value context"); 34ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ arguments;return 42}(37), 35ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "arguments in effect context"); 36ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ if(arguments)return 42;}(), 37ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "arguments in a boolean context"); 38ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ return arguments || true;}(42)[0], 39ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "arguments in a short-circuit boolean context - or"); 40ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(true, function(){ return arguments && [true];}(42)[0], 41ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "arguments in a short-circuit boolean context - and"); 42ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ arguments = 42; return 42;}(), 43ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "arguments assignment"); 44ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Properties of the arguments object. 45ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ return arguments[0]; }(42), 46ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "args[0] value returned"); 47ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ arguments[0]; return 42}(), 48ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "args[0] value ignored"); 49ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ if (arguments[0]) return 42; }(37), 50ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "args[0] to boolean"); 51ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ return arguments[0] || "no"; }(42), 52ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "args[0] short-circuit boolean or true"); 53ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ return arguments[0] || 42; }(0), 54ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "args[0] short-circuit boolean or false"); 55ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(37, function(){ return arguments[0] && 37; }(42), 56ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "args[0] short-circuit boolean and true"); 57ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(0, function(){ return arguments[0] && 42; }(0), 58ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "args[0] short-circuit boolean and false"); 59ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(){ arguments[0] = 42; return arguments[0]; }(37), 60ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "args[0] assignment"); 61ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Link between arguments and parameters. 62ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(a) { arguments[0] = 42; return a; }(37), 63ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "assign args[0]->a"); 64ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(a) { a = 42; return arguments[0]; }(37), 65ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "assign a->args[0]"); 66ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(54, function(a, b) { arguments[1] = 54; return b; }(42, 37), 67ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "assign args[1]->b:b"); 68ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(54, function(a, b) { b = 54; return arguments[1]; }(42, 47), 69ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "assign b->args[1]:b"); 70ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(a, b) { arguments[1] = 54; return a; }(42, 37), 71ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "assign args[1]->b:a"); 72ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(a, b) { b = 54; return arguments[0]; }(42, 47), 73ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "assign b->args[1]:a"); 74ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 75ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Capture parameters in nested contexts. 76ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(33, 77ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a,b) { 78ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return a + arguments[0] + 79ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(b){ return a + b + arguments[0]; }(b); }(7,6), 80ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "captured parameters"); 81ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(a) { 82ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org arguments[0] = 42; 83ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return function(b){ return a; }(); 84ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(37), 85ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "capture value returned"); 86ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, 87ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a) { 88ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org arguments[0] = 26; 89ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return function(b){ a; return 42; }(); 90ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(37), 91ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "capture value ignored"); 92ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, 93ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a) { 94ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org arguments[0] = 26; 95ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return function(b){ if (a) return 42; }(); 96ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(37), 97ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "capture to boolean"); 98ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, 99ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a) { 100ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org arguments[0] = 42; 101ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return function(b){ return a || "no"; }(); 102ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(37), 103ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "capture short-circuit boolean or true"); 104ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(0, 105ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a) { 106ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org arguments[0] = 0; 107ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return function(b){ return a && 42; }(); 108ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(37), 109ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "capture short-circuit boolean and false"); 110ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Deeply nested. 111ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, 112ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a,b) { 113ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return arguments[2] + 114ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(){ 115ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return b + 116ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function() { 117ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return a; 118ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(); 119ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(); 120ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(7,14,21), 121ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "deep nested capture"); 122ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 123ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Assignment to captured parameters. 124ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, function(a,b) { 125ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org arguments[1] = 11; 126ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return a + function(){ a = b; return a; }() + a; 127ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(20, 37), "captured assignment"); 128ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 129ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Inside non-function scopes. 130ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, 131ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a) { 132ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org arguments[0] = 20; 133ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org with ({ b : 22 }) { return a + b; } 134ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(37), 135ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "a in with"); 136ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, 137ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a) { 138ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org with ({ b : 22 }) { return arguments[0] + b; } 139ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(20), 140ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "args in with"); 141ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, 142ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a) { 143ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org arguments[0] = 20; 144ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org with ({ b : 22 }) { 145ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return function() { return a; }() + b; } 146ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(37), 147ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "captured a in with"); 148ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(42, 149ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org function(a) { 150ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org arguments[0] = 12; 151ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org with ({ b : 22 }) { 152ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return function f() { 153ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org try { throw 8 } catch(e) { return e + a }; 154ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }() + b; 155ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org } 156ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org }(37), 157ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org "in a catch in a named function captured a in with "); 158ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Escaping arguments. 159ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgfunction weirdargs(a,b,c) { if (!a) return arguments; 160ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return [b[2],c]; } 161ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgvar args1 = weirdargs(false, null, 40); 162ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgvar res = weirdargs(true, args1, 15); 163ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgassertEquals(40, res[0], "return old args element"); 164f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgassertEquals(15, res[1], "return own args element"); 165