1// Copyright 2009 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6//     * Redistributions of source code must retain the above copyright
7//       notice, this list of conditions and the following disclaimer.
8//     * Redistributions in binary form must reproduce the above
9//       copyright notice, this list of conditions and the following
10//       disclaimer in the documentation and/or other materials provided
11//       with the distribution.
12//     * Neither the name of Google Inc. nor the names of its
13//       contributors may be used to endorse or promote products derived
14//       from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// Tests loading of properties across eval calls.
29
30var x = 1;
31function global_function() { return 'global'; }
32const const_uninitialized;
33const const_initialized = function() { return "const_global"; }
34
35// Test loading across an eval call that does not shadow variables.
36function testNoShadowing() {
37  var y = 2;
38  function local_function() { return 'local'; }
39  const local_const_uninitialized;
40  const local_const_initialized = function() { return "const_local"; }
41  function f() {
42    eval('1');
43    assertEquals(1, x);
44    try { typeof(asdf); } catch(e) { assertUnreachable(); }
45    assertEquals(2, y);
46    assertEquals('global', global_function());
47    assertEquals('local', local_function());
48    var exception = false;
49    try {
50      const_uninitialized();
51    } catch(e) {
52      exception = true;
53    }
54    assertTrue(exception);
55    assertEquals('const_global', const_initialized());
56    exception = false;
57    try {
58      local_const_uninitialized();
59    } catch(e) {
60      exception = true;
61    }
62    assertTrue(exception);
63    assertEquals('const_local', local_const_initialized());
64    function g() {
65      assertEquals(1, x);
66      try { typeof(asdf); } catch(e) { assertUnreachable(); }
67      assertEquals(2, y);
68      assertEquals('global', global_function());
69      assertEquals('local', local_function());
70      var exception = false;
71      try {
72        const_uninitialized();
73      } catch(e) {
74        exception = true;
75      }
76      assertTrue(exception);
77      assertEquals('const_global', const_initialized());
78      exception = false;
79      try {
80        local_const_uninitialized();
81      } catch(e) {
82        exception = true;
83      }
84      assertTrue(exception);
85      assertEquals('const_local', local_const_initialized());
86    }
87    g();
88  }
89  f();
90}
91
92testNoShadowing();
93
94// Test loading across eval calls that do not shadow variables.
95function testNoShadowing2() {
96  var y = 2;
97  function local_function() { return 'local'; }
98  eval('1');
99  function f() {
100    eval('1');
101    assertEquals(1, x);
102    assertEquals(2, y);
103    assertEquals('global', global_function());
104    assertEquals('local', local_function());
105    function g() {
106      assertEquals(1, x);
107      assertEquals(2, y);
108      assertEquals('global', global_function());
109      assertEquals('local', local_function());
110    }
111    g();
112  }
113  f();
114}
115
116testNoShadowing2();
117
118// Test loading across an eval call that shadows variables.
119function testShadowing() {
120  var y = 2;
121  function local_function() { return 'local'; }
122  function f() {
123    eval('var x = 3; var y = 4;');
124    assertEquals(3, x);
125    assertEquals(4, y);
126    eval('function local_function() { return "new_local"; }');
127    eval('function global_function() { return "new_nonglobal"; }');
128    assertEquals('new_nonglobal', global_function());
129    assertEquals('new_local', local_function());
130    function g() {
131      assertEquals(3, x);
132      assertEquals(4, y);
133      assertEquals('new_nonglobal', global_function());
134      assertEquals('new_local', local_function());
135    }
136    g();
137  }
138  f();
139}
140
141testShadowing();
142