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 // Flags: --legacy-const 29 30 // Tests loading of properties across eval calls. 31 32 var x = 1; 33 function global_function() { return 'global'; } 34 const const_uninitialized; 35 const const_initialized = function() { return "const_global"; } 36 37 // Test loading across an eval call that does not shadow variables. 38 function testNoShadowing() { 39 var y = 2; 40 function local_function() { return 'local'; } 41 const local_const_uninitialized; 42 const local_const_initialized = function() { return "const_local"; } 43 function f() { 44 eval('1'); 45 assertEquals(1, x); 46 try { typeof(asdf); } catch(e) { assertUnreachable(); } 47 assertEquals(2, y); 48 assertEquals('global', global_function()); 49 assertEquals('local', local_function()); 50 var exception = false; 51 try { 52 const_uninitialized(); 53 } catch(e) { 54 exception = true; 55 } 56 assertTrue(exception); 57 assertEquals('const_global', const_initialized()); 58 exception = false; 59 try { 60 local_const_uninitialized(); 61 } catch(e) { 62 exception = true; 63 } 64 assertTrue(exception); 65 assertEquals('const_local', local_const_initialized()); 66 function g() { 67 assertEquals(1, x); 68 try { typeof(asdf); } catch(e) { assertUnreachable(); } 69 assertEquals(2, y); 70 assertEquals('global', global_function()); 71 assertEquals('local', local_function()); 72 var exception = false; 73 try { 74 const_uninitialized(); 75 } catch(e) { 76 exception = true; 77 } 78 assertTrue(exception); 79 assertEquals('const_global', const_initialized()); 80 exception = false; 81 try { 82 local_const_uninitialized(); 83 } catch(e) { 84 exception = true; 85 } 86 assertTrue(exception); 87 assertEquals('const_local', local_const_initialized()); 88 } 89 g(); 90 } 91 f(); 92 } 93 94 testNoShadowing(); 95 96 // Test loading across eval calls that do not shadow variables. 97 function testNoShadowing2() { 98 var y = 2; 99 function local_function() { return 'local'; } 100 eval('1'); 101 function f() { 102 eval('1'); 103 assertEquals(1, x); 104 assertEquals(2, y); 105 assertEquals('global', global_function()); 106 assertEquals('local', local_function()); 107 function g() { 108 assertEquals(1, x); 109 assertEquals(2, y); 110 assertEquals('global', global_function()); 111 assertEquals('local', local_function()); 112 } 113 g(); 114 } 115 f(); 116 } 117 118 testNoShadowing2(); 119 120 // Test loading across an eval call that shadows variables. 121 function testShadowing() { 122 var y = 2; 123 function local_function() { return 'local'; } 124 function f() { 125 eval('var x = 3; var y = 4;'); 126 assertEquals(3, x); 127 assertEquals(4, y); 128 eval('function local_function() { return "new_local"; }'); 129 eval('function global_function() { return "new_nonglobal"; }'); 130 assertEquals('new_nonglobal', global_function()); 131 assertEquals('new_local', local_function()); 132 function g() { 133 assertEquals(3, x); 134 assertEquals(4, y); 135 assertEquals('new_nonglobal', global_function()); 136 assertEquals('new_local', local_function()); 137 } 138 g(); 139 } 140 f(); 141 } 142 143 testShadowing(); 144