| // 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: --harmony-weak-refs --expose-gc --noincremental-marking |
| |
| load("./resources/v8-mjsunit.js", "caller relative"); |
| |
| let called = false; |
| let cleanup = function(holdings) { |
| // See which target we're cleaning up and unregister the other one. |
| if (holdings == 1) { |
| let success = fg.unregister(key2); |
| assertTrue(success || called); |
| } else { |
| assertSame(holdings, 2); |
| let success = fg.unregister(key1); |
| assertTrue(success || called); |
| } |
| called = true; |
| } |
| |
| let fg = new FinalizationRegistry(cleanup); |
| let key1 = {"k": "first key"}; |
| let key2 = {"k": "second key"}; |
| // Create two objects and register them in the FinalizationRegistry. The objects |
| // need to be inside a closure so that we can reliably kill them! |
| |
| (function() { |
| for (let i = 0; i < 1000; ++i) { |
| let object1 = {}; |
| fg.register(object1, 1, key1); |
| let object2 = {}; |
| fg.register(object2, 2, key2); |
| } |
| })(); |
| |
| // This GC will reclaim target objects and schedule cleanup. |
| gc(); |
| assertFalse(called); |
| |
| // Assert that the cleanup function was called and cleaned up one holdings (but not the other one). |
| let timeout_func = function() { |
| assertTrue(called); |
| } |
| |
| setTimeout(timeout_func, 0); |