1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_5/Expressions/nested-delete-name-in-evalcode.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,163 @@ 1.4 +// Any copyright is dedicated to the Public Domain. 1.5 +// http://creativecommons.org/licenses/publicdomain/ 1.6 + 1.7 +//----------------------------------------------------------------------------- 1.8 +var BUGNUMBER = 616294; 1.9 +var summary = 1.10 + "|delete x| inside a function in eval code, where that eval code includes " + 1.11 + "|var x| at top level, actually does delete the binding for x"; 1.12 + 1.13 +print(BUGNUMBER + ": " + summary); 1.14 + 1.15 +/************** 1.16 + * BEGIN TEST * 1.17 + **************/ 1.18 + 1.19 +var f; 1.20 + 1.21 +function testOuterVar() 1.22 +{ 1.23 + return eval("var x; (function() { return delete x; })"); 1.24 +} 1.25 + 1.26 +f = testOuterVar(); 1.27 + 1.28 +assertEq(f(), true); // configurable, so remove => true 1.29 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.30 + 1.31 + 1.32 +function testOuterFunction() 1.33 +{ 1.34 + return eval("function x() { } (function() { return delete x; })"); 1.35 +} 1.36 + 1.37 +f = testOuterFunction(); 1.38 + 1.39 +assertEq(f(), true); // configurable, so remove => true 1.40 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.41 + 1.42 + 1.43 +function testOuterForVar() 1.44 +{ 1.45 + return eval("for (var x; false; ); (function() { return delete x; })"); 1.46 +} 1.47 + 1.48 +f = testOuterForVar(); 1.49 + 1.50 +assertEq(f(), true); // configurable, so remove => true 1.51 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.52 + 1.53 + 1.54 +function testOuterForInVar() 1.55 +{ 1.56 + return eval("for (var x in {}); (function() { return delete x; })"); 1.57 +} 1.58 + 1.59 +f = testOuterForInVar(); 1.60 + 1.61 +assertEq(f(), true); // configurable, so remove => true 1.62 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.63 + 1.64 + 1.65 +function testOuterNestedVar() 1.66 +{ 1.67 + return eval("for (var q = 0; q < 5; q++) { var x; } (function() { return delete x; })"); 1.68 +} 1.69 + 1.70 +f = testOuterNestedVar(); 1.71 + 1.72 +assertEq(f(), true); // configurable, so remove => true 1.73 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.74 + 1.75 + 1.76 +function testOuterNestedConditionalVar() 1.77 +{ 1.78 + return eval("for (var q = 0; q < 5; q++) { if (false) { var x; } } (function() { return delete x; })"); 1.79 +} 1.80 + 1.81 +f = testOuterNestedConditionalVar(); 1.82 + 1.83 +assertEq(f(), true); // configurable, so remove => true 1.84 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.85 + 1.86 + 1.87 +function testVarInWith() 1.88 +{ 1.89 + return eval("with ({}) { var x; } (function() { return delete x; })"); 1.90 +} 1.91 + 1.92 +f = testVarInWith(); 1.93 + 1.94 +assertEq(f(), true); // configurable, so remove => true 1.95 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.96 + 1.97 + 1.98 +function testForVarInWith() 1.99 +{ 1.100 + return eval("with ({}) { for (var x = 0; x < 5; x++); } (function() { return delete x; })"); 1.101 +} 1.102 + 1.103 +f = testForVarInWith(); 1.104 + 1.105 +assertEq(f(), true); // configurable, so remove => true 1.106 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.107 + 1.108 + 1.109 +function testForInVarInWith() 1.110 +{ 1.111 + return eval("with ({}) { for (var x in {}); } (function() { return delete x; })"); 1.112 +} 1.113 + 1.114 +f = testForInVarInWith(); 1.115 + 1.116 +assertEq(f(), true); // configurable, so remove => true 1.117 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.118 + 1.119 + 1.120 +function testUnknown() 1.121 +{ 1.122 + return eval("nameToDelete = 17; (function() { return delete nameToDelete; })"); 1.123 +} 1.124 + 1.125 +f = testUnknown(); 1.126 + 1.127 +assertEq(f(), true); // configurable global property, so remove => true 1.128 +assertEq(f(), true); // not there => true (only non-configurable => false) 1.129 + 1.130 + 1.131 +function testArgumentShadow() 1.132 +{ 1.133 + return eval("var x; (function(x) { return delete x; })"); 1.134 +} 1.135 + 1.136 +f = testArgumentShadow(); 1.137 + 1.138 +assertEq(f(), false); // non-configurable argument => false 1.139 + 1.140 + 1.141 +function testArgument() 1.142 +{ 1.143 + return eval("(function(x) { return delete x; })"); 1.144 +} 1.145 + 1.146 +f = testArgument(); 1.147 + 1.148 +assertEq(f(), false); // non-configurable argument => false 1.149 + 1.150 + 1.151 +function testFunctionLocal() 1.152 +{ 1.153 + return eval("(function() { var x; return delete x; })"); 1.154 +} 1.155 + 1.156 +f = testFunctionLocal(); 1.157 + 1.158 +assertEq(f(), false); // defined by function code => not configurable => false 1.159 + 1.160 + 1.161 +/******************************************************************************/ 1.162 + 1.163 +if (typeof reportCompare === "function") 1.164 + reportCompare(true, true); 1.165 + 1.166 +print("All tests passed!");