[Test] Make collections-constructor-custom-iterator resilient to GCs.

The optimized code for TestSetWithCustomIterator holds a weak reference to the map
for the entries object. If this is collected by the GC then the optimized code deopts
which causes the test to fail. To prevent this, hold onto an entires object to keep
it's map alive.

Change-Id: I5796e74fc1d7c5061bf8c98f7a82fe582d6be76a
Reviewed-on: https://chromium-review.googlesource.com/c/1357043
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Commit-Queue: Ross McIlroy <rmcilroy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57978}
This commit is contained in:
Ross McIlroy 2018-11-30 17:24:26 +00:00 committed by Commit Bot
parent 298aefa600
commit 4a395137a1

View File

@ -4,6 +4,8 @@
// Flags: --allow-natives-syntax --opt
var global;
function TestSetWithCustomIterator(ctor) {
const k1 = {};
const k2 = {};
@ -19,6 +21,9 @@ function TestSetWithCustomIterator(ctor) {
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;
}
TestSetWithCustomIterator(Set);
TestSetWithCustomIterator(Set);
@ -49,6 +54,9 @@ function TestMapWithCustomIterator(ctor) {
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;
}
TestMapWithCustomIterator(Map);
TestMapWithCustomIterator(Map);