Index: test/mjsunit/es6/unscopables.js |
diff --git a/test/mjsunit/es6/unscopables.js b/test/mjsunit/es6/unscopables.js |
index 36365d2d8230aa86c9cd64c04085985936605d3f..03612bec533a6c51a0ffd6340ec08ef295d28e12 100644 |
--- a/test/mjsunit/es6/unscopables.js |
+++ b/test/mjsunit/es6/unscopables.js |
@@ -143,6 +143,13 @@ function TestBasics(object) { |
assertEquals(2, y); |
assertEquals(3, z); |
} |
+ |
+ object[Symbol.unscopables] = {x: 0, y: undefined}; |
+ with (object) { |
+ assertEquals(1, x); |
+ assertEquals(5, y); |
+ assertEquals(3, z); |
+ } |
} |
runTest(TestBasics); |
@@ -161,6 +168,13 @@ function TestUnscopableChain(object) { |
with (object) { |
assertEquals(1, x); |
} |
+ |
+ object[Symbol.unscopables] = { |
+ __proto__: {x: undefined} |
+ }; |
+ with (object) { |
+ assertEquals(2, x); |
+ } |
} |
runTest(TestUnscopableChain); |
@@ -222,6 +236,14 @@ function TestOnProto(object, proto) { |
assertEquals(5, y); |
assertEquals(3, z); |
} |
+ |
+ proto[Symbol.unscopables] = {y: true}; |
+ object[Symbol.unscopables] = {x: true, y: undefined}; |
+ with (object) { |
+ assertEquals(1, x); |
+ assertEquals(5, y); |
+ assertEquals(3, z); |
+ } |
} |
runTest(TestOnProto); |
@@ -341,6 +363,20 @@ function TestChangeDuringWithWithPossibleOptimization4(object) { |
TestChangeDuringWithWithPossibleOptimization4({}); |
+function TestChangeDuringWithWithPossibleOptimization4(object) { |
+ var x = 1; |
+ object.x = 2; |
+ object[Symbol.unscopables] = {x: true}; |
+ with (object) { |
+ for (var i = 0; i < 1000; i++) { |
+ if (i === 500) object[Symbol.unscopables].x = undefined; |
+ assertEquals(i < 500 ? 1 : 2, x); |
+ } |
+ } |
+} |
+TestChangeDuringWithWithPossibleOptimization4({}); |
+ |
+ |
function TestAccessorReceiver(object, proto) { |
var x = 'local'; |
@@ -532,9 +568,11 @@ function TestAccessorOnUnscopables(object) { |
var x = 1; |
object.x = 2; |
+ var calls = 0; |
var unscopables = { |
get x() { |
- assertUnreachable(); |
+ calls++; |
+ return calls === 1 ? true : undefined; |
} |
}; |
@@ -542,7 +580,9 @@ function TestAccessorOnUnscopables(object) { |
assertEquals(2, x); |
object[Symbol.unscopables] = unscopables; |
assertEquals(1, x); |
+ assertEquals(2, x); |
} |
+ assertEquals(2, calls); |
} |
runTest(TestAccessorOnUnscopables); |
@@ -659,3 +699,25 @@ function TestGetUnscopablesGetterThrows() { |
}, CustomError); |
} |
TestGetUnscopablesGetterThrows(); |
+ |
+ |
+function TestGetUnscopablesGetterThrows2() { |
+ var object = { |
+ get x() { |
+ assertUnreachable(); |
+ } |
+ }; |
+ function CustomError() {} |
+ |
+ object[Symbol.unscopables] = { |
+ get x() { |
+ throw new CustomError(); |
+ } |
+ }; |
+ assertThrows(function() { |
+ with (object) { |
+ x; |
+ } |
+ }, CustomError); |
+} |
+TestGetUnscopablesGetterThrows(); |