| // Copyright 2018 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: --allow-natives-syntax --opt | |
| function TestSetWithModifiedIterator(ctor) { | |
| const k1 = {}; | |
| const k2 = {}; | |
| const entries = [k1, k2]; | |
| const arrayIteratorProto = Object.getPrototypeOf(entries[Symbol.iterator]()); | |
| const originalNext = arrayIteratorProto.next; | |
| let callCount = 0; | |
| arrayIteratorProto.next = function() { | |
| callCount++; | |
| return originalNext.call(this); | |
| }; | |
| const set = new ctor(entries); | |
| assertEquals(3, callCount); // +1 for iterator done | |
| if('size' in set) assertEquals(2, set.size); | |
| assertTrue(set.has(k1)); | |
| assertTrue(set.has(k2)); | |
| arrayIteratorProto.next = originalNext; | |
| } | |
| %PrepareFunctionForOptimization(TestSetWithModifiedIterator); | |
| TestSetWithModifiedIterator(Set); | |
| TestSetWithModifiedIterator(Set); | |
| TestSetWithModifiedIterator(Set); | |
| %OptimizeFunctionOnNextCall(TestSetWithModifiedIterator); | |
| TestSetWithModifiedIterator(Set); | |
| assertOptimized(TestSetWithModifiedIterator); | |
| %DeoptimizeFunction(TestSetWithModifiedIterator); | |
| %PrepareFunctionForOptimization(TestSetWithModifiedIterator); | |
| TestSetWithModifiedIterator(WeakSet); | |
| TestSetWithModifiedIterator(WeakSet); | |
| TestSetWithModifiedIterator(WeakSet); | |
| %OptimizeFunctionOnNextCall(TestSetWithModifiedIterator); | |
| TestSetWithModifiedIterator(WeakSet); | |
| assertOptimized(TestSetWithModifiedIterator); | |
| %DeoptimizeFunction(TestSetWithModifiedIterator); | |
| function TestMapWithModifiedIterator(ctor) { | |
| const k1 = {}; | |
| const k2 = {}; | |
| const entries = [[k1, 1], [k2, 2]]; | |
| const arrayIteratorProto = Object.getPrototypeOf(entries[Symbol.iterator]()); | |
| const originalNext = arrayIteratorProto.next; | |
| let callCount = 0; | |
| arrayIteratorProto.next = function() { | |
| callCount++; | |
| return originalNext.call(this); | |
| }; | |
| const set = new ctor(entries); | |
| assertEquals(3, callCount); // +1 for iterator done | |
| if('size' in set) assertEquals(2, set.size); | |
| assertEquals(1, set.get(k1)); | |
| assertEquals(2, set.get(k2)); | |
| arrayIteratorProto.next = originalNext; | |
| } | |
| %PrepareFunctionForOptimization(TestMapWithModifiedIterator); | |
| TestMapWithModifiedIterator(Map); | |
| TestMapWithModifiedIterator(Map); | |
| TestMapWithModifiedIterator(Map); | |
| %OptimizeFunctionOnNextCall(TestMapWithModifiedIterator); | |
| TestMapWithModifiedIterator(Map); | |
| assertOptimized(TestMapWithModifiedIterator); | |
| %DeoptimizeFunction(TestMapWithModifiedIterator); | |
| %PrepareFunctionForOptimization(TestMapWithModifiedIterator); | |
| TestMapWithModifiedIterator(WeakMap); | |
| TestMapWithModifiedIterator(WeakMap); | |
| TestMapWithModifiedIterator(WeakMap); | |
| %OptimizeFunctionOnNextCall(TestMapWithModifiedIterator); | |
| TestMapWithModifiedIterator(WeakMap); | |
| assertOptimized(TestMapWithModifiedIterator); | |
| %DeoptimizeFunction(TestMapWithModifiedIterator); |