Index: test/mjsunit/es6/spread-call.js |
diff --git a/test/mjsunit/es6/spread-call.js b/test/mjsunit/es6/spread-call.js |
index 05e17741d6862886be52ea2abe502bb798716fe8..de38f129cd0a39c029af5429371454b004e4dcb0 100644 |
--- a/test/mjsunit/es6/spread-call.js |
+++ b/test/mjsunit/es6/spread-call.js |
@@ -24,6 +24,13 @@ |
assertEquals(5, countArgs(...[1, 2, 3, 4, 5])); |
assertEquals(6, countArgs(...[1, 2, 3, 4, 5, 6])); |
+ assertEquals(1, countArgs(...[1.1])); |
+ assertEquals(2, countArgs(...[1.1, 2.2])); |
+ assertEquals(3, countArgs(...[1.1, 2.2, 3.3])); |
+ assertEquals(4, countArgs(...[1.1, 2.2, 3.3, 4.4])); |
+ assertEquals(5, countArgs(...[1.1, 2.2, 3.3, 4.4, 5.5])); |
+ assertEquals(6, countArgs(...[1.1, 2.2, 3.3, 4.4, 5.5, 6.6])); |
+ |
assertEquals(1, countArgs(...new Set([1]))); |
assertEquals(2, countArgs(...new Set([1, 2]))); |
assertEquals(3, countArgs(...new Set([1, 2, 3]))); |
@@ -346,6 +353,91 @@ |
assertEquals("ABXYC1C2DEBXYC1C2", log); |
})(); |
+(function testArrayPrototypeHoleGetterModifiesIteratorPrototypeNext() { |
+ function sum() { |
+ var sum = arguments[0]; |
+ for (var i = 1; i < arguments.length; ++i) { |
+ sum += arguments[i]; |
+ } |
+ return sum; |
+ } |
+ var a = [1, 2]; |
+ a[3] = 4; |
+ var called = 0; |
+ |
+ Object.defineProperty(Array.prototype, 2, { |
+ get: function() { |
+ var ai = a[Symbol.iterator](); |
+ var original_next = ai.__proto__["next"]; |
+ Object.defineProperty(ai.__proto__, "next", { |
+ get: function() { |
+ called++; |
+ return original_next; |
+ } |
+ }); |
+ return 3; |
+ }, |
+ configurable: true |
+ }); |
+ |
+ assertEquals(10, sum(...a)); |
+ assertEquals(2, called); |
+ |
+ Object.defineProperty(Array.prototype, 2, {}); |
+})(); |
+ |
+(function testArrayHasOtherPrototype() { |
+ function countArgs() { return arguments.length; } |
+ var a = [1, 2, 3]; |
+ var b = {}; |
+ Object.defineProperty(b, Symbol.iterator, { |
+ value: function*() { |
+ yield 4; |
+ }, |
+ configurable: true |
+ }); |
+ |
+ Object.setPrototypeOf(a, b); |
+ |
+ assertEquals(1, countArgs(...a)); |
+})(); |
+ |
+(function testArrayIteratorPrototypeGetter() { |
+ function countArgs() { return arguments.length; } |
+ var a = [1, 2, 3]; |
+ var ai = a[Symbol.iterator](); |
+ var called = 0; |
+ |
+ var original_next = ai.__proto__["next"]; |
+ |
+ Object.defineProperty(ai.__proto__, "next", { |
+ get: function() { |
+ called++; |
+ return original_next; |
+ } |
+ }); |
+ |
+ countArgs(...a); |
+ |
+ // should be called 4 times; 3 for the values, 1 for the final |
+ // {value: undefined, done: true} pair |
+ assertEquals(4, called); |
+})(); |
+ |
+(function testArrayIteratorPrototypeModified() { |
+ function countArgs() { return arguments.length; } |
+ var a = [1,2,3]; |
+ var ai = a[Symbol.iterator](); |
+ Object.defineProperty(ai.__proto__, "next", { |
+ value: function() { |
+ return {value: undefined, done: true}; |
+ }, |
+ configurable: true |
+ }); |
+ |
+ assertEquals(0, countArgs(...a)); |
+ |
+})(); |
(function testCustomArrayPrototypeIterator() { |
var origIterator = |
@@ -370,3 +462,29 @@ |
Object.defineProperty(Array.prototype, Symbol.iterator, origIterator); |
})(); |
+ |
+(function testGetPropertyIteratorCalledExactlyOnce() { |
+ function countArgs() { return arguments.length; } |
+ var a = [1, 2, 3]; |
+ var called = 0; |
+ |
+ Object.defineProperty(Array.prototype, Symbol.iterator, { |
+ value: function*() { |
+ yield 1; |
+ yield 2; |
+ }, |
+ configurable: true |
+ }); |
+ |
+ var it = a[Symbol.iterator]; |
+ Object.defineProperty(a, Symbol.iterator, { |
+ get: function() { |
+ called++; |
+ return it; |
+ } |
+ }); |
+ |
+ countArgs(...a); |
+ |
+ assertEquals(1, called); |
+})(); |