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 |
deleted file mode 100644 |
index 2bea1476abd033b28716feb86aea8727c8e9a4b2..0000000000000000000000000000000000000000 |
--- a/test/mjsunit/harmony/block-sloppy-function.js |
+++ /dev/null |
@@ -1,301 +0,0 @@ |
-// 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 |
-// Flags: --harmony-sloppy-function |
- |
-// Test Annex B 3.3 semantics for functions declared in blocks in sloppy mode. |
-// http://www.ecma-international.org/ecma-262/6.0/#sec-block-level-function-declarations-web-legacy-compatibility-semantics |
- |
-(function overridingLocalFunction() { |
- var x = []; |
- assertEquals('function', typeof f); |
- function f() { |
- x.push(1); |
- } |
- f(); |
- { |
- f(); |
- function f() { |
- x.push(2); |
- } |
- f(); |
- } |
- f(); |
- { |
- f(); |
- function f() { |
- x.push(3); |
- } |
- f(); |
- } |
- f(); |
- assertArrayEquals([1, 2, 2, 2, 3, 3, 3], x); |
-})(); |
- |
-(function newFunctionBinding() { |
- var x = []; |
- assertEquals('undefined', typeof f); |
- { |
- f(); |
- function f() { |
- x.push(2); |
- } |
- f(); |
- } |
- f(); |
- { |
- f(); |
- function f() { |
- x.push(3); |
- } |
- f(); |
- } |
- f(); |
- assertArrayEquals([2, 2, 2, 3, 3, 3], x); |
-})(); |
- |
-(function shadowingLetDoesntBind() { |
- let f = 1; |
- assertEquals(1, f); |
- { |
- let y = 3; |
- function f() { |
- y = 2; |
- } |
- f(); |
- assertEquals(2, y); |
- } |
- assertEquals(1, f); |
-})(); |
- |
-(function shadowingClassDoesntBind() { |
- class f { } |
- assertEquals('class f { }', f.toString()); |
- { |
- let y = 3; |
- function f() { |
- y = 2; |
- } |
- f(); |
- assertEquals(2, y); |
- } |
- assertEquals('class f { }', f.toString()); |
-})(); |
- |
-(function shadowingConstDoesntBind() { |
- const f = 1; |
- assertEquals(1, f); |
- { |
- let y = 3; |
- function f() { |
- y = 2; |
- } |
- f(); |
- assertEquals(2, y); |
- } |
- assertEquals(1, f); |
-})(); |
- |
-(function shadowingVarBinds() { |
- var f = 1; |
- assertEquals(1, f); |
- { |
- let y = 3; |
- function f() { |
- y = 2; |
- } |
- f(); |
- assertEquals(2, y); |
- } |
- assertEquals('function', typeof f); |
-})(); |
- |
-(function conditional() { |
- if (true) { |
- function f() { return 1; } |
- } else { |
- function f() { return 2; } |
- } |
- assertEquals(1, f()); |
- |
- if (false) { |
- function g() { return 1; } |
- } else { |
- function g() { return 2; } |
- } |
- assertEquals(2, g()); |
-})(); |
- |
-(function skipExecution() { |
- { |
- function f() { return 1; } |
- } |
- assertEquals(1, f()); |
- { |
- function f() { return 2; } |
- } |
- assertEquals(2, f()); |
- L: { |
- assertEquals(3, f()); |
- break L; |
- function f() { return 3; } |
- } |
- assertEquals(2, f()); |
-})(); |
- |
-// Test that shadowing arguments is fine |
-(function shadowArguments(x) { |
- assertArrayEquals([1], arguments); |
- { |
- assertEquals('function', typeof arguments); |
- function arguments() {} |
- assertEquals('function', typeof arguments); |
- } |
- assertEquals('function', typeof arguments); |
-})(1); |
- |
-// Shadow function parameter |
-(function shadowParameter(x) { |
- assertEquals(1, x); |
- { |
- function x() {} |
- } |
- assertEquals('function', typeof x); |
-})(1); |
- |
-// Shadow function parameter |
-(function shadowDefaultParameter(x = 0) { |
- assertEquals(1, x); |
- { |
- function x() {} |
- } |
- // TODO(littledan): Once destructured parameters are no longer |
- // let-bound, enable this assertion. This is the core of the test. |
- // assertEquals('function', typeof x); |
-})(1); |
- |
-(function shadowRestParameter(...x) { |
- assertArrayEquals([1], x); |
- { |
- function x() {} |
- } |
- // TODO(littledan): Once destructured parameters are no longer |
- // let-bound, enable this assertion. This is the core of the test. |
- // assertEquals('function', typeof x); |
-})(1); |
- |
-assertThrows(function notInDefaultScope(x = y) { |
- { |
- function 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, |
- 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()); |
- |
-// When a function property is hoisted, it should be overwritten and |
-// made writable and overwritten, even if the property was non-writable. |
-Object.defineProperty(this, "globalNonWritable", { |
- value: false, |
- configurable: true, |
- writable: false, |
- enumerable: true |
-}); |
-eval("{function globalNonWritable() { return 1; }}"); |
-var globalNonWritableDescriptor |
- = Object.getOwnPropertyDescriptor(this, "globalNonWritable"); |
-// BUG(v8:4451): Should be made non-configurable |
-assertTrue(globalNonWritableDescriptor.configurable); |
-// BUG(v8:4451): Should be made writable |
-assertFalse(globalNonWritableDescriptor.writable); |
-assertFalse(globalNonEnumerableDescriptor.enumerable); |
-// BUG(v8:4451): Should be overwritten |
-assertEquals(false, globalNonWritableDescriptor.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); |