Fixes dart-lang/sdk#48391. Use function with 'no-inline' to create a WeakReference and to lost link to its target
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t01.dart b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t01.dart
index 97643e1..ad3ddc3 100644
--- a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t01.dart
+++ b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t01.dart
@@ -21,15 +21,22 @@
class C {
int id;
C(this.id);
+
+ String toString() => "C($id)";
}
-main() {
- C? c = C(42);
+@pragma('vm:never-inline')
+WeakReference<C> createWeakReference() {
+ C c = C(42);
WeakReference<C> wr = WeakReference(c);
Expect.equals(c, wr.target);
triggerGc();
Expect.equals(c, wr.target);
- c = null;
+ return wr;
+}
+
+main() {
+ WeakReference<C> wr = createWeakReference();
triggerGc();
Expect.isNull(wr.target);
}
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t02.dart b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t02.dart
index 93e8790..489419c 100644
--- a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t02.dart
+++ b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t02.dart
@@ -21,16 +21,22 @@
class C {
int id;
C(this.id);
+
+ String toString() => "C($id)";
}
-main() {
+@pragma('vm:never-inline')
+WeakReference<C> createWeakReference() {
List<C> refs = List.filled(5, C(42), growable: true);
-
- WeakReference<C> wr = WeakReference(refs[0]);
+ WeakReference<C> wr = WeakReference(refs[0]);
Expect.equals(refs[0], wr.target);
triggerGc();
Expect.equals(refs[1], wr.target);
- refs.clear();
+ return wr;
+}
+
+main() {
+ WeakReference<C> wr = createWeakReference();
triggerGc();
Expect.isNull(wr.target);
}
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t03.dart b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t03.dart
index 687aa64..f97ffb3 100644
--- a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t03.dart
+++ b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t03.dart
@@ -21,16 +21,24 @@
class C {
int id;
C(this.id);
+
+ String toString() => "C($id)";
}
C? c = C(42);
-main() {
+@pragma('vm:never-inline')
+WeakReference<C> createWeakReference() {
WeakReference<C> wr = WeakReference(c!);
Expect.equals(c, wr.target);
triggerGc();
Expect.equals(c, wr.target);
c = null;
+ return wr;
+}
+main() {
+ WeakReference<C> wr = createWeakReference();
+ print(c);
triggerGc();
Expect.isNull(wr.target);
}
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t04.dart b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t04.dart
index 453fc5a..65e26dc 100644
--- a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t04.dart
+++ b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t04.dart
@@ -21,17 +21,29 @@
class C {
int id;
C(this.id);
+
+ String toString() => "C($id)";
}
-main() {
+dynamic d;
+
+@pragma('vm:never-inline')
+WeakReference<C> createWeakReference() {
C? c = C(42);
- dynamic d = c;
+ d = c;
WeakReference<C> wr = WeakReference(c);
Expect.equals(c, wr.target);
c = null;
triggerGc();
Expect.isNotNull(wr.target);
Expect.equals(d, wr.target);
+ return wr;
+}
+
+main() {
+ WeakReference<C> wr = createWeakReference();
+ triggerGc();
+ Expect.isNotNull(wr.target);
d = 42;
triggerGc();
Expect.isNull(wr.target);
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t05.dart b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t05.dart
index be09c8d..56b3aa9 100644
--- a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t05.dart
+++ b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t05.dart
@@ -21,6 +21,8 @@
class C {
int id;
C(this.id);
+
+ String toString() => "C($id)";
}
main() async {
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t06.dart b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t06.dart
index 47d215d..c348ab2 100644
--- a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t06.dart
+++ b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t06.dart
@@ -21,6 +21,8 @@
class C {
int id;
C(this.id);
+
+ String toString() => "C($id)";
}
main() async {
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t07.dart b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t07.dart
index 5c92af2..8fa7593 100644
--- a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t07.dart
+++ b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t07.dart
@@ -21,20 +21,30 @@
class C {
int id;
C(this.id);
+
+ String toString() => "C($id)";
+}
+
+C? c1;
+
+@pragma('vm:never-inline')
+WeakReference<C> createWeakReference() {
+ C? c2 = C(42);
+ c1 = c2;
+ WeakReference<C> wr = WeakReference(c2);
+ Expect.equals(c2, wr.target);
+ c2 = null;
+ triggerGc();
+ Expect.isNotNull(wr.target);
+ Expect.equals(c1, wr.target);
+ return wr;
}
main() {
- C? c1 = C(42);
- C? c2 = c1;
- WeakReference<C> wr = WeakReference(c1);
- Expect.equals(c1, wr.target);
- triggerGc();
- Expect.equals(c1, wr.target);
- c1 = null;
+ WeakReference<C> wr = createWeakReference();
triggerGc();
Expect.isNotNull(wr.target);
- Expect.equals(c2, wr.target);
- c2 = null;
+ c1 = C(-1);
triggerGc();
Expect.isNull(wr.target);
}
diff --git a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t08.dart b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t08.dart
index ecd33b3..1617474 100644
--- a/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t08.dart
+++ b/LanguageFeatures/FinalizationRegistry/ffi/WeakReference/weak_reference_target_t08.dart
@@ -21,10 +21,13 @@
class C {
int id;
C(this.id);
+
+ String toString() => "C($id)";
}
-main() {
- C? c = C(42);
+@pragma('vm:never-inline')
+List<WeakReference<C>> createWeakReference() {
+ C c = C(42);
WeakReference<C> wr1 = WeakReference(c);
WeakReference<C> wr2 = WeakReference(c);
Expect.equals(c, wr1.target);
@@ -32,8 +35,14 @@
triggerGc();
Expect.equals(c, wr1.target);
Expect.equals(c, wr2.target);
- c = null;
+ return [wr1, wr2];
+}
+
+main() {
+ List<WeakReference<C>> refs = createWeakReference();
+ Expect.isNotNull(refs[0].target);
+ Expect.isNotNull(refs[1].target);
triggerGc();
- Expect.isNull(wr1.target);
- Expect.isNull(wr2.target);
+ Expect.isNull(refs[0].target);
+ Expect.isNull(refs[1].target);
}