blob: 5419cc7f3b905d235be703e06b90ef8e9f134b62 [file] [log] [blame]
ager@chromium.org381abbb2009-02-25 13:23:22 +00001// 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;
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +000031function global_function() { return 'global'; }
32const const_uninitialized;
33const const_initialized = function() { return "const_global"; }
ager@chromium.org381abbb2009-02-25 13:23:22 +000034
35// Test loading across an eval call that does not shadow variables.
36function testNoShadowing() {
37 var y = 2;
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +000038 function local_function() { return 'local'; }
39 const local_const_uninitialized;
40 const local_const_initialized = function() { return "const_local"; }
ager@chromium.org381abbb2009-02-25 13:23:22 +000041 function f() {
42 eval('1');
43 assertEquals(1, x);
vegorov@chromium.orgdff694e2010-05-17 09:10:26 +000044 try { typeof(asdf); } catch(e) { assertUnreachable(); }
ager@chromium.org381abbb2009-02-25 13:23:22 +000045 assertEquals(2, y);
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +000046 assertEquals('global', global_function());
47 assertEquals('local', local_function());
48 try {
49 const_uninitialized();
50 assertUnreachable();
51 } catch(e) {
52 // Ignore.
53 }
54 assertEquals('const_global', const_initialized());
55 try {
56 local_const_uninitialized();
57 assertUnreachable();
58 } catch(e) {
59 // Ignore.
60 }
61 assertEquals('const_local', local_const_initialized());
ager@chromium.org381abbb2009-02-25 13:23:22 +000062 function g() {
63 assertEquals(1, x);
vegorov@chromium.orgdff694e2010-05-17 09:10:26 +000064 try { typeof(asdf); } catch(e) { assertUnreachable(); }
ager@chromium.org381abbb2009-02-25 13:23:22 +000065 assertEquals(2, y);
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +000066 assertEquals('global', global_function());
67 assertEquals('local', local_function());
68 try {
69 const_uninitialized();
70 assertUnreachable();
71 } catch(e) {
72 // Ignore.
73 }
74 assertEquals('const_global', const_initialized());
75 try {
76 local_const_uninitialized();
77 assertUnreachable();
78 } catch(e) {
79 // Ignore.
80 }
81 assertEquals('const_local', local_const_initialized());
ager@chromium.org381abbb2009-02-25 13:23:22 +000082 }
83 g();
84 }
85 f();
86}
87
88testNoShadowing();
89
90// Test loading across eval calls that do not shadow variables.
91function testNoShadowing2() {
92 var y = 2;
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +000093 function local_function() { return 'local'; }
ager@chromium.org381abbb2009-02-25 13:23:22 +000094 eval('1');
95 function f() {
96 eval('1');
97 assertEquals(1, x);
98 assertEquals(2, y);
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +000099 assertEquals('global', global_function());
100 assertEquals('local', local_function());
ager@chromium.org381abbb2009-02-25 13:23:22 +0000101 function g() {
102 assertEquals(1, x);
103 assertEquals(2, y);
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +0000104 assertEquals('global', global_function());
105 assertEquals('local', local_function());
ager@chromium.org381abbb2009-02-25 13:23:22 +0000106 }
107 g();
108 }
109 f();
110}
111
112testNoShadowing2();
113
114// Test loading across an eval call that shadows variables.
115function testShadowing() {
116 var y = 2;
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +0000117 function local_function() { return 'local'; }
ager@chromium.org381abbb2009-02-25 13:23:22 +0000118 function f() {
119 eval('var x = 3; var y = 4;');
120 assertEquals(3, x);
121 assertEquals(4, y);
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +0000122 eval('function local_function() { return "new_local"; }');
123 eval('function global_function() { return "new_nonglobal"; }');
124 assertEquals('new_nonglobal', global_function());
125 assertEquals('new_local', local_function());
ager@chromium.org381abbb2009-02-25 13:23:22 +0000126 function g() {
127 assertEquals(3, x);
128 assertEquals(4, y);
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +0000129 assertEquals('new_nonglobal', global_function());
130 assertEquals('new_local', local_function());
ager@chromium.org381abbb2009-02-25 13:23:22 +0000131 }
132 g();
133 }
134 f();
135}
136
137testShadowing();