18e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 2a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Redistribution and use in source and binary forms, with or without 3a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// modification, are permitted provided that the following conditions are 4a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// met: 5a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// 6a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// * Redistributions of source code must retain the above copyright 7a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// notice, this list of conditions and the following disclaimer. 8a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// * Redistributions in binary form must reproduce the above 9a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// copyright notice, this list of conditions and the following 10a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// disclaimer in the documentation and/or other materials provided 11a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// with the distribution. 12a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// * Neither the name of Google Inc. nor the names of its 13a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// contributors may be used to endorse or promote products derived 14a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// from this software without specific prior written permission. 15a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// 16a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 28a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(void 0, eval()); 29a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(4, eval(4)); 30a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 31a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfunction f() { return 'The f function'; }; 32a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertTrue(f === eval(f)); 33a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 34a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfunction g(x, y) { return 4; }; 35a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 36a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgcount = 0; 37a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(4, eval('2 + 2', count++)); 38a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(1, count); 39a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 40a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgtry { 41a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org eval('hest 7 &*^*&^'); 42c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org assertUnreachable('Did not throw on syntax error.'); 43a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} catch (e) { 44a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org assertEquals('SyntaxError', e.name); 45a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 46a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 47a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 48a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// eval has special evaluation order for consistency with other browsers. 49a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgglobal_eval = eval; 50a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(void 0, eval(eval("var eval = function f(x) { return 'hest';}"))) 51a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgeval = global_eval; 52a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 531af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org// Test eval with different number of parameters. 54a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgglobal_eval = eval; 55a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgeval = function(x, y) { return x + y; }; 56a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(4, eval(2, 2)); 57a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgeval = global_eval; 58a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 59a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Test that un-aliased eval reads from local context. 60a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfoo = 0; 610c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgresult = 62a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (function() { 63a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org var foo = 2; 64a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return eval('foo'); 65a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org })(); 66a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(2, result); 67a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 680c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org// Test that un-aliased eval writes to local context. 69a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfoo = 0; 700c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgresult = 71a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (function() { 72a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org var foo = 1; 73a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org eval('foo = 2'); 74a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return foo; 75a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org })(); 76a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(2, result); 77a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(0, foo); 78a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 79a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Test that un-aliased eval has right receiver. 80a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfunction MyObject() { this.self = eval('this'); } 81a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvar o = new MyObject(); 82a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertTrue(o === o.self); 83a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 84a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Test that aliased eval reads from global context. 85a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvar e = eval; 86a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfoo = 0; 870c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgresult = 88a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (function() { 89a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org var foo = 2; 90a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return e('foo'); 91a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org })(); 92a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(0, result); 93a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 94a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Test that aliased eval writes to global context. 95a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvar e = eval; 96a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfoo = 0; 97a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org(function() { e('var foo = 2;'); })(); 98a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(2, foo); 99a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 100a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Test that aliased eval has right receiver. 101a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfunction MyOtherObject() { this.self = e('this'); } 102a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvar o = new MyOtherObject(); 103a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertTrue(this === o.self); 104a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 105a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Try to cheat the 'aliased eval' detection. 106a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvar x = this; 107a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfoo = 0; 1080c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgresult = 109a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (function() { 110a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org var foo = 2; 111c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Should be non-direct call. 112a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return x.eval('foo'); 113a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org })(); 114a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(0, result); 115a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 116a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgfoo = 0; 1170c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgresult = 118a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (function() { 119c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org var foo = 2; 120c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Should be non-direct call. 121c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return (1,eval)('foo'); 122c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org })(); 123c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgassertEquals(0, result); 124c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 125c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgfoo = 0; 126c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgresult = 127c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org (function() { 128a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org var eval = function(x) { return x; }; 129a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org var foo = eval(2); 130c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Should be non-direct call. 131a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return e('foo'); 132a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org })(); 133a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(0, result); 134a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 135c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgfoo = 0; 136c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgresult = 137c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org (function() { 138c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org var foo = 2; 139c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Should be direct call. 140c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org with ({ eval : e }) { 141c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return eval('foo'); 142c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 143c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org })(); 144c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgassertEquals(2, result); 145c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 146a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgresult = 147a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (function() { 148a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org var eval = function(x) { return 2 * x; }; 149a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return (function() { return eval(2); })(); 150a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org })(); 151a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(4, result); 152a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1530c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgresult = 1540c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org (function() { 1550c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org eval("var eval = function(s) { return this; }"); 1560c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org return eval("42"); // Should return the global object 1570c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org })(); 1580c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgassertEquals(this, result); 1590c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 160c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org(function() { 161c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org var obj = { f: function(eval) { return eval("this"); } }; 162c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org result = obj.f(eval); 163c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org assertEquals(obj, result); 164c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org})(); 1650c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 166c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org(function() { 167c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org var obj = { f: function(eval) { arguments; return eval("this"); } }; 168c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org result = obj.f(eval); 169c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org assertEquals(obj, result); 170c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org})(); 1710c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 172a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgeval = function(x) { return 2 * x; }; 1730c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgresult = 174a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (function() { 175a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return (function() { return eval(2); })(); 176a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org })(); 177a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgassertEquals(4, result); 1788e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 179c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 180c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 181c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1828e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org// Regression test: calling a function named eval found in a context that is 1838e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org// not the global context should get the global object as receiver. 1848e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgresult = 1858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org (function () { 1868e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org var eval = function (x) { return this; }; 1878e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org with ({}) { return eval('ignore'); } 1888e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org })(); 1898e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgassertEquals(this, result); 190