#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);
- });
-}