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