| OLD | NEW |
| (Empty) |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 // | |
| 5 // Flags: --harmony-scoping | |
| 6 | |
| 7 // Test for conflicting variable bindings. | |
| 8 | |
| 9 "use strict"; | |
| 10 | |
| 11 function CheckException(e) { | |
| 12 var string = e.toString(); | |
| 13 assertTrue(string.indexOf("has already been declared") >= 0 || | |
| 14 string.indexOf("redeclaration") >= 0); | |
| 15 return 'Conflict'; | |
| 16 } | |
| 17 | |
| 18 | |
| 19 function TestGlobal(s,e) { | |
| 20 try { | |
| 21 return eval(s + e); | |
| 22 } catch (x) { | |
| 23 return CheckException(x); | |
| 24 } | |
| 25 } | |
| 26 | |
| 27 | |
| 28 function TestFunction(s,e) { | |
| 29 try { | |
| 30 return eval("(function(){" + s + " return " + e + "})")(); | |
| 31 } catch (x) { | |
| 32 return CheckException(x); | |
| 33 } | |
| 34 } | |
| 35 | |
| 36 | |
| 37 function TestBlock(s,e) { | |
| 38 try { | |
| 39 return eval("(function(){ {" + s + "} return " + e + "})")(); | |
| 40 } catch (x) { | |
| 41 return CheckException(x); | |
| 42 } | |
| 43 } | |
| 44 | |
| 45 function TestAll(expected,s,opt_e) { | |
| 46 var e = ""; | |
| 47 var msg = s; | |
| 48 if (opt_e) { e = opt_e; msg += opt_e; } | |
| 49 assertEquals(expected === 'LocalConflict' ? 'NoConflict' : expected, | |
| 50 TestGlobal(s,e), "global:'" + msg + "'"); | |
| 51 assertEquals(expected === 'LocalConflict' ? 'NoConflict' : expected, | |
| 52 TestFunction(s,e), "function:'" + msg + "'"); | |
| 53 assertEquals(expected === 'LocalConflict' ? 'Conflict' : expected, | |
| 54 TestBlock(s,e), "block:'" + msg + "'"); | |
| 55 } | |
| 56 | |
| 57 | |
| 58 function TestConflict(s) { | |
| 59 TestAll('Conflict', s); | |
| 60 TestAll('Conflict', 'eval("' + s + '");'); | |
| 61 } | |
| 62 | |
| 63 function TestNoConflict(s) { | |
| 64 TestAll('NoConflict', s, "'NoConflict'"); | |
| 65 TestAll('NoConflict', 'eval("' + s + '");', "'NoConflict'"); | |
| 66 } | |
| 67 | |
| 68 function TestLocalConflict(s) { | |
| 69 TestAll('LocalConflict', s, "'NoConflict'"); | |
| 70 TestAll('NoConflict', 'eval("' + s + '");', "'NoConflict'"); | |
| 71 } | |
| 72 | |
| 73 var letbinds = [ "let x;", | |
| 74 "let x = 0;", | |
| 75 "let x = undefined;", | |
| 76 "let x = function() {};", | |
| 77 "let x, y;", | |
| 78 "let y, x;", | |
| 79 "const x = 0;", | |
| 80 "const x = undefined;", | |
| 81 "const x = function() {};", | |
| 82 "const x = 2, y = 3;", | |
| 83 "const y = 4, x = 5;", | |
| 84 ]; | |
| 85 var varbinds = [ "var x;", | |
| 86 "var x = 0;", | |
| 87 "var x = undefined;", | |
| 88 "var x = function() {};", | |
| 89 "var x, y;", | |
| 90 "var y, x;", | |
| 91 ]; | |
| 92 var funbind = "function x() {}"; | |
| 93 | |
| 94 for (var l = 0; l < letbinds.length; ++l) { | |
| 95 // Test conflicting let/var bindings. | |
| 96 for (var v = 0; v < varbinds.length; ++v) { | |
| 97 // Same level. | |
| 98 TestConflict(letbinds[l] + varbinds[v]); | |
| 99 TestConflict(varbinds[v] + letbinds[l]); | |
| 100 // Different level. | |
| 101 TestConflict(letbinds[l] + '{' + varbinds[v] + '}'); | |
| 102 TestConflict('{' + varbinds[v] +'}' + letbinds[l]); | |
| 103 TestNoConflict(varbinds[v] + '{' + letbinds[l] + '}'); | |
| 104 TestNoConflict('{' + letbinds[l] + '}' + varbinds[v]); | |
| 105 // For loop. | |
| 106 TestConflict('for (' + letbinds[l] + '0;) {' + varbinds[v] + '}'); | |
| 107 TestNoConflict('for (' + varbinds[v] + '0;) {' + letbinds[l] + '}'); | |
| 108 } | |
| 109 | |
| 110 // Test conflicting let/let bindings. | |
| 111 for (var k = 0; k < letbinds.length; ++k) { | |
| 112 // Same level. | |
| 113 TestConflict(letbinds[l] + letbinds[k]); | |
| 114 TestConflict(letbinds[k] + letbinds[l]); | |
| 115 // Different level. | |
| 116 TestNoConflict(letbinds[l] + '{ ' + letbinds[k] + '}'); | |
| 117 TestNoConflict('{' + letbinds[k] +'} ' + letbinds[l]); | |
| 118 // For loop. | |
| 119 TestNoConflict('for (' + letbinds[l] + '0;) {' + letbinds[k] + '}'); | |
| 120 TestNoConflict('for (' + letbinds[k] + '0;) {' + letbinds[l] + '}'); | |
| 121 } | |
| 122 | |
| 123 // Test conflicting function/let bindings. | |
| 124 // Same level. | |
| 125 TestConflict(letbinds[l] + funbind); | |
| 126 TestConflict(funbind + letbinds[l]); | |
| 127 // Different level. | |
| 128 TestNoConflict(letbinds[l] + '{' + funbind + '}'); | |
| 129 TestNoConflict('{' + funbind + '}' + letbinds[l]); | |
| 130 TestNoConflict(funbind + '{' + letbinds[l] + '}'); | |
| 131 TestNoConflict('{' + letbinds[l] + '}' + funbind); | |
| 132 // For loop. | |
| 133 TestNoConflict('for (' + letbinds[l] + '0;) {' + funbind + '}'); | |
| 134 | |
| 135 // Test conflicting parameter/let bindings. | |
| 136 TestConflict('(function(x) {' + letbinds[l] + '})();'); | |
| 137 } | |
| 138 | |
| 139 // Test conflicting function/var bindings. | |
| 140 for (var v = 0; v < varbinds.length; ++v) { | |
| 141 // Same level. | |
| 142 TestLocalConflict(varbinds[v] + funbind); | |
| 143 TestLocalConflict(funbind + varbinds[v]); | |
| 144 // Different level. | |
| 145 TestLocalConflict(funbind + '{' + varbinds[v] + '}'); | |
| 146 TestLocalConflict('{' + varbinds[v] +'}' + funbind); | |
| 147 TestNoConflict(varbinds[v] + '{' + funbind + '}'); | |
| 148 TestNoConflict('{' + funbind + '}' + varbinds[v]); | |
| 149 // For loop. | |
| 150 TestNoConflict('for (' + varbinds[v] + '0;) {' + funbind + '}'); | |
| 151 } | |
| 152 | |
| 153 // Test conflicting catch/var bindings. | |
| 154 for (var v = 0; v < varbinds.length; ++v) { | |
| 155 TestNoConflict('try {} catch(x) {' + varbinds[v] + '}'); | |
| 156 } | |
| 157 | |
| 158 // Test conflicting parameter/var bindings. | |
| 159 for (var v = 0; v < varbinds.length; ++v) { | |
| 160 TestNoConflict('(function (x) {' + varbinds[v] + '})();'); | |
| 161 } | |
| 162 | |
| 163 // Test conflicting catch/function bindings. | |
| 164 TestNoConflict('try {} catch(x) {' + funbind + '}'); | |
| 165 | |
| 166 // Test conflicting parameter/function bindings. | |
| 167 TestNoConflict('(function (x) {' + funbind + '})();'); | |
| OLD | NEW |