#1260: Finalizer tests updated.
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t01.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t01.dart index 169e7e9..9d6312b 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t01.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t01.dart
@@ -19,15 +19,20 @@ class A {} int called = 0; -final Finalizer finalizer = Finalizer((token) { - Expect.isNull(token); +final Finalizer finalizer = Finalizer((_) { called++; }); -main() { +main() async { A a = A(); finalizer.attach(A(), null); Expect.equals(0, called); - triggerGcWithDelay(); + await triggerGcWithDelay(); + Expect.equals(0, called); + await triggerGcWithDelay(); + Expect.equals(0, called); + await triggerGcWithDelay(); + Expect.equals(0, called); + await triggerGcWithDelay(); Expect.equals(0, called); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t02.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t02.dart index 05f6654..4046a2d 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t02.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t02.dart
@@ -23,8 +23,8 @@ called++; }); -main() { +main() async { finalizer.attach(Object(), "abc"); - triggerGcWithDelay(); // Call FullGC 3 times + await triggerGcWithDelay(); // Call FullGC Expect.equals(1, called); // Callback function should be called only once }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t03.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t03.dart index 01ca35d..60a2625 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t03.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t03.dart
@@ -28,6 +28,6 @@ finalizer.attach(obj, "Testme"); print(obj); obj = null; - triggerGcWithDelay(); // Call FullGC 3 times - Expect.equals(1, called); // Finalizer should be called only once + triggerGcWithDelay(); + Expect.equals(1, called); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t04.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t04.dart index ad80fe6..a073f19 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t04.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/Finalizer_A01_t04.dart
@@ -17,21 +17,27 @@ import '../../../../Utils/expect.dart'; int called = 0; +Object? liveObject; final Finalizer finalizer = Finalizer((token) { Expect.equals(123, token); called++; }); -test() { - Object obj = Object(); - finalizer.attach(obj, 123); - triggerGcWithDelay(); +@pragma('vm:never-inline') +test() async { + Object object = Object(); + finalizer.attach(object, 123); + await triggerGcWithDelay(); Expect.equals(0, called); + liveObject = object; } -main() { +main() async { test(); - triggerGcWithDelay(); // Call FullGC 3 times - Expect.equals(1, called); // Finalizer should be called only once + await triggerGcWithDelay(); + Expect.equals(0, called); + liveObject = null; + await triggerGcWithDelay(); + Expect.equals(1, called); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t01.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t01.dart index e994d67..e2333e7 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t01.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t01.dart
@@ -30,32 +30,31 @@ cnt++; }); +@pragma('vm:never-inline') +void test() { + Object? obj = Object(); + finalizer.attach(obj, "Just a string"); + print(obj); +} + main() async { - { - Object ? obj = Object(); - finalizer.attach(obj, "Just a string"); - print(obj); - } + test(); await triggerGcWithDelay(); Expect.equals("Just a string", returnedToken); - { - Object? obj = A(); - finalizer.attach(obj, 15); - print(obj); - obj = null; - await triggerGcWithDelay(); - Expect.equals(15, returnedToken); - } + Object? obj = A(); + finalizer.attach(obj, 15); + print(obj); + obj = List.filled(100, 1); + await triggerGcWithDelay(); + Expect.equals(15, returnedToken); - { - Object obj = List.filled(100, 1); - finalizer.attach(obj, []); - print(obj); - obj = A(); - await triggerGcWithDelay(); - Expect.equals([], returnedToken); - } + finalizer.attach(obj, []); + print(obj); + obj = A(); + await triggerGcWithDelay(); + Expect.equals([], returnedToken); + await triggerGcWithDelay(); Expect.equals(3, cnt); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t02.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t02.dart index 1f13edb..c67dd5c 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t02.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t02.dart
@@ -27,13 +27,20 @@ cnt++; }); +@pragma('vm:never-inline') +void test(token) { + Object value = Object(); + finalizer.attach(value, "Finalization token", detach: token); +} + main() async { A detachToken = A(); - { - Object value = Object(); - finalizer.attach(value, "Finalization token", detach: detachToken); - finalizer.detach(detachToken); - } + test(detachToken); + finalizer.detach(detachToken); + await triggerGcWithDelay(); + Expect.equals(0, cnt); + await triggerGcWithDelay(); + Expect.equals(0, cnt); await triggerGcWithDelay(); Expect.equals(0, cnt); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t03.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t03.dart index 5f0f64f..c558066 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t03.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t03.dart
@@ -25,37 +25,40 @@ Object? returnedToken; int cnt = 0; + final Finalizer<int> finalizer = Finalizer((token) { returnedToken = token; cnt++; }); +@pragma('vm:never-inline') +void test(int token) { + Object value = Object(); + finalizer.attach(value, token); +} + main() async { - { - Object? obj = Object(); - finalizer.attach(obj, 1); - print(obj); - } + test(1); await triggerGcWithDelay(); Expect.equals(1, returnedToken); - { - Object? obj = A(); - finalizer.attach(obj, 15); - print(obj); - obj = null; - await triggerGcWithDelay(); - Expect.equals(15, returnedToken); - } + Object? obj = A(); + finalizer.attach(obj, 15); + print(obj); + obj = List.filled(100, 1); - { - Object obj = List.filled(100, 1); - finalizer.attach(obj, 14); - print(obj); - obj = A(); - await triggerGcWithDelay(); - Expect.equals([], returnedToken); - } + await triggerGcWithDelay(); + Expect.equals(15, returnedToken); + finalizer.attach(obj, 14); + print(obj); + obj = A(); + await triggerGcWithDelay(); + Expect.equals([], returnedToken); + Expect.equals(3, cnt); + + await triggerGcWithDelay(); + await triggerGcWithDelay(); + await triggerGcWithDelay(); Expect.equals(3, cnt); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t04.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t04.dart index cd6e162..4a4f526 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t04.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A01_t04.dart
@@ -32,8 +32,9 @@ { Object value = Object(); finalizer.attach(value, "Finalization token", detach: detachToken); - finalizer.detach(detachToken); + value = Object(); } + finalizer.detach(detachToken); await triggerGcWithDelay(); Expect.equals(0, cnt); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A02_t01.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A02_t01.dart index 27d3c64..db2e794 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A02_t01.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A02_t01.dart
@@ -34,13 +34,8 @@ Expect.isFalse(called); test(value); - Object value1 = value; - value = 12345; - await triggerGcWithDelay(); - Expect.isFalse(called); - - var value2 = test1(value1); - value1 = value; + var value2 = test1(value); + var value1 = value; await triggerGcWithDelay(); Expect.isFalse(called); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A03_t01.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A03_t01.dart index 1f10a54..af1f22e 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A03_t01.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A03_t01.dart
@@ -19,10 +19,6 @@ called++; }); -void test(Object o) { - triggerGcWithDelay(); -} - Object test1(Object obj) => obj; main() async { @@ -37,7 +33,6 @@ // Initial object is not accessible anymore. // Do something, call triggerGC several times and check that callback was // not called during the execution. - test(value); await triggerGcWithDelay(); var value1 = test1(value);
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A04_t11.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A04_t11.dart new file mode 100644 index 0000000..1908a0c --- /dev/null +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A04_t11.dart
@@ -0,0 +1,50 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +/// @assertion The value and detach arguments ... Both must be objects supported +/// as an [Expando] key. +/// +/// @description Checks that [value] must be supported as an [Expando] key. +/// Test [Null]: it should not throw on a [null] detach argument, just treat it +/// as having no detach object. Passing null is the same as not passing any +/// argument. See Issue 48390 evaluation for more details. +/// @author iarkh@unipro.ru +/// @issue 48390 + +import '../../../../Utils/expect.dart'; +import '../../gc_utils_lib.dart'; + + +final finalizerTokens = <Object>{}; +int cnt = 0; + +final Finalizer finalizer = Finalizer((token) { + finalizerTokens.add(token); + cnt++; +}); + +Object object1 = Object(); +Object object2 = Object(); + +main() async { + finalizer.attach(object1, "Object1", detach: null); + + dynamic d = null; + finalizer.attach(object2, "Object2", detach: d); + + object1 = "Object is free"; + object2 = "Finalizer can be called"; + + await triggerGcWithDelay(); + Expect.setEquals({"Object1", "Object2"}, finalizerTokens); + Expect.equals(2, cnt); + + await triggerGcWithDelay(); + Expect.setEquals({"Object1", "Object2"}, finalizerTokens); + Expect.equals(2, cnt); + + await triggerGcWithDelay(); + Expect.setEquals({"Object1", "Object2"}, finalizerTokens); + Expect.equals(2, cnt); +}
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A05_t01.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A05_t01.dart index c484b76..ceb9384 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A05_t01.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A05_t01.dart
@@ -5,7 +5,8 @@ /// @assertion The [value] and [detach] arguments ... may be the same object. /// /// @description Checks that [value] and [detach] arguments can be the same -/// object. +/// object. If [value] is not a live object anymore and it was not detached, +/// finalyzer can run. /// @author iarkh@unipro.ru import '../../gc_utils_lib.dart'; @@ -16,12 +17,20 @@ called++; }); + +@pragma('vm:never-inline') +void test() { + Object obj = Object(); + finalizer.attach(obj, "Just a string", detach: obj); + print(obj); +} + main() async { - { - Object value = Object(); - finalizer.attach(value, "Finalization token", detach: value); - finalizer.detach(value); - } + test(); await triggerGcWithDelay(); - Expect.equals(0, called); + Expect.equals(1, called); + await triggerGcWithDelay(); + Expect.equals(1, called); + await triggerGcWithDelay(); + Expect.equals(1, called); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A05_t02.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A05_t02.dart index f42d405..022a97d 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A05_t02.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A05_t02.dart
@@ -5,7 +5,7 @@ /// @assertion The [value] and [detach] arguments ... may be the same object. /// /// @description Checks that [value] and [detach] arguments can be the same -/// object. +/// object. If object was detached, finalizer never starts. /// @author iarkh@unipro.ru import '../../gc_utils_lib.dart'; @@ -16,12 +16,20 @@ called++; }); +@pragma('vm:never-inline') +void test() { + Object obj = Object(); + finalizer.attach(obj, "Just a string", detach: obj); + print(obj); + finalizer.detach(obj); +} + main() async { - Object value = Object(); - finalizer.attach(value, "Finalization token", detach: value); - print(value); - finalizer.detach(value); - value = 12345; + test(); + await triggerGcWithDelay(); + Expect.equals(0, called); + await triggerGcWithDelay(); + Expect.equals(0, called); await triggerGcWithDelay(); Expect.equals(0, called); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t01.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t01.dart index 9f11e22..8f96ac1 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t01.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t01.dart
@@ -23,16 +23,20 @@ finalizerTokens.add(token); }); +@pragma('vm:never-inline') +void test(Nonce token1, Nonce token2, Nonce token3) { + Object value = Object(); + finalizer.attach(value, "Finalization token", detach: token1); + finalizer.attach(value, "Finalization token", detach: token2); + finalizer.attach(value, "Finalization token", detach: token3); +} + main() async { Nonce token1 = Nonce(1); Nonce token2 = Nonce(2); Nonce token3 = Nonce(3); - { - Object value = Object(); - finalizer.attach(value, "Finalization token", detach: token1); - finalizer.attach(value, "Finalization token", detach: token2); - finalizer.attach(value, "Finalization token", detach: token3); - } + + test(token1, token2, token3); await triggerGcWithDelay(); Expect.setEquals({token1, token2, token3}, finalizerTokens);
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t02.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t02.dart index 6a35c34..973c119 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t02.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t02.dart
@@ -18,20 +18,29 @@ } final finalizerTokens = <Nonce>{}; +int cnt = 0; final Finalizer finalizer = Finalizer((token) { + cnt++; finalizerTokens.add(token); }); +@pragma('vm:never-inline') +void test(Nonce token) { + Object value = Object(); + finalizer.attach(value, "Finalization token", detach: token); + finalizer.attach(value, "Finalization token", detach: token); + finalizer.attach(value, "Finalization token", detach: token); +} + main() async { Nonce token = Nonce(1); - { - Object value = Object(); - finalizer.attach(value, "Finalization token", detach: token); - finalizer.attach(value, "Finalization token", detach: token); - finalizer.attach(value, "Finalization token", detach: token); - } - + test(token); await triggerGcWithDelay(); Expect.setEquals({token}, finalizerTokens); + await triggerGcWithDelay(); + Expect.setEquals({token}, finalizerTokens); + await triggerGcWithDelay(); + Expect.setEquals({token}, finalizerTokens); + Expect.equals(1, cnt); }
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t03.dart b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t03.dart index b7561b7..afeec7e 100644 --- a/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t03.dart +++ b/LanguageFeatures/FinalizationRegistry/ffi/Finalizer/attach_A06_t03.dart
@@ -18,28 +18,38 @@ } final finalizerTokens = <Nonce>{}; - +int cnt = 0; final Finalizer finalizer = Finalizer((token) { finalizerTokens.add(token); + cnt++; }); +@pragma('vm:never-inline') +void test(Nonce token1, token2, token3) { + Object value = Object(); + finalizer.attach(value, "Finalization token", detach: token1); + finalizer.attach(value, "Finalization token", detach: token2); + finalizer.attach(value, "Finalization token", detach: token3); + finalizer.attach(value, "Finalization token", detach: token1); + finalizer.attach(value, "Finalization token", detach: token2); + finalizer.attach(value, "Finalization token", detach: token3); + finalizer.attach(value, "Finalization token", detach: token1); + finalizer.attach(value, "Finalization token", detach: token2); + finalizer.attach(value, "Finalization token", detach: token3); +} + main() async { Nonce token1 = Nonce(1); Nonce token2 = Nonce(2); Nonce token3 = Nonce(3); - { - Object value = Object(); - finalizer.attach(value, "Finalization token", detach: token1); - finalizer.attach(value, "Finalization token", detach: token2); - finalizer.attach(value, "Finalization token", detach: token3); - finalizer.attach(value, "Finalization token", detach: token1); - finalizer.attach(value, "Finalization token", detach: token2); - finalizer.attach(value, "Finalization token", detach: token3); - finalizer.attach(value, "Finalization token", detach: token1); - finalizer.attach(value, "Finalization token", detach: token2); - finalizer.attach(value, "Finalization token", detach: token3); - } + + test(token1, token2, token3); await triggerGcWithDelay(); Expect.setEquals({token1, token2, token3}, finalizerTokens); + await triggerGcWithDelay(); + Expect.setEquals({token1, token2, token3}, finalizerTokens); + await triggerGcWithDelay(); + Expect.setEquals({token1, token2, token3}, finalizerTokens); + Expect.equals(3, cnt); }
diff --git a/LanguageFeatures/FinalizationRegistry/no_ffi/Finalizer/attach_A04_t11.dart b/LanguageFeatures/FinalizationRegistry/no_ffi/Finalizer/attach_A04_t11.dart deleted file mode 100644 index f933f77..0000000 --- a/LanguageFeatures/FinalizationRegistry/no_ffi/Finalizer/attach_A04_t11.dart +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -/// @assertion The value and detach arguments ... Both must be objects supported -/// as an [Expando] key. -/// -/// @description Checks that [value] must be supported as an [Expando] key. -/// Test [Null]. -/// @author iarkh@unipro.ru -/// @issue 48390 - -import '../../../../Utils/expect.dart'; - -final Finalizer finalizer = Finalizer((_) { throw "Should not reach here"; }); -Object object = Object(); - -main() { - Expect.throws(() { - finalizer.attach(object, "Finalization token", detach: null); - }); - - dynamic d = null; - Expect.throws(() { - finalizer.attach(object, "Finalization token", detach: d); - }); -}