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