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..9f34a45dd6ec1f3dfc3e15b8f2237629f96493eb 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,82 @@ 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"); |
+// Configurablility is not set properly BUG(v8:4451#1) |
+// assertTrue(globalUndefinedHoistedDescriptor.configurable); |
adamk
2015/09/30 18:24:26
Please leave this uncommented (with the current be
Dan Ehrenberg
2015/09/30 23:06:55
Done
|
+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"); |
+assertTrue(globalNonEnumerableDescriptor.configurable); |
+assertTrue(globalNonEnumerableDescriptor.writable); |
+// BUG(v8:4451) |
+// assertTrue(globalNonEnumerableDescriptor.enumerable); |
adamk
2015/09/30 18:24:26
Same here.
Dan Ehrenberg
2015/09/30 23:06:55
Done
|
+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()); |
+ `); |
+}(); |
+ |
+// When the global object is frozen, silently don't hoist |
+// Currently this actually throws BUG(v8:4452) |
adamk
2015/09/30 18:24:26
Ah, this throws because it goes through the define
Dan Ehrenberg
2015/09/30 23:06:55
I guess it matches, but still, we eventually want
|
+// Object.freeze(this); |
+// eval(` |
+// { |
+// function hoistWhenFrozen() {} |
+// } |
+// `); |
+// assertFalse(this.hasOwnProperty("hoistWhenFrozen")); |
+assertThrows(() => hoistWhenFrozen, ReferenceError); |
+ |
+let dontHoistGlobal; |
+{ function dontHoistGlobal() {} } |
+assertEquals(undefined, dontHoistGlobal); |
+ |
+let dontHoistEval; |
+// OK, this really needs to be fixed... |
adamk
2015/09/30 18:24:26
Yeah, this needs to be fixed before landing.
Dan Ehrenberg
2015/09/30 23:06:55
We talked about this off-line and it sounded like
|
+// eval("{ function dontHoistEval() {} }"); |
+// assertEquals(undefined, dontHoistEval); |