| // Copyright 2019 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: --harmony-weak-refs --expose-gc --noincremental-marking |
| |
| let cleanup_call_count = 0; |
| let cleanup_holdings_count = 0; |
| let cleanup = function(iter) { |
| for (holdings of iter) { |
| assertEquals("holdings2", holdings); |
| ++cleanup_holdings_count; |
| } |
| ++cleanup_call_count; |
| } |
| |
| let fg = new FinalizationGroup(cleanup); |
| let key1 = {"k": "key1"}; |
| let key2 = {"k": "key2"}; |
| // Create three objects and register them in the FinalizationGroup. The objects |
| // need to be inside a closure so that we can reliably kill them! |
| |
| (function() { |
| let object1a = {}; |
| fg.register(object1a, "holdings1a", key1); |
| |
| let object1b = {}; |
| fg.register(object1b, "holdings1b", key1); |
| |
| let object2 = {}; |
| fg.register(object2, "holdings2", key2); |
| |
| // Unregister before the GC has a chance to discover the objects. |
| let success = fg.unregister(key1); |
| assertTrue(success); |
| |
| // objects go out of scope. |
| })(); |
| |
| // This GC will reclaim the target objects. |
| gc(); |
| assertEquals(0, cleanup_call_count); |
| |
| // Assert that the cleanup function will be called only for the reference which |
| // was not unregistered. |
| let timeout_func = function() { |
| assertEquals(1, cleanup_call_count); |
| assertEquals(1, cleanup_holdings_count); |
| } |
| |
| setTimeout(timeout_func, 0); |