| // 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 | |
| var global; | |
| function TestSetWithCustomIterator(ctor) { | |
| const k1 = {}; | |
| const k2 = {}; | |
| const entries = [k1]; | |
| let callCount = 0; | |
| entries[Symbol.iterator] = () => ({ | |
| next: () => | |
| callCount++ === 0 | |
| ? { value: k2, done: false } | |
| : { done: true } | |
| }); | |
| const set = new ctor(entries); | |
| assertFalse(set.has(k1)); | |
| assertTrue(set.has(k2)); | |
| assertEquals(2, callCount); | |
| // Keep entries alive to avoid collection of the weakly held map in optimized | |
| // code which causes the code to deopt. | |
| global = entries; | |
| } | |
| %PrepareFunctionForOptimization(TestSetWithCustomIterator); | |
| TestSetWithCustomIterator(Set); | |
| TestSetWithCustomIterator(Set); | |
| TestSetWithCustomIterator(Set); | |
| %OptimizeFunctionOnNextCall(TestSetWithCustomIterator); | |
| TestSetWithCustomIterator(Set); | |
| assertOptimized(TestSetWithCustomIterator); | |
| TestSetWithCustomIterator(WeakSet); | |
| %PrepareFunctionForOptimization(TestSetWithCustomIterator); | |
| TestSetWithCustomIterator(WeakSet); | |
| TestSetWithCustomIterator(WeakSet); | |
| %OptimizeFunctionOnNextCall(TestSetWithCustomIterator); | |
| TestSetWithCustomIterator(WeakSet); | |
| assertOptimized(TestSetWithCustomIterator); | |
| function TestMapWithCustomIterator(ctor) { | |
| const k1 = {}; | |
| const k2 = {}; | |
| const entries = [[k1, 1]]; | |
| let callCount = 0; | |
| entries[Symbol.iterator] = () => ({ | |
| next: () => | |
| callCount++ === 0 | |
| ? { value: [k2, 2], done: false } | |
| : { done: true } | |
| }); | |
| const map = new ctor(entries); | |
| assertFalse(map.has(k1)); | |
| assertEquals(2, map.get(k2)); | |
| assertEquals(2, callCount); | |
| // Keep entries alive to avoid collection of the weakly held map in optimized | |
| // code which causes the code to deopt. | |
| global = entries; | |
| } | |
| %PrepareFunctionForOptimization(TestMapWithCustomIterator); | |
| TestMapWithCustomIterator(Map); | |
| TestMapWithCustomIterator(Map); | |
| TestMapWithCustomIterator(Map); | |
| %OptimizeFunctionOnNextCall(TestMapWithCustomIterator); | |
| TestMapWithCustomIterator(Map); | |
| assertOptimized(TestMapWithCustomIterator); | |
| TestMapWithCustomIterator(WeakMap); | |
| %PrepareFunctionForOptimization(TestMapWithCustomIterator); | |
| TestMapWithCustomIterator(WeakMap); | |
| TestMapWithCustomIterator(WeakMap); | |
| %OptimizeFunctionOnNextCall(TestMapWithCustomIterator); | |
| TestMapWithCustomIterator(WeakMap); | |
| assertOptimized(TestMapWithCustomIterator); |