Chromium Code Reviews| Index: test/mjsunit/harmony/block-sloppy-function.js |
| diff --git a/test/mjsunit/harmony/block-sloppy-function.js b/test/mjsunit/harmony/block-sloppy-function.js |
| index a17a4c0799c7d9bced58941597f0b150f532ee7b..0399c93ab1f811b781ae2a6c3e2ad59ffaf6e643 100644 |
| --- a/test/mjsunit/harmony/block-sloppy-function.js |
| +++ b/test/mjsunit/harmony/block-sloppy-function.js |
| @@ -146,13 +146,6 @@ |
| assertEquals(2, f()); |
| })(); |
| -// Test that hoisting from blocks doesn't happen in global scope |
| -function globalUnhoisted() { return 0; } |
| -{ |
| - function globalUnhoisted() { return 1; } |
| -} |
| -assertEquals(0, globalUnhoisted()); |
| - |
| // Test that shadowing arguments is fine |
| (function shadowArguments(x) { |
| assertArrayEquals([1], arguments); |
| @@ -201,3 +194,90 @@ assertThrows(function notInDefaultScope(x = y) { |
| assertEquals('function', typeof y); |
| assertEquals(x, undefined); |
| }, ReferenceError); |
| + |
| +// Test that hoisting from blocks does happen in global scope |
| +function globalHoisted() { return 0; } |
| +{ |
| + function globalHoisted() { return 1; } |
| +} |
| +assertEquals(1, globalHoisted()); |
| + |
| +// Also happens when not previously defined |
| +assertEquals(undefined, globalUndefinedHoisted); |
| +{ |
| + function globalUndefinedHoisted() { return 1; } |
| +} |
| +assertEquals(1, globalUndefinedHoisted()); |
| +var globalUndefinedHoistedDescriptor = |
| + Object.getOwnPropertyDescriptor(this, "globalUndefinedHoisted"); |
| +assertFalse(globalUndefinedHoistedDescriptor.configurable); |
| +assertTrue(globalUndefinedHoistedDescriptor.writable); |
| +assertTrue(globalUndefinedHoistedDescriptor.enumerable); |
| +assertEquals(1, globalUndefinedHoistedDescriptor.value()); |
| + |
| +// When a function property is hoisted, it should be |
| +// made enumerable. |
| +// BUG(v8:4451) |
| +Object.defineProperty(this, "globalNonEnumerable", { |
| + value: false, |
| + configurable: true, |
| + writable: true, |
|
adamk
2015/09/30 23:13:25
One more test tweak: can you make this "writable:
Dan Ehrenberg
2015/09/30 23:27:21
Done (but in a separate test case)
|
| + enumerable: false |
| +}); |
| +eval("{function globalNonEnumerable() { return 1; }}"); |
| +var globalNonEnumerableDescriptor |
| + = Object.getOwnPropertyDescriptor(this, "globalNonEnumerable"); |
| +// BUG(v8:4451): Should be made non-configurable |
| +assertTrue(globalNonEnumerableDescriptor.configurable); |
| +assertTrue(globalNonEnumerableDescriptor.writable); |
| +// BUG(v8:4451): Should be made enumerable |
| +assertFalse(globalNonEnumerableDescriptor.enumerable); |
| +assertEquals(1, globalNonEnumerableDescriptor.value()); |
| + |
| +// Test that hoisting from blocks does happen in an eval |
| +eval(` |
| + function evalHoisted() { return 0; } |
| + { |
| + function evalHoisted() { return 1; } |
| + } |
| + assertEquals(1, evalHoisted()); |
| +`); |
| + |
| +// Test that hoisting from blocks happens from eval in a function |
| +!function() { |
| + eval(` |
| + function evalInFunctionHoisted() { return 0; } |
| + { |
| + function evalInFunctionHoisted() { return 1; } |
| + } |
| + assertEquals(1, evalInFunctionHoisted()); |
| + `); |
| +}(); |
| + |
| +let dontHoistGlobal; |
| +{ function dontHoistGlobal() {} } |
| +assertEquals(undefined, dontHoistGlobal); |
| + |
| +let dontHoistEval; |
| +// BUG(v8:) This shouldn't hoist and shouldn't throw |
| +var throws = false; |
| +try { |
| + eval("{ function dontHoistEval() {} }"); |
| +} catch (e) { |
| + throws = true; |
| +} |
| +assertTrue(throws); |
| + |
| +// When the global object is frozen, silently don't hoist |
| +// Currently this actually throws BUG(v8:4452) |
| +Object.freeze(this); |
| +throws = false; |
| +try { |
| + eval('{ function hoistWhenFrozen() {} }'); |
| +} catch (e) { |
| + throws = true; |
| +} |
| +assertFalse(this.hasOwnProperty("hoistWhenFrozen")); |
| +assertThrows(() => hoistWhenFrozen, ReferenceError); |
| +// Should be assertFalse BUG(v8:4452) |
| +assertTrue(throws); |