Chromium Code Reviews| Index: test/mjsunit/regress/regress-4454.js |
| diff --git a/test/mjsunit/regress/regress-4454.js b/test/mjsunit/regress/regress-4454.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..adaec8084da84886e3a80414044af4cb48e758b3 |
| --- /dev/null |
| +++ b/test/mjsunit/regress/regress-4454.js |
| @@ -0,0 +1,161 @@ |
| +// Copyright 2015 the V8 project authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +// Flags: --harmony-sloppy --harmony-sloppy-let --harmony-sloppy-function --no-legacy-const |
|
adamk
2015/10/05 17:20:36
Nit: split this line into two "Flags: " lines to f
|
| + |
| +// Var-let conflict in a function throws, even if the var is in an eval |
| + |
| +let caught = false; |
| + |
| +// Throws at the top level of a function |
| +try { |
| + (function() { |
| + let x = 1; |
| + eval('var x = 2'); |
|
adamk
2015/10/05 17:20:36
Can you add tests for function declarations (I'm n
Dan Ehrenberg
2015/10/05 18:27:14
The spec says that no hoisting out of lexical bloc
|
| + })() |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertTrue(caught); |
| + |
| +// If the eval is in its own block scope, throws |
| +caught = false; |
| +try { |
| + (function() { |
| + let y = 1; |
| + { eval('var y = 2'); } |
| + })() |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertTrue(caught); |
| + |
| +// If the let is in its own block scope, with the eval, throws |
| +caught = false |
| +try { |
| + (function() { |
| + { |
| + let x = 1; |
| + eval('var x = 2'); |
| + } |
| + })(); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertTrue(caught); |
| + |
| +// Legal if the let is no longer visible |
| +caught = false |
| +try { |
| + (function() { |
| + { |
| + let x = 1; |
| + } |
| + eval('var x = 2'); |
| + })(); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertFalse(caught); |
| + |
| +// All the same works for const: |
| +// Throws at the top level of a function |
| +try { |
| + (function() { |
| + const x = 1; |
| + eval('var x = 2'); |
| + })(); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertTrue(caught); |
| + |
| +// If the eval is in its own block scope, throws |
| +caught = false; |
| +try { |
| + (function() { |
| + const y = 1; |
| + { eval('var y = 2'); } |
| + })(); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertTrue(caught); |
| + |
| +// If the const is in its own block scope, with the eval, throws |
| +caught = false |
| +try { |
| + (function() { |
| + { |
| + const x = 1; |
| + eval('var x = 2'); |
| + } |
| + })(); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertTrue(caught); |
| + |
| +// Legal if the const is no longer visible |
| +caught = false |
| +try { |
| + (function() { |
| + { |
| + const x = 1; |
| + } |
| + eval('var x = 2'); |
| + })(); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertFalse(caught); |
| + |
| +// In global scope |
| +caught = false; |
| +try { |
| + let z = 1; |
| + eval('var z = 2'); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertTrue(caught); |
| + |
| +// Let declarations beyond a function boundary don't conflict |
| +caught = false; |
| +try { |
| + let a = 1; |
| + (function() { |
| + eval('var a'); |
| + })(); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertFalse(caught); |
| + |
| +// var across with doesn't conflict |
| +caught = false; |
| +try { |
| + (function() { |
| + with ({x: 1}) { |
| + eval("var x = 2;"); |
| + } |
| + })(); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertFalse(caught); |
| + |
| +// var can still conflict with let across a with |
| +caught = false; |
| +try { |
| + (function() { |
| + let x; |
| + with ({x: 1}) { |
| + eval("var x = 2;"); |
| + } |
| + })(); |
| +} catch (e) { |
| + caught = true; |
| +} |
| +assertTrue(caught); |