Version 2.17.0-228.0.dev

Merge commit '69d66d9bd5a4ba79bc9040a60ec9e93df0a25255' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 45cd4ba..46404b1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -83,7 +83,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 211;
+  static const int DATA_VERSION = 212;
 
   static const bool _applyFileChangesSynchronously = true;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index ca06838..ff42940 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -21,6 +21,7 @@
   EnableString.extension_methods: ExperimentalFeatures.extension_methods,
   EnableString.extension_types: ExperimentalFeatures.extension_types,
   EnableString.generic_metadata: ExperimentalFeatures.generic_metadata,
+  EnableString.inference_update_1: ExperimentalFeatures.inference_update_1,
   EnableString.macros: ExperimentalFeatures.macros,
   EnableString.named_arguments_anywhere:
       ExperimentalFeatures.named_arguments_anywhere,
@@ -63,6 +64,9 @@
   /// String to enable the experiment "generic-metadata"
   static const String generic_metadata = 'generic-metadata';
 
+  /// String to enable the experiment "inference-update-1"
+  static const String inference_update_1 = 'inference-update-1';
+
   /// String to enable the experiment "macros"
   static const String macros = 'macros';
 
@@ -181,8 +185,18 @@
     releaseVersion: Version.parse('2.14.0'),
   );
 
-  static final macros = ExperimentalFeature(
+  static final inference_update_1 = ExperimentalFeature(
     index: 8,
+    enableString: EnableString.inference_update_1,
+    isEnabledByDefault: IsEnabledByDefault.inference_update_1,
+    isExpired: IsExpired.inference_update_1,
+    documentation: 'Enhanced type inference',
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
+  );
+
+  static final macros = ExperimentalFeature(
+    index: 9,
     enableString: EnableString.macros,
     isEnabledByDefault: IsEnabledByDefault.macros,
     isExpired: IsExpired.macros,
@@ -192,7 +206,7 @@
   );
 
   static final named_arguments_anywhere = ExperimentalFeature(
-    index: 9,
+    index: 10,
     enableString: EnableString.named_arguments_anywhere,
     isEnabledByDefault: IsEnabledByDefault.named_arguments_anywhere,
     isExpired: IsExpired.named_arguments_anywhere,
@@ -202,7 +216,7 @@
   );
 
   static final non_nullable = ExperimentalFeature(
-    index: 10,
+    index: 11,
     enableString: EnableString.non_nullable,
     isEnabledByDefault: IsEnabledByDefault.non_nullable,
     isExpired: IsExpired.non_nullable,
@@ -212,7 +226,7 @@
   );
 
   static final nonfunction_type_aliases = ExperimentalFeature(
-    index: 11,
+    index: 12,
     enableString: EnableString.nonfunction_type_aliases,
     isEnabledByDefault: IsEnabledByDefault.nonfunction_type_aliases,
     isExpired: IsExpired.nonfunction_type_aliases,
@@ -222,7 +236,7 @@
   );
 
   static final set_literals = ExperimentalFeature(
-    index: 12,
+    index: 13,
     enableString: EnableString.set_literals,
     isEnabledByDefault: IsEnabledByDefault.set_literals,
     isExpired: IsExpired.set_literals,
@@ -232,7 +246,7 @@
   );
 
   static final spread_collections = ExperimentalFeature(
-    index: 13,
+    index: 14,
     enableString: EnableString.spread_collections,
     isEnabledByDefault: IsEnabledByDefault.spread_collections,
     isExpired: IsExpired.spread_collections,
@@ -242,7 +256,7 @@
   );
 
   static final super_parameters = ExperimentalFeature(
-    index: 14,
+    index: 15,
     enableString: EnableString.super_parameters,
     isEnabledByDefault: IsEnabledByDefault.super_parameters,
     isExpired: IsExpired.super_parameters,
@@ -252,7 +266,7 @@
   );
 
   static final test_experiment = ExperimentalFeature(
-    index: 15,
+    index: 16,
     enableString: EnableString.test_experiment,
     isEnabledByDefault: IsEnabledByDefault.test_experiment,
     isExpired: IsExpired.test_experiment,
@@ -263,7 +277,7 @@
   );
 
   static final triple_shift = ExperimentalFeature(
-    index: 16,
+    index: 17,
     enableString: EnableString.triple_shift,
     isEnabledByDefault: IsEnabledByDefault.triple_shift,
     isExpired: IsExpired.triple_shift,
@@ -273,7 +287,7 @@
   );
 
   static final value_class = ExperimentalFeature(
-    index: 17,
+    index: 18,
     enableString: EnableString.value_class,
     isEnabledByDefault: IsEnabledByDefault.value_class,
     isExpired: IsExpired.value_class,
@@ -283,7 +297,7 @@
   );
 
   static final variance = ExperimentalFeature(
-    index: 18,
+    index: 19,
     enableString: EnableString.variance,
     isEnabledByDefault: IsEnabledByDefault.variance,
     isExpired: IsExpired.variance,
@@ -320,6 +334,9 @@
   /// Default state of the experiment "generic-metadata"
   static const bool generic_metadata = true;
 
+  /// Default state of the experiment "inference-update-1"
+  static const bool inference_update_1 = false;
+
   /// Default state of the experiment "macros"
   static const bool macros = false;
 
@@ -382,6 +399,9 @@
   /// Expiration status of the experiment "generic-metadata"
   static const bool generic_metadata = true;
 
+  /// Expiration status of the experiment "inference-update-1"
+  static const bool inference_update_1 = false;
+
   /// Expiration status of the experiment "macros"
   static const bool macros = false;
 
@@ -445,6 +465,10 @@
   /// Current state for the flag "generic-metadata"
   bool get generic_metadata => isEnabled(ExperimentalFeatures.generic_metadata);
 
+  /// Current state for the flag "inference-update-1"
+  bool get inference_update_1 =>
+      isEnabled(ExperimentalFeatures.inference_update_1);
+
   /// Current state for the flag "macros"
   bool get macros => isEnabled(ExperimentalFeatures.macros);
 
diff --git a/pkg/dart2wasm/bin/run_wasm.js b/pkg/dart2wasm/bin/run_wasm.js
index 7e962a0..b5034ea 100644
--- a/pkg/dart2wasm/bin/run_wasm.js
+++ b/pkg/dart2wasm/bin/run_wasm.js
@@ -2,16 +2,21 @@
 // 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.
 //
-// Runner V8 script for testing dart2wasm, takes ".wasm" file as argument.
+// Runner V8 script for testing dart2wasm, takes ".wasm" files as arguments.
+//
 // Run as follows:
 //
-// $> d8 --experimental-wasm-gc --wasm-gc-js-interop run_wasm.js -- <file_name>.wasm
+// $> d8 --experimental-wasm-gc --wasm-gc-js-interop run_wasm.js -- <dart_module>.wasm [<ffi_module>.wasm]
+//
+// If an FFI module is specified, it will be instantiated first, and its
+// exports will be supplied as imports to the Dart module under the 'ffi'
+// module name.
 
 function stringFromDartString(string) {
-    var length = inst.exports.$stringLength(string);
+    var length = dartInstance.exports.$stringLength(string);
     var array = new Array(length);
     for (var i = 0; i < length; i++) {
-        array[i] = inst.exports.$stringRead(string, i);
+        array[i] = dartInstance.exports.$stringRead(string, i);
     }
     return String.fromCharCode(...array);
 }
@@ -23,15 +28,15 @@
         range |= string.codePointAt(i);
     }
     if (range < 256) {
-        var dartString = inst.exports.$stringAllocate1(length);
+        var dartString = dartInstance.exports.$stringAllocate1(length);
         for (var i = 0; i < length; i++) {
-            inst.exports.$stringWrite1(dartString, i, string.codePointAt(i));
+            dartInstance.exports.$stringWrite1(dartString, i, string.codePointAt(i));
         }
         return dartString;
     } else {
-        var dartString = inst.exports.$stringAllocate2(length);
+        var dartString = dartInstance.exports.$stringAllocate2(length);
         for (var i = 0; i < length; i++) {
-            inst.exports.$stringWrite2(dartString, i, string.codePointAt(i));
+            dartInstance.exports.$stringWrite2(dartString, i, string.codePointAt(i));
         }
         return dartString;
     }
@@ -44,7 +49,7 @@
     },
     scheduleCallback: function(milliseconds, closure) {
         setTimeout(function() {
-            inst.exports.$call0(closure);
+            dartInstance.exports.$call0(closure);
         }, milliseconds);
     },
     getCurrentStackTrace: function() {
@@ -62,15 +67,28 @@
     }
 };
 
-// Create a Wasm module from the binary wasm file.
-var bytes = readbuffer(arguments[0]);
-var module = new WebAssembly.Module(bytes);
+function instantiate(filename, imports) {
+    // Create a Wasm module from the binary wasm file.
+    var bytes = readbuffer(filename);
+    var module = new WebAssembly.Module(bytes);
+    return new WebAssembly.Instance(module, imports);
+}
 
-// Instantiate the Wasm module, importing from the global scope.
+// Import from the global scope.
 var importObject = (typeof window !== 'undefined')
     ? window
     : Realm.global(Realm.current());
-var inst = new WebAssembly.Instance(module, importObject);
 
-var result = inst.exports.main();
+// Is an FFI module specified?
+if (arguments.length > 1) {
+    // instantiate FFI module
+    var ffiInstance = instantiate(arguments[1], {});
+    // Make its exports available as imports under the 'ffi' module name
+    importObject.ffi = ffiInstance.exports;
+}
+
+// Instantiate the Dart module, importing from the global scope.
+var dartInstance = instantiate(arguments[0], importObject);
+
+var result = dartInstance.exports.main();
 if (result) console.log(result);
diff --git a/pkg/dart2wasm/lib/code_generator.dart b/pkg/dart2wasm/lib/code_generator.dart
index 96cdc9b..9fe6c33 100644
--- a/pkg/dart2wasm/lib/code_generator.dart
+++ b/pkg/dart2wasm/lib/code_generator.dart
@@ -236,7 +236,9 @@
       ClassInfo info = translator.classInfo[cls]!;
       thisLocal = paramLocals[0];
       w.RefType thisType = info.nonNullableType;
-      if (translator.needsConversion(paramLocals[0].type, thisType)) {
+      if (translator.needsConversion(paramLocals[0].type, thisType) &&
+          !(cls == translator.ffiPointerClass ||
+              translator.isFfiCompound(cls))) {
         preciseThisLocal = addLocal(thisType);
         b.local_get(paramLocals[0]);
         translator.ref_cast(b, info);
@@ -988,6 +990,10 @@
   @override
   w.ValueType visitConstructorInvocation(
       ConstructorInvocation node, w.ValueType expectedType) {
+    w.ValueType? intrinsicResult =
+        intrinsifier.generateConstructorIntrinsic(node);
+    if (intrinsicResult != null) return intrinsicResult;
+
     ClassInfo info = translator.classInfo[node.target.enclosingClass]!;
     translator.functions.allocateClass(info.classId);
     w.Local temp = addLocal(info.nonNullableType);
@@ -1014,6 +1020,7 @@
       StaticInvocation node, w.ValueType expectedType) {
     w.ValueType? intrinsicResult = intrinsifier.generateStaticIntrinsic(node);
     if (intrinsicResult != null) return intrinsicResult;
+
     _visitArguments(node.arguments, node.targetReference, 0);
     return _call(node.targetReference);
   }
@@ -1042,6 +1049,7 @@
       InstanceInvocation node, w.ValueType expectedType) {
     w.ValueType? intrinsicResult = intrinsifier.generateInstanceIntrinsic(node);
     if (intrinsicResult != null) return intrinsicResult;
+
     Procedure target = node.interfaceTarget;
     if (node.kind == InstanceAccessKind.Object) {
       switch (target.name.text) {
@@ -1096,6 +1104,7 @@
   w.ValueType visitEqualsCall(EqualsCall node, w.ValueType expectedType) {
     w.ValueType? intrinsicResult = intrinsifier.generateEqualsIntrinsic(node);
     if (intrinsicResult != null) return intrinsicResult;
+
     Member? singleTarget = translator.singleTarget(node);
     if (singleTarget == translator.coreTypes.objectEquals) {
       // Plain reference comparison
@@ -1352,6 +1361,7 @@
     w.ValueType? intrinsicResult =
         intrinsifier.generateStaticGetterIntrinsic(node);
     if (intrinsicResult != null) return intrinsicResult;
+
     Member target = node.target;
     if (target is Field) {
       return translator.globals.readGlobal(b, target);
@@ -1493,6 +1503,9 @@
 
   w.ValueType _directGet(
       Member target, Expression receiver, w.ValueType? Function() intrinsify) {
+    w.ValueType? intrinsicResult = intrinsify();
+    if (intrinsicResult != null) return intrinsicResult;
+
     if (target is Field) {
       ClassInfo info = translator.classInfo[target.enclosingClass]!;
       int fieldIndex = translator.fieldIndex[target]!;
@@ -1504,8 +1517,6 @@
     } else {
       // Instance call of getter
       assert(target is Procedure && target.isGetter);
-      w.ValueType? intrinsicResult = intrinsify();
-      if (intrinsicResult != null) return intrinsicResult;
       w.BaseFunction targetFunction =
           translator.functions.getFunction(target.reference);
       wrap(receiver, targetFunction.type.inputs.single);
diff --git a/pkg/dart2wasm/lib/dispatch_table.dart b/pkg/dart2wasm/lib/dispatch_table.dart
index 3c6b024..f257241 100644
--- a/pkg/dart2wasm/lib/dispatch_table.dart
+++ b/pkg/dart2wasm/lib/dispatch_table.dart
@@ -125,8 +125,8 @@
     List<w.ValueType> inputs = List.generate(
         inputSets.length,
         (i) => translator.typeForInfo(
-            upperBound(inputSets[i]), inputNullable[i]) as w.ValueType);
-    inputs[0] = translator.ensureBoxed(inputs[0]);
+                upperBound(inputSets[i]), inputNullable[i], ensureBoxed: i == 0)
+            as w.ValueType);
     if (name == '==') {
       // == can't be called with null
       inputs[1] = inputs[1].withNullability(false);
diff --git a/pkg/dart2wasm/lib/intrinsics.dart b/pkg/dart2wasm/lib/intrinsics.dart
index 002daa3..c1d914d 100644
--- a/pkg/dart2wasm/lib/intrinsics.dart
+++ b/pkg/dart2wasm/lib/intrinsics.dart
@@ -16,6 +16,11 @@
 /// member in [generateMemberIntrinsic].
 class Intrinsifier {
   final CodeGenerator codeGen;
+
+  // The ABI type sizes are the same for 32-bit Wasm as for 32-bit ARM, so we
+  // can just use an ABI enum index corresponding to a 32-bit ARM platform.
+  static const int abiEnumIndex = 0; // androidArm
+
   static const w.ValueType boolType = w.NumType.i32;
   static const w.ValueType intType = w.NumType.i64;
   static const w.ValueType doubleType = w.NumType.f64;
@@ -145,6 +150,7 @@
       return w.NumType.i64;
     }
 
+    // _HashAbstractImmutableBase._indexNullable
     if (node.interfaceTarget == translator.immutableMapIndexNullable) {
       ClassInfo info = translator.classInfo[translator.hashFieldBaseClass]!;
       codeGen.wrap(node.receiver, info.nullableType);
@@ -152,6 +158,25 @@
       return info.struct.fields[FieldIndex.hashBaseIndex].type.unpacked;
     }
 
+    // _Compound._typedDataBase
+    if (node.interfaceTarget.enclosingClass == translator.ffiCompoundClass &&
+        name == '_typedDataBase') {
+      // A compound (subclass of Struct or Union) is represented by its i32
+      // address. The _typedDataBase field contains a Pointer pointing to the
+      // compound, whose representation is the same.
+      codeGen.wrap(node.receiver, w.NumType.i32);
+      return w.NumType.i32;
+    }
+
+    // Pointer.address
+    if (node.interfaceTarget.enclosingClass == translator.ffiPointerClass &&
+        name == 'address') {
+      // A Pointer is represented by its i32 address.
+      codeGen.wrap(node.receiver, w.NumType.i32);
+      b.i64_extend_i32_u();
+      return w.NumType.i64;
+    }
+
     return null;
   }
 
@@ -400,6 +425,31 @@
     if (receiver is ConstantExpression &&
         receiver.constant is ListConstant &&
         name == '[]') {
+      Expression arg = node.arguments.positional.single;
+
+      // If the list is indexed by a constant, or the ABI index, just pick
+      // the element at that constant index.
+      int? constIndex = null;
+      if (arg is IntLiteral) {
+        constIndex = arg.value;
+      } else if (arg is ConstantExpression) {
+        Constant argConst = arg.constant;
+        if (argConst is IntConstant) {
+          constIndex = argConst.value;
+        }
+      } else if (arg is StaticInvocation) {
+        if (arg.target.enclosingLibrary.name == "dart.ffi" &&
+            arg.name.text == "_abi") {
+          constIndex = abiEnumIndex;
+        }
+      }
+      if (constIndex != null) {
+        ListConstant list = receiver.constant as ListConstant;
+        Expression element = ConstantExpression(list.entries[constIndex]);
+        return codeGen.wrap(element, typeOfExp(element));
+      }
+
+      // Access the underlying array directly.
       ClassInfo info = translator.classInfo[translator.listBaseClass]!;
       w.RefType listType = info.nullableType;
       Field arrayField = translator.listBaseClass.fields
@@ -410,7 +460,7 @@
               as w.ArrayType;
       codeGen.wrap(receiver, listType);
       b.struct_get(info.struct, arrayFieldIndex);
-      codeGen.wrap(node.arguments.positional.single, w.NumType.i64);
+      codeGen.wrap(arg, w.NumType.i64);
       b.i32_wrap_i64();
       b.array_get(arrayType);
       return translator.topInfo.nullableType;
@@ -451,6 +501,7 @@
     w.ValueType leftType = typeOfExp(node.left);
     w.ValueType rightType = typeOfExp(node.right);
 
+    // Compare bool or Pointer
     if (leftType == boolType && rightType == boolType) {
       codeGen.wrap(node.left, w.NumType.i32);
       codeGen.wrap(node.right, w.NumType.i32);
@@ -458,6 +509,7 @@
       return w.NumType.i32;
     }
 
+    // Compare int
     if (leftType == intType && rightType == intType) {
       codeGen.wrap(node.left, w.NumType.i64);
       codeGen.wrap(node.right, w.NumType.i64);
@@ -465,6 +517,7 @@
       return w.NumType.i32;
     }
 
+    // Compare double
     if (leftType == doubleType && rightType == doubleType) {
       codeGen.wrap(node.left, w.NumType.f64);
       codeGen.wrap(node.right, w.NumType.f64);
@@ -491,6 +544,14 @@
       return w.NumType.i64;
     }
 
+    // nullptr
+    if (target.enclosingLibrary.name == "dart.ffi" &&
+        target.name.text == "nullptr") {
+      // A Pointer is represented by its i32 address.
+      b.i32_const(0);
+      return w.NumType.i32;
+    }
+
     return null;
   }
 
@@ -552,6 +613,9 @@
               translator.translateType(node.arguments.types.single);
           Expression operand = node.arguments.positional.single;
           return codeGen.wrap(operand, targetType);
+        case "_nativeEffect":
+          // Ignore argument
+          return translator.voidMarker;
         case "allocateOneByteString":
           ClassInfo info = translator.classInfo[translator.oneByteStringClass]!;
           translator.functions.allocateClass(info.classId);
@@ -644,6 +708,123 @@
       }
     }
 
+    // dart:ffi static functions
+    if (node.target.enclosingLibrary.name == "dart.ffi") {
+      // Pointer.fromAddress
+      if (name == "fromAddress") {
+        // A Pointer is represented by its i32 address.
+        codeGen.wrap(node.arguments.positional.single, w.NumType.i64);
+        b.i32_wrap_i64();
+        return w.NumType.i32;
+      }
+
+      // Accesses to Pointer.value, Pointer.value=, Pointer.[], Pointer.[]= and
+      // the members of structs and unions are desugared by the FFI kernel
+      // transformations into calls to memory load and store functions.
+      RegExp loadStoreFunctionNames = RegExp("^_(load|store)"
+          "((Int|Uint)(8|16|32|64)|(Float|Double)(Unaligned)?|Pointer)\$");
+      if (loadStoreFunctionNames.hasMatch(name)) {
+        Expression pointerArg = node.arguments.positional[0];
+        Expression offsetArg = node.arguments.positional[1];
+        codeGen.wrap(pointerArg, w.NumType.i32);
+        int offset;
+        if (offsetArg is IntLiteral) {
+          offset = offsetArg.value;
+        } else if (offsetArg is ConstantExpression &&
+            offsetArg.constant is IntConstant) {
+          offset = (offsetArg.constant as IntConstant).value;
+        } else {
+          codeGen.wrap(offsetArg, w.NumType.i64);
+          b.i32_wrap_i64();
+          b.i32_add();
+          offset = 0;
+        }
+        switch (name) {
+          case "_loadInt8":
+            b.i64_load8_s(translator.ffiMemory, offset);
+            return w.NumType.i64;
+          case "_loadUint8":
+            b.i64_load8_u(translator.ffiMemory, offset);
+            return w.NumType.i64;
+          case "_loadInt16":
+            b.i64_load16_s(translator.ffiMemory, offset);
+            return w.NumType.i64;
+          case "_loadUint16":
+            b.i64_load16_u(translator.ffiMemory, offset);
+            return w.NumType.i64;
+          case "_loadInt32":
+            b.i64_load32_s(translator.ffiMemory, offset);
+            return w.NumType.i64;
+          case "_loadUint32":
+            b.i64_load32_u(translator.ffiMemory, offset);
+            return w.NumType.i64;
+          case "_loadInt64":
+          case "_loadUint64":
+            b.i64_load(translator.ffiMemory, offset);
+            return w.NumType.i64;
+          case "_loadFloat":
+            b.f32_load(translator.ffiMemory, offset);
+            b.f64_promote_f32();
+            return w.NumType.f64;
+          case "_loadFloatUnaligned":
+            b.f32_load(translator.ffiMemory, offset, 0);
+            b.f64_promote_f32();
+            return w.NumType.f64;
+          case "_loadDouble":
+            b.f64_load(translator.ffiMemory, offset);
+            return w.NumType.f64;
+          case "_loadDoubleUnaligned":
+            b.f64_load(translator.ffiMemory, offset, 0);
+            return w.NumType.f64;
+          case "_loadPointer":
+            b.i32_load(translator.ffiMemory, offset);
+            return w.NumType.i32;
+          case "_storeInt8":
+          case "_storeUint8":
+            codeGen.wrap(node.arguments.positional[2], w.NumType.i64);
+            b.i64_store8(translator.ffiMemory, offset);
+            return translator.voidMarker;
+          case "_storeInt16":
+          case "_storeUint16":
+            codeGen.wrap(node.arguments.positional[2], w.NumType.i64);
+            b.i64_store16(translator.ffiMemory, offset);
+            return translator.voidMarker;
+          case "_storeInt32":
+          case "_storeUint32":
+            codeGen.wrap(node.arguments.positional[2], w.NumType.i64);
+            b.i64_store32(translator.ffiMemory, offset);
+            return translator.voidMarker;
+          case "_storeInt64":
+          case "_storeUint64":
+            codeGen.wrap(node.arguments.positional[2], w.NumType.i64);
+            b.i64_store(translator.ffiMemory, offset);
+            return translator.voidMarker;
+          case "_storeFloat":
+            codeGen.wrap(node.arguments.positional[2], w.NumType.f64);
+            b.f32_demote_f64();
+            b.f32_store(translator.ffiMemory, offset);
+            return translator.voidMarker;
+          case "_storeFloatUnaligned":
+            codeGen.wrap(node.arguments.positional[2], w.NumType.f64);
+            b.f32_demote_f64();
+            b.f32_store(translator.ffiMemory, offset, 0);
+            return translator.voidMarker;
+          case "_storeDouble":
+            codeGen.wrap(node.arguments.positional[2], w.NumType.f64);
+            b.f64_store(translator.ffiMemory, offset);
+            return translator.voidMarker;
+          case "_storeDoubleUnaligned":
+            codeGen.wrap(node.arguments.positional[2], w.NumType.f64);
+            b.f64_store(translator.ffiMemory, offset, 0);
+            return translator.voidMarker;
+          case "_storePointer":
+            codeGen.wrap(node.arguments.positional[2], w.NumType.i32);
+            b.i32_store(translator.ffiMemory, offset);
+            return translator.voidMarker;
+        }
+      }
+    }
+
     // Wasm(Int|Float|Object)Array constructors
     if (node.target.enclosingClass?.superclass ==
         translator.wasmArrayBaseClass) {
@@ -683,6 +864,21 @@
     return null;
   }
 
+  w.ValueType? generateConstructorIntrinsic(ConstructorInvocation node) {
+    String name = node.name.text;
+
+    // _Compound.#fromTypedDataBase
+    if (name == "#fromTypedDataBase") {
+      // A compound (subclass of Struct or Union) is represented by its i32
+      // address. The argument to the #fromTypedDataBase constructor is a
+      // Pointer, whose representation is the same.
+      codeGen.wrap(node.arguments.positional.single, w.NumType.i32);
+      return w.NumType.i32;
+    }
+
+    return null;
+  }
+
   bool generateMemberIntrinsic(Reference target, w.DefinedFunction function,
       List<w.Local> paramLocals, w.Label? returnLabel) {
     Member member = target.asMember;
diff --git a/pkg/dart2wasm/lib/target.dart b/pkg/dart2wasm/lib/target.dart
index 76623cc..15e6651 100644
--- a/pkg/dart2wasm/lib/target.dart
+++ b/pkg/dart2wasm/lib/target.dart
@@ -11,6 +11,12 @@
 import 'package:kernel/target/targets.dart';
 import 'package:vm/transformations/mixin_full_resolution.dart'
     as transformMixins show transformLibraries;
+import 'package:vm/transformations/ffi/common.dart' as ffiHelper
+    show calculateTransitiveImportsOfDartFfiIfUsed;
+import 'package:vm/transformations/ffi/definitions.dart'
+    as transformFfiDefinitions show transformLibraries;
+import 'package:vm/transformations/ffi/use_sites.dart' as transformFfiUseSites
+    show transformLibraries;
 
 import 'package:dart2wasm/constants_backend.dart';
 import 'package:dart2wasm/transformers.dart' as wasmTrans;
@@ -35,6 +41,14 @@
   TargetFlags get flags => TargetFlags(enableNullSafety: true);
 
   @override
+  List<String> get extraRequiredLibraries => const <String>[
+        'dart:ffi',
+        'dart:_internal',
+        'dart:typed_data',
+        'dart:nativewrappers',
+      ];
+
+  @override
   List<String> get extraIndexedLibraries => const <String>[
         "dart:collection",
         "dart:typed_data",
@@ -82,6 +96,24 @@
         this, coreTypes, hierarchy, libraries, referenceFromIndex);
     logger?.call("Transformed mixin applications");
 
+    List<Library>? transitiveImportingDartFfi = ffiHelper
+        .calculateTransitiveImportsOfDartFfiIfUsed(component, libraries);
+    if (transitiveImportingDartFfi == null) {
+      logger?.call("Skipped ffi transformation");
+    } else {
+      transformFfiDefinitions.transformLibraries(
+          component,
+          coreTypes,
+          hierarchy,
+          transitiveImportingDartFfi,
+          diagnosticReporter,
+          referenceFromIndex,
+          changedStructureNotifier);
+      transformFfiUseSites.transformLibraries(component, coreTypes, hierarchy,
+          transitiveImportingDartFfi, diagnosticReporter, referenceFromIndex);
+      logger?.call("Transformed ffi annotations");
+    }
+
     wasmTrans.transformLibraries(libraries, coreTypes, hierarchy);
   }
 
diff --git a/pkg/dart2wasm/lib/translator.dart b/pkg/dart2wasm/lib/translator.dart
index e34f5ba..8b71467 100644
--- a/pkg/dart2wasm/lib/translator.dart
+++ b/pkg/dart2wasm/lib/translator.dart
@@ -83,11 +83,13 @@
   late final Class oneByteStringClass;
   late final Class twoByteStringClass;
   late final Class typeClass;
+  late final Class stackTraceClass;
+  late final Class ffiCompoundClass;
+  late final Class ffiPointerClass;
   late final Class typedListBaseClass;
   late final Class typedListClass;
   late final Class typedListViewClass;
   late final Class byteDataViewClass;
-  late final Class stackTraceClass;
   late final Procedure stackTraceCurrent;
   late final Procedure stringEquals;
   late final Procedure stringInterpolate;
@@ -115,7 +117,10 @@
   late final w.Module m;
   late final w.DefinedFunction initFunction;
   late final w.ValueType voidMarker;
+  // Lazily create exception tag if used.
   late final w.Tag exceptionTag = createExceptionTag();
+  // Lazily import FFI memory if used.
+  late final w.Memory ffiMemory = m.importMemory("ffi", "memory", 0);
 
   // Caches for when identical source constructs need a common representation.
   final Map<w.StorageType, w.ArrayType> arrayTypeCache = {};
@@ -138,29 +143,17 @@
     dispatchTable = DispatchTable(this);
     functions = FunctionCollector(this);
 
-    Library coreLibrary =
-        component.libraries.firstWhere((l) => l.name == "dart.core");
-    Class lookupCore(String name) {
-      return coreLibrary.classes.firstWhere((c) => c.name == name);
+    Class Function(String) makeLookup(String libraryName) {
+      Library library =
+          component.libraries.firstWhere((l) => l.name == libraryName);
+      return (name) => library.classes.firstWhere((c) => c.name == name);
     }
 
-    Library collectionLibrary =
-        component.libraries.firstWhere((l) => l.name == "dart.collection");
-    Class lookupCollection(String name) {
-      return collectionLibrary.classes.firstWhere((c) => c.name == name);
-    }
-
-    Library typedDataLibrary =
-        component.libraries.firstWhere((l) => l.name == "dart.typed_data");
-    Class lookupTypedData(String name) {
-      return typedDataLibrary.classes.firstWhere((c) => c.name == name);
-    }
-
-    Library wasmLibrary =
-        component.libraries.firstWhere((l) => l.name == "dart.wasm");
-    Class lookupWasm(String name) {
-      return wasmLibrary.classes.firstWhere((c) => c.name == name);
-    }
+    Class Function(String) lookupCore = makeLookup("dart.core");
+    Class Function(String) lookupCollection = makeLookup("dart.collection");
+    Class Function(String) lookupFfi = makeLookup("dart.ffi");
+    Class Function(String) lookupTypedData = makeLookup("dart.typed_data");
+    Class Function(String) lookupWasm = makeLookup("dart.wasm");
 
     wasmTypesBaseClass = lookupWasm("_WasmBase");
     wasmArrayBaseClass = lookupWasm("_WasmArray");
@@ -182,6 +175,8 @@
     twoByteStringClass = lookupCore("_TwoByteString");
     typeClass = lookupCore("_Type");
     stackTraceClass = lookupCore("StackTrace");
+    ffiCompoundClass = lookupFfi("_Compound");
+    ffiPointerClass = lookupFfi("Pointer");
     typedListBaseClass = lookupTypedData("_TypedListBase");
     typedListClass = lookupTypedData("_TypedList");
     typedListViewClass = lookupTypedData("_TypedListView");
@@ -217,6 +212,7 @@
       lookupWasm("WasmI64"): w.NumType.i64,
       lookupWasm("WasmF32"): w.NumType.f32,
       lookupWasm("WasmF64"): w.NumType.f64,
+      ffiPointerClass: w.NumType.i32,
     };
     boxedClasses = {
       w.NumType.i32: boxedBoolClass,
@@ -371,28 +367,39 @@
     throw "Packed types are only allowed in arrays and fields";
   }
 
-  bool isWasmType(Class cls) {
+  bool _hasSuperclass(Class cls, Class superclass) {
     while (cls.superclass != null) {
       cls = cls.superclass!;
-      if (cls == wasmTypesBaseClass) return true;
+      if (cls == superclass) return true;
     }
     return false;
   }
 
-  w.StorageType typeForInfo(ClassInfo info, bool nullable) {
+  bool isWasmType(Class cls) => _hasSuperclass(cls, wasmTypesBaseClass);
+
+  bool isFfiCompound(Class cls) => _hasSuperclass(cls, ffiCompoundClass);
+
+  w.StorageType typeForInfo(ClassInfo info, bool nullable,
+      {bool ensureBoxed = false}) {
     Class? cls = info.cls;
     if (cls != null) {
       w.StorageType? builtin = builtinTypes[cls];
       if (builtin != null) {
-        if (!nullable) return builtin;
+        if (!nullable && (!ensureBoxed || cls == ffiPointerClass)) {
+          return builtin;
+        }
         if (isWasmType(cls)) {
           if (builtin.isPrimitive) throw "Wasm numeric types can't be nullable";
           return (builtin as w.RefType).withNullability(true);
         }
+        if (cls == ffiPointerClass) throw "FFI types can't be nullable";
         Class? boxedClass = boxedClasses[builtin];
         if (boxedClass != null) {
           info = classInfo[boxedClass]!;
         }
+      } else if (isFfiCompound(cls)) {
+        if (nullable) throw "FFI types can't be nullable";
+        return w.NumType.i32;
       }
     }
     return w.RefType.def(info.repr.struct,
@@ -529,13 +536,6 @@
     });
   }
 
-  w.ValueType ensureBoxed(w.ValueType type) {
-    // Box receiver if it's primitive
-    if (type is w.RefType) return type;
-    return w.RefType.def(classInfo[boxedClasses[type]!]!.struct,
-        nullable: false);
-  }
-
   w.ValueType typeForLocal(w.ValueType type) {
     return options.localNullability ? type : type.withNullability(true);
   }
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 953dfa4..e6a113c 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -19,6 +19,7 @@
   extensionMethods,
   extensionTypes,
   genericMetadata,
+  inferenceUpdate1,
   macros,
   namedArgumentsAnywhere,
   nonNullable,
@@ -42,6 +43,7 @@
 const Version enableExtensionMethodsVersion = const Version(2, 6);
 const Version enableExtensionTypesVersion = const Version(2, 17);
 const Version enableGenericMetadataVersion = const Version(2, 14);
+const Version enableInferenceUpdate1Version = const Version(2, 17);
 const Version enableMacrosVersion = const Version(2, 17);
 const Version enableNamedArgumentsAnywhereVersion = const Version(2, 17);
 const Version enableNonNullableVersion = const Version(2, 12);
@@ -74,6 +76,8 @@
       return ExperimentalFlag.extensionTypes;
     case "generic-metadata":
       return ExperimentalFlag.genericMetadata;
+    case "inference-update-1":
+      return ExperimentalFlag.inferenceUpdate1;
     case "macros":
       return ExperimentalFlag.macros;
     case "named-arguments-anywhere":
@@ -110,6 +114,7 @@
   ExperimentalFlag.extensionMethods: true,
   ExperimentalFlag.extensionTypes: false,
   ExperimentalFlag.genericMetadata: true,
+  ExperimentalFlag.inferenceUpdate1: false,
   ExperimentalFlag.macros: false,
   ExperimentalFlag.namedArgumentsAnywhere: true,
   ExperimentalFlag.nonNullable: true,
@@ -133,6 +138,7 @@
   ExperimentalFlag.extensionMethods: true,
   ExperimentalFlag.extensionTypes: false,
   ExperimentalFlag.genericMetadata: true,
+  ExperimentalFlag.inferenceUpdate1: false,
   ExperimentalFlag.macros: false,
   ExperimentalFlag.namedArgumentsAnywhere: false,
   ExperimentalFlag.nonNullable: true,
@@ -156,6 +162,7 @@
   ExperimentalFlag.extensionMethods: const Version(2, 6),
   ExperimentalFlag.extensionTypes: const Version(2, 17),
   ExperimentalFlag.genericMetadata: const Version(2, 14),
+  ExperimentalFlag.inferenceUpdate1: const Version(2, 17),
   ExperimentalFlag.macros: const Version(2, 17),
   ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 17),
   ExperimentalFlag.nonNullable: const Version(2, 12),
@@ -179,6 +186,7 @@
   ExperimentalFlag.extensionMethods: const Version(2, 6),
   ExperimentalFlag.extensionTypes: const Version(2, 17),
   ExperimentalFlag.genericMetadata: const Version(2, 14),
+  ExperimentalFlag.inferenceUpdate1: const Version(2, 17),
   ExperimentalFlag.macros: const Version(2, 17),
   ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 17),
   ExperimentalFlag.nonNullable: const Version(2, 10),
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index d4ea6ce..5fc0557 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -1780,10 +1780,13 @@
 
       Class? cls;
       if (className != null) {
-        ClassBuilder? classBuilder = libraryBuilder.scope
-            .lookupLocalMember(className, setter: false) as ClassBuilder?;
-        cls = classBuilder?.cls;
-        if (cls == null) return null;
+        Builder? scopeMember =
+            libraryBuilder.scope.lookupLocalMember(className, setter: false);
+        if (scopeMember is ClassBuilder) {
+          cls = scopeMember.cls;
+        } else {
+          return null;
+        }
       }
       Extension? extension;
       String? extensionName;
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index 3a85b46..4cfbf57 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -96,6 +96,20 @@
 
 const String kDebugClassName = "#DebugClass";
 
+class _CollectLibraryDependencies extends RecursiveVisitor {
+  Set<LibraryDependency> foundLibraryDependencies = {};
+
+  @override
+  void visitLoadLibrary(LoadLibrary node) {
+    foundLibraryDependencies.add(node.import);
+  }
+
+  @override
+  void visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+    foundLibraryDependencies.add(node.import);
+  }
+}
+
 Component createExpressionEvaluationComponent(Procedure procedure) {
   Library realLibrary = procedure.enclosingLibrary;
 
@@ -106,6 +120,17 @@
     ..nonNullableByDefaultCompiledMode =
         realLibrary.nonNullableByDefaultCompiledMode;
 
+  // Add deferred library dependencies. They are needed for serializing
+  // references to deferred libraries. We can just claim ownership of the ones
+  // we find as they were created when doing the expression compilation.
+  _CollectLibraryDependencies collectLibraryDependencies =
+      new _CollectLibraryDependencies();
+  procedure.accept(collectLibraryDependencies);
+  for (LibraryDependency libraryDependency
+      in collectLibraryDependencies.foundLibraryDependencies) {
+    fakeLibrary.addDependency(libraryDependency);
+  }
+
   TreeNode? realClass = procedure.parent;
   if (realClass is Class) {
     Class fakeClass = new Class(name: kDebugClassName, fileUri: uri)
diff --git a/pkg/front_end/testcases/expression/issue_48587.expression.yaml b/pkg/front_end/testcases/expression/issue_48587.expression.yaml
new file mode 100644
index 0000000..b527faf
--- /dev/null
+++ b/pkg/front_end/testcases/expression/issue_48587.expression.yaml
@@ -0,0 +1,27 @@
+# Copyright (c) 2018, 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.
+
+# Check the expression compilation (including serialization) of usage of a
+# deferred import works.
+
+sources:
+  main.dart: |
+    import 'import.dart' deferred as d;
+
+    void main() {
+      print('hello');
+    }
+
+    Future<void> printDeferred() async {
+      d.deferredPrintLocal();
+    }
+
+  import.dart: |
+    void deferredPrintLocal() {
+      print('hello from deferred library');
+    }
+definitions: []
+position: "main.dart"
+expression: |
+  d.deferredPrintLocal()
diff --git a/pkg/front_end/testcases/expression/issue_48587.expression.yaml.expect b/pkg/front_end/testcases/expression/issue_48587.expression.yaml.expect
new file mode 100644
index 0000000..f33f124
--- /dev/null
+++ b/pkg/front_end/testcases/expression/issue_48587.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return let final dynamic #t1 = CheckLibraryIsLoaded(d) in #lib1::deferredPrintLocal();
diff --git a/pkg/front_end/testcases/expression/wrong_position.expression.yaml b/pkg/front_end/testcases/expression/wrong_position.expression.yaml
new file mode 100644
index 0000000..1656813
--- /dev/null
+++ b/pkg/front_end/testcases/expression/wrong_position.expression.yaml
@@ -0,0 +1,13 @@
+# Copyright (c) 2018, 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.
+
+sources:
+  main.dart: |
+    void main() {
+      print('hello');
+    }
+definitions: []
+position: "main.dart#main"
+expression: |
+  main()
diff --git a/pkg/front_end/testcases/expression/wrong_position.expression.yaml.expect b/pkg/front_end/testcases/expression/wrong_position.expression.yaml.expect
new file mode 100644
index 0000000..ba1f145
--- /dev/null
+++ b/pkg/front_end/testcases/expression/wrong_position.expression.yaml.expect
@@ -0,0 +1,3 @@
+Errors: {
+}
+<no procedure>
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect
index e5c093e..143b766 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect
@@ -25,5 +25,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
index de205ad..0ce631d 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
@@ -52,5 +52,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect
index ec86fcc..69afb57 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect
@@ -25,5 +25,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.modular.expect
index ec86fcc..69afb57 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.modular.expect
@@ -25,5 +25,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
index 77e3dbf..6f63e04 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
@@ -52,5 +52,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect
index f82c29d..67f064e2 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect
@@ -33,5 +33,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
index d5ddd95..c8f0636 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
@@ -84,5 +84,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect
index d33f1a0..2a5a6bf 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect
@@ -33,5 +33,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.modular.expect
index d33f1a0..2a5a6bf 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.modular.expect
@@ -33,5 +33,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
index 6a4db26..82be0e6 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
@@ -84,5 +84,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:140:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:141:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/wasm_builder/lib/src/module.dart b/pkg/wasm_builder/lib/src/module.dart
index e015acf..2e03919 100644
--- a/pkg/wasm_builder/lib/src/module.dart
+++ b/pkg/wasm_builder/lib/src/module.dart
@@ -27,6 +27,7 @@
   BaseFunction? startFunction = null;
 
   bool anyFunctionsDefined = false;
+  bool anyMemoriesDefined = false;
   bool anyGlobalsDefined = false;
   bool dataReferencedFromGlobalInitializer = false;
 
@@ -45,13 +46,23 @@
   }
 
   /// All module imports (functions and globals).
-  Iterable<Import> get imports =>
-      functions.whereType<Import>().followedBy(globals.whereType<Import>());
+  Iterable<Import> get imports => functions
+      .whereType<Import>()
+      .followedBy(memories.whereType<Import>())
+      .followedBy(globals.whereType<Import>());
 
   /// All functions defined in the module.
   Iterable<DefinedFunction> get definedFunctions =>
       functions.whereType<DefinedFunction>();
 
+  /// All memories defined in the module.
+  Iterable<DefinedMemory> get definedMemories =>
+      memories.whereType<DefinedMemory>();
+
+  /// All globals defined in the module.
+  Iterable<DefinedGlobal> get definedGlobals =>
+      globals.whereType<DefinedGlobal>();
+
   /// Add a new function type to the module.
   ///
   /// All function types are canonicalized, such that identical types become
@@ -119,8 +130,9 @@
   }
 
   /// Add a new memory to the module.
-  Memory addMemory(int minSize, [int? maxSize]) {
-    final memory = Memory(memories.length, minSize, maxSize);
+  DefinedMemory addMemory(int minSize, [int? maxSize]) {
+    anyMemoriesDefined = true;
+    final memory = DefinedMemory(memories.length, minSize, maxSize);
     memories.add(memory);
     return memory;
   }
@@ -179,6 +191,21 @@
     return function;
   }
 
+  /// Import a memory into the module.
+  ///
+  /// All imported memories must be specified before any memories are declared
+  /// using [Module.addMemory].
+  ImportedMemory importMemory(String module, String name, int minSize,
+      [int? maxSize]) {
+    if (anyMemoriesDefined) {
+      throw "All memory imports must be specified before any definitions.";
+    }
+    final memory =
+        ImportedMemory(module, name, memories.length, minSize, maxSize);
+    memories.add(memory);
+    return memory;
+  }
+
   /// Import a global variable into the module.
   ///
   /// All imported globals must be specified before any globals are declared
@@ -381,15 +408,14 @@
 }
 
 /// A memory in a module.
-class Memory implements Serializable {
+class Memory {
   final int index;
   final int minSize;
   final int? maxSize;
 
   Memory(this.index, this.minSize, [this.maxSize]);
 
-  @override
-  void serialize(Serializer s) {
+  void _serializeLimits(Serializer s) {
     if (maxSize == null) {
       s.writeByte(0x00);
       s.writeUnsigned(minSize);
@@ -401,6 +427,14 @@
   }
 }
 
+class DefinedMemory extends Memory implements Serializable {
+  DefinedMemory(int index, int minSize, int? maxSize)
+      : super(index, minSize, maxSize);
+
+  @override
+  void serialize(Serializer s) => _serializeLimits(s);
+}
+
 /// A tag in a module.
 class Tag implements Serializable {
   final int index;
@@ -517,6 +551,23 @@
   String toString() => "$module.$name";
 }
 
+/// An imported memory.
+class ImportedMemory extends Memory implements Import {
+  final String module;
+  final String name;
+
+  ImportedMemory(this.module, this.name, int index, int minSize, int? maxSize)
+      : super(index, minSize, maxSize);
+
+  @override
+  void serialize(Serializer s) {
+    s.writeName(module);
+    s.writeName(name);
+    s.writeByte(0x02);
+    _serializeLimits(s);
+  }
+}
+
 /// An imported global variable.
 class ImportedGlobal extends Global implements Import {
   final String module;
@@ -660,11 +711,11 @@
   int get id => 5;
 
   @override
-  bool get isNotEmpty => module.memories.isNotEmpty;
+  bool get isNotEmpty => module.definedMemories.isNotEmpty;
 
   @override
   void serializeContents() {
-    writeList(module.memories);
+    writeList(module.definedMemories.toList());
   }
 }
 
@@ -690,11 +741,11 @@
   int get id => 6;
 
   @override
-  bool get isNotEmpty => module.globals.whereType<DefinedGlobal>().isNotEmpty;
+  bool get isNotEmpty => module.definedGlobals.isNotEmpty;
 
   @override
   void serializeContents() {
-    writeList(module.globals.whereType<DefinedGlobal>().toList());
+    writeList(module.definedGlobals.toList());
   }
 }
 
diff --git a/runtime/docs/gc.md b/runtime/docs/gc.md
index ac9696d..7c2fd9a 100644
--- a/runtime/docs/gc.md
+++ b/runtime/docs/gc.md
@@ -13,7 +13,7 @@
 Heap objects are always allocated in double-word increments. Objects in old-space are kept at double-word alignment (address % double-word == 0), and objects in new-space are kept offset from double-word alignment (address % double-word == word). This allows checking an object's age without comparing to a boundary address, avoiding restrictions on heap placement and avoiding loading the boundary from thread-local storage. Additionally, the scavenger can quickly skip over both immediates and old objects with a single branch.
 
 | Pointer    | Referent                                |
-| ---------- | --------------------------------------- |
+| ---        | ---                                     |
 | 0x00000002 | Small integer 1                         |
 | 0xFFFFFFFE | Small integer -1                        |
 | 0x00A00001 | Heap object at 0x00A00000, in old-space |
@@ -75,7 +75,7 @@
 
 ## Concurrent Marking
 
-To reduce the time the mutator is paused for old-space GCs, we allow the mutator to continue running during most of the marking work.
+To reduce the time the mutator is paused for old-space GCs, we allow the mutator to continue running during most of the marking work. 
 
 ### Barrier
 
@@ -204,35 +204,3 @@
 <instructions that cannot directly call Dart functions>
 StoreInstanceField(container, value, NoBarrier)
 ```
-
-## Finalizers
-
-The GC is aware of two types of objects for the purposes of running finalizers.
-
-1) `FinalizerEntry`
-2) `Finalizer` (`FinalizerBase`, `_FinalizerImpl`)
-
-A `FinalizerEntry` contains the `value`, the optional `detach` key, and the `token`, and a reference to the `finalizer`.
-An entry only holds on weakly to the value, detach key, and finalizer. (Similar to how `WeakReference` only holds on weakly to target).
-
-A `Finalizer` contains all entries, a list of entries of which the value is collected, and a reference to the isolate.
-
-When the value of an entry is GCed, the entry is added over to the collected list.
-If any entry is moved to the collected list, a message is sent that invokes the finalizer to call the callback on all entries in that list.
-
-When a finalizer is detached by the user, the entry token is set to the entry itself and is removed from the all entries set.
-This ensures that if the entry was already moved to the collected list, the finalizer is not executed.
-
-To speed up detaching, we use a weak map from detach keys to list of entries. This ensures entries can be GCed.
-
-Both the scavenger and marker can process finalizer entries in parallel.
-Parallel tasks use an atomic exchange on the head of the collected entries list, ensuring no entries get lost.
-Mutator threads are guaranteed to be stopped when processing entries.
-This ensures that we do not need barriers for moving entries into the finalizers collected list.
-Dart reads and replaces the collected entries list also with an atomic exchange, ensuring the GC doesn't run in between a load/store.
-
-When a finalizer gets posted a message to process finalized objects, it is being kept alive by the message.
-An alternative design would be to pre-allocate a `WeakReference` in the finalizer pointing to the finalizer, and send that itself.
-This would be at the cost of an extra object.
-
-If the finalizer object itself is GCed, the callback is not run for any of the attachments.
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index e2ef579..3d2a0f0 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -242,8 +242,6 @@
     break;
 
           MESSAGE_SNAPSHOT_ILLEGAL(DynamicLibrary);
-          // TODO(http://dartbug.com/47777): Send and exit support: remove this.
-          MESSAGE_SNAPSHOT_ILLEGAL(Finalizer);
           MESSAGE_SNAPSHOT_ILLEGAL(MirrorReference);
           MESSAGE_SNAPSHOT_ILLEGAL(Pointer);
           MESSAGE_SNAPSHOT_ILLEGAL(ReceivePort);
@@ -286,7 +284,6 @@
   return obj.ptr();
 }
 
-// TODO(http://dartbug.com/47777): Add support for Finalizers.
 DEFINE_NATIVE_ENTRY(Isolate_exit_, 0, 2) {
   GET_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   if (!port.IsNull()) {
@@ -641,10 +638,9 @@
     // Make a copy of the state's isolate flags and hand it to the callback.
     Dart_IsolateFlags api_flags = *(state_->isolate_flags());
     api_flags.is_system_isolate = false;
-    Dart_Isolate isolate =
-        (create_group_callback)(state_->script_url(), name, nullptr,
-                                state_->package_config(), &api_flags,
-                                parent_isolate_->init_callback_data(), &error);
+    Dart_Isolate isolate = (create_group_callback)(
+        state_->script_url(), name, nullptr, state_->package_config(),
+        &api_flags, parent_isolate_->init_callback_data(), &error);
     parent_isolate_->DecrementSpawnCount();
     parent_isolate_ = nullptr;
 
diff --git a/runtime/tests/vm/dart/finalizer/finalizer_isolate_groups_run_gc_helper.dart b/runtime/tests/vm/dart/finalizer/finalizer_isolate_groups_run_gc_helper.dart
deleted file mode 100644
index c0dfdeb..0000000
--- a/runtime/tests/vm/dart/finalizer/finalizer_isolate_groups_run_gc_helper.dart
+++ /dev/null
@@ -1,36 +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.
-
-import 'dart:isolate';
-
-import 'helpers.dart';
-
-int callbackCount = 0;
-
-void callback(Nonce token) {
-  callbackCount++;
-  print('$name: Running finalizer: token: $token');
-}
-
-final finalizer = Finalizer<Nonce>(callback);
-
-late String name;
-
-void main(List<String> arguments, SendPort port) async {
-  name = arguments[0];
-
-  final token = Nonce(42);
-  makeObjectWithFinalizer(finalizer, token);
-
-  final awaitBeforeShuttingDown = ReceivePort();
-  port.send(awaitBeforeShuttingDown.sendPort);
-  final message = await awaitBeforeShuttingDown.first;
-  print('$name: $message');
-
-  await Future.delayed(Duration(milliseconds: 1));
-  print('$name: Awaited to see if there were any callbacks.');
-
-  print('$name: Helper isolate exiting. num callbacks: $callbackCount.');
-  port.send(callbackCount);
-}
diff --git a/runtime/tests/vm/dart/finalizer/finalizer_isolate_groups_run_gc_test.dart b/runtime/tests/vm/dart/finalizer/finalizer_isolate_groups_run_gc_test.dart
deleted file mode 100644
index ba5216f..0000000
--- a/runtime/tests/vm/dart/finalizer/finalizer_isolate_groups_run_gc_test.dart
+++ /dev/null
@@ -1,93 +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.
-
-// VMOptions=
-// VMOptions=--use_compactor
-// VMOptions=--use_compactor --force_evacuation
-
-import 'dart:async';
-import 'dart:isolate';
-
-import 'package:async/async.dart';
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() async {
-  await testFinalizerInOtherIsolateGroupGCBeforeExit();
-  await testFinalizerInOtherIsolateGroupGCAfterExit();
-  await testFinalizerInOtherIsolateGroupNoGC();
-
-  print('$name: End of test, shutting down.');
-}
-
-const name = 'main';
-
-late bool hotReloadBot;
-
-Future<void> testFinalizerInOtherIsolateGroupGCBeforeExit() async {
-  final receivePort = ReceivePort();
-  final messagesQueue = StreamQueue(receivePort);
-
-  await Isolate.spawnUri(
-    Uri.parse('finalizer_isolate_groups_run_gc_helper.dart'),
-    ['helper 1'],
-    receivePort.sendPort,
-  );
-  final signalHelperIsolate = await messagesQueue.next as SendPort;
-
-  doGC(name: name);
-  await yieldToMessageLoop(name: name);
-
-  signalHelperIsolate.send('Done GCing.');
-
-  final helperCallbacks = await messagesQueue.next as int;
-  messagesQueue.cancel();
-  print('$name: Helper exited.');
-  // Different isolate group, so we don't expect a GC in this isolate to cause
-  // collected objects in the helper.
-  // Except for in --hot-reload-test-mode, then the GC is triggered.
-  hotReloadBot = helperCallbacks == 1;
-}
-
-Future<void> testFinalizerInOtherIsolateGroupGCAfterExit() async {
-  final receivePort = ReceivePort();
-  final messagesQueue = StreamQueue(receivePort);
-  await Isolate.spawnUri(
-    Uri.parse('finalizer_isolate_groups_run_gc_helper.dart'),
-    ['helper 2'],
-    receivePort.sendPort,
-  );
-
-  final signalHelperIsolate = await messagesQueue.next as SendPort;
-
-  signalHelperIsolate.send('Before GCing.');
-
-  final helperCallbacks = await messagesQueue.next as int;
-  messagesQueue.cancel();
-  print('$name: Helper exited.');
-  Expect.equals(hotReloadBot ? 1 : 0, helperCallbacks);
-
-  doGC(name: name);
-  await yieldToMessageLoop(name: name);
-}
-
-Future<void> testFinalizerInOtherIsolateGroupNoGC() async {
-  final receivePort = ReceivePort();
-  final messagesQueue = StreamQueue(receivePort);
-
-  await Isolate.spawnUri(
-    Uri.parse('finalizer_isolate_groups_run_gc_helper.dart'),
-    ['helper 3'],
-    receivePort.sendPort,
-  );
-  final signalHelperIsolate = await messagesQueue.next as SendPort;
-
-  signalHelperIsolate.send('Before quitting main isolate.');
-
-  final helperCallbacks = await messagesQueue.next as int;
-  messagesQueue.cancel();
-  print('$name: Helper exited.');
-  Expect.equals(hotReloadBot ? 1 : 0, helperCallbacks);
-}
diff --git a/runtime/tests/vm/dart/finalizer/finalizer_isolates_run_gc_test.dart b/runtime/tests/vm/dart/finalizer/finalizer_isolates_run_gc_test.dart
deleted file mode 100644
index 5750bf4..0000000
--- a/runtime/tests/vm/dart/finalizer/finalizer_isolates_run_gc_test.dart
+++ /dev/null
@@ -1,103 +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.
-
-// VMOptions=
-// VMOptions=--use_compactor
-// VMOptions=--use_compactor --force_evacuation
-
-import 'dart:async';
-import 'dart:isolate';
-
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() async {
-  await testNormalExit();
-  await testSendAndExit();
-  await testSendAndExitFinalizer();
-  print('End of test, shutting down.');
-}
-
-final finalizerTokens = <Nonce>{};
-
-void callback(Nonce token) {
-  print('Running finalizer: token: $token');
-  finalizerTokens.add(token);
-}
-
-void runIsolateAttachFinalizer(Object? message) {
-  final finalizer = Finalizer<Nonce>(callback);
-  final value = Nonce(1001);
-  final token = Nonce(1002);
-  finalizer.attach(value, token);
-  final token9 = Nonce(9002);
-  makeObjectWithFinalizer(finalizer, token9);
-  if (message == null) {
-    print('Isolate done.');
-    return;
-  }
-  final list = message as List;
-  assert(list.length == 2);
-  final sendPort = list[0] as SendPort;
-  final tryToSendFinalizer = list[1] as bool;
-  if (tryToSendFinalizer) {
-    Expect.throws(() {
-      // TODO(http://dartbug.com/47777): Send and exit support.
-      print('Trying to send and exit finalizer.');
-      Isolate.exit(sendPort, [value, finalizer]);
-    });
-  }
-  print('Isolate sending and exit.');
-  Isolate.exit(sendPort, [value]);
-}
-
-Future testNormalExit() async {
-  final portExitMessage = ReceivePort();
-  await Isolate.spawn(
-    runIsolateAttachFinalizer,
-    null,
-    onExit: portExitMessage.sendPort,
-  );
-  await portExitMessage.first;
-
-  doGC();
-  await yieldToMessageLoop();
-
-  Expect.equals(0, finalizerTokens.length);
-}
-
-@pragma('vm:never-inline')
-Future<Finalizer?> testSendAndExitHelper(
-    {bool trySendFinalizer = false}) async {
-  final port = ReceivePort();
-  await Isolate.spawn(
-    runIsolateAttachFinalizer,
-    [port.sendPort, trySendFinalizer],
-  );
-  final message = await port.first as List;
-  print('Received message ($message).');
-  final value = message[0] as Nonce;
-  print('Received value ($value), but now forgetting about it.');
-
-  Expect.equals(1, message.length);
-  // TODO(http://dartbug.com/47777): Send and exit support.
-  return null;
-}
-
-Future testSendAndExit() async {
-  await testSendAndExitHelper(trySendFinalizer: false);
-
-  doGC();
-  await yieldToMessageLoop();
-
-  Expect.equals(0, finalizerTokens.length);
-}
-
-Future testSendAndExitFinalizer() async {
-  final finalizer = await testSendAndExitHelper(trySendFinalizer: true);
-
-  // TODO(http://dartbug.com/47777): Send and exit support.
-  Expect.isNull(finalizer);
-}
diff --git a/runtime/tests/vm/dart/finalizer/finalizer_nullable_run_gc_test.dart b/runtime/tests/vm/dart/finalizer/finalizer_nullable_run_gc_test.dart
deleted file mode 100644
index 8000a41..0000000
--- a/runtime/tests/vm/dart/finalizer/finalizer_nullable_run_gc_test.dart
+++ /dev/null
@@ -1,43 +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.
-
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() {
-  testFinalizer();
-}
-
-void testFinalizer() async {
-  final finalizerTokens = <Nonce?>{};
-  void callback(Nonce? token) {
-    print('Running finalizer: token: $token');
-    finalizerTokens.add(token);
-  }
-
-  final finalizer = Finalizer<Nonce?>(callback);
-
-  {
-    final detach = Nonce(2022);
-    final token = null;
-
-    makeObjectWithFinalizer(finalizer, token, detach: detach);
-
-    doGC();
-
-    // We haven't stopped running synchronous dart code yet.
-    Expect.isFalse(finalizerTokens.contains(token));
-
-    await Future.delayed(Duration(milliseconds: 1));
-
-    // Now we have.
-    Expect.isTrue(finalizerTokens.contains(token));
-
-    // Try detaching after finalizer ran.
-    finalizer.detach(detach);
-  }
-
-  print('End of test, shutting down.');
-}
diff --git a/runtime/tests/vm/dart/finalizer/finalizer_run_gc_test.dart b/runtime/tests/vm/dart/finalizer/finalizer_run_gc_test.dart
deleted file mode 100644
index a278b5d..0000000
--- a/runtime/tests/vm/dart/finalizer/finalizer_run_gc_test.dart
+++ /dev/null
@@ -1,90 +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.
-
-// VMOptions=
-// VMOptions=--use_compactor
-// VMOptions=--use_compactor --force_evacuation
-
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() {
-  testWrongArguments();
-  testFinalizer();
-}
-
-void testWrongArguments() {
-  void callback(Object token) {
-    throw 'This should never happen!';
-  }
-
-  final finalizer = Finalizer<Nonce>(callback);
-  final myFinalizable = Nonce(1000);
-  final token = Nonce(2000);
-  final detach = Nonce(3000);
-
-  Expect.throws(() {
-    finalizer.attach(myFinalizable, token, detach: 123);
-  });
-  Expect.throws(() {
-    finalizer.attach(123, token, detach: detach);
-  });
-}
-
-void testFinalizer() async {
-  final finalizerTokens = <Object>{};
-  void callback(Object token) {
-    print('Running finalizer: token: $token');
-    finalizerTokens.add(token);
-  }
-
-  final finalizer = Finalizer<Nonce>(callback);
-
-  {
-    final detach = Nonce(2022);
-    final token = Nonce(42);
-
-    makeObjectWithFinalizer(finalizer, token, detach: detach);
-
-    doGC();
-
-    // We haven't stopped running synchronous dart code yet.
-    Expect.isFalse(finalizerTokens.contains(token));
-
-    await Future.delayed(Duration(milliseconds: 1));
-
-    // Now we have.
-    Expect.isTrue(finalizerTokens.contains(token));
-
-    // Try detaching after finalizer ran.
-    finalizer.detach(detach);
-  }
-
-  {
-    final token = Nonce(1337);
-    final token2 = Nonce(1338);
-    final detachkey = Nonce(1984);
-    {
-      final value = Nonce(2);
-      final value2 = Nonce(2000000);
-      finalizer.attach(value, token, detach: detachkey);
-      finalizer.attach(value2, token2, detach: detachkey);
-      // Should detach 2 finalizers.
-      finalizer.detach(detachkey);
-      // Try detaching again, should do nothing.
-      finalizer.detach(detachkey);
-    }
-    doGC();
-    await yieldToMessageLoop();
-    Expect.isFalse(finalizerTokens.contains(token));
-    Expect.isFalse(finalizerTokens.contains(token2));
-  }
-
-  // Not running finalizer on shutdown.
-  final value = Nonce(3);
-  final token = Nonce(1337);
-  finalizer.attach(value, token);
-  print('End of test, shutting down.');
-}
diff --git a/runtime/tests/vm/dart/finalizer/finalizer_zone_run_gc_test.dart b/runtime/tests/vm/dart/finalizer/finalizer_zone_run_gc_test.dart
deleted file mode 100644
index bcc6d9e1..0000000
--- a/runtime/tests/vm/dart/finalizer/finalizer_zone_run_gc_test.dart
+++ /dev/null
@@ -1,73 +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.
-
-// VMOptions=
-// VMOptions=--use_compactor
-// VMOptions=--use_compactor --force_evacuation
-
-import 'dart:async';
-
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() async {
-  await testFinalizerZone();
-  await testFinalizerException();
-}
-
-Future<void> testFinalizerZone() async {
-  Zone? expectedZone;
-  Zone? actualZone;
-
-  final finalizer = runZoned(() {
-    expectedZone = Zone.current;
-
-    void callback(Object token) {
-      actualZone = Zone.current;
-    }
-
-    return Finalizer<Nonce>(callback);
-  });
-
-  final detach = Nonce(2022);
-  final token = Nonce(42);
-
-  makeObjectWithFinalizer(finalizer, token, detach: detach);
-
-  doGC();
-
-  // We haven't stopped running synchronous dart code yet.
-  Expect.isNull(actualZone);
-
-  await yieldToMessageLoop();
-
-  // Now we have.
-  Expect.equals(expectedZone, actualZone);
-}
-
-Future<void> testFinalizerException() async {
-  Object? caughtError;
-
-  final finalizer = runZonedGuarded(() {
-    void callback(Object token) {
-      throw 'uncaught!';
-    }
-
-    return Finalizer<Nonce>(callback);
-  }, (Object error, StackTrace stack) {
-    caughtError = error;
-  })!;
-
-  final detach = Nonce(2022);
-  final token = Nonce(42);
-
-  makeObjectWithFinalizer(finalizer, token, detach: detach);
-
-  doGC();
-
-  Expect.isNull(caughtError);
-  await yieldToMessageLoop();
-  Expect.isNotNull(caughtError);
-}
diff --git a/runtime/tests/vm/dart/finalizer/helpers.dart b/runtime/tests/vm/dart/finalizer/helpers.dart
deleted file mode 100644
index d776098..0000000
--- a/runtime/tests/vm/dart/finalizer/helpers.dart
+++ /dev/null
@@ -1,55 +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.
-
-// ignore: import_internal_library, unused_import
-import 'dart:_internal';
-import 'dart:async';
-
-/// A user-defined class of which objects can be identified with a field value.
-class Nonce {
-  final int value;
-
-  Nonce(this.value);
-
-  String toString() => 'Nonce($value)';
-}
-
-/// Never inline to ensure `object` becomes unreachable.
-@pragma('vm:never-inline')
-void makeObjectWithFinalizer<T>(Finalizer<T> finalizer, T token,
-    {Object? detach}) {
-  final value = Nonce(1);
-  finalizer.attach(value, token, detach: detach);
-}
-
-/// Triggers garbage collection.
-// Defined in `dart:_internal`.
-// ignore: undefined_identifier
-void triggerGc() => VMInternalsForTesting.collectAllGarbage();
-
-void Function(String) _namedPrint(String? name) {
-  if (name != null) {
-    return (String value) => print('$name: $value');
-  }
-  return (String value) => print(value);
-}
-
-/// Does a GC and if [doAwait] awaits a future to enable running finalizers.
-///
-/// Also prints for debug purposes.
-///
-/// If provided, [name] prefixes the debug prints.
-void doGC({String? name}) {
-  final _print = _namedPrint(name);
-
-  _print('Do GC.');
-  triggerGc();
-  _print('GC done');
-}
-
-Future<void> yieldToMessageLoop({String? name}) async {
-  await Future.delayed(Duration(milliseconds: 1));
-  _namedPrint(name)('Await done.');
-  return null;
-}
diff --git a/runtime/tests/vm/dart/finalizer/weak_reference_run_gc_test.dart b/runtime/tests/vm/dart/finalizer/weak_reference_run_gc_test.dart
index da365b9..15b330d 100644
--- a/runtime/tests/vm/dart/finalizer/weak_reference_run_gc_test.dart
+++ b/runtime/tests/vm/dart/finalizer/weak_reference_run_gc_test.dart
@@ -2,9 +2,10 @@
 // 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.
 
-import 'package:expect/expect.dart';
+// ignore: import_internal_library, unused_import
+import 'dart:_internal';
 
-import 'helpers.dart';
+import 'package:expect/expect.dart';
 
 void main() {
   testWeakReferenceNonExpandoKey();
@@ -12,6 +13,14 @@
   testWeakReference();
 }
 
+class Nonce {
+  final int value;
+
+  Nonce(this.value);
+
+  String toString() => 'Nonce($value)';
+}
+
 void testWeakReferenceNonExpandoKey() {
   Expect.throwsArgumentError(() {
     WeakReference<String>("Hello world!");
@@ -46,3 +55,7 @@
 
   print('End of test, shutting down.');
 }
+
+// Defined in `dart:_internal`.
+// ignore: undefined_identifier
+void triggerGc() => VMInternalsForTesting.collectAllGarbage();
diff --git a/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart b/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
index d714c56..cd24fbc 100644
--- a/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
+++ b/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
@@ -245,7 +245,6 @@
 
     await testWeakProperty();
     await testWeakReference();
-    await testFinalizer();
 
     await testForbiddenClosures();
   }
@@ -757,14 +756,6 @@
     }
   }
 
-  Future testFinalizer() async {
-    print('testFinalizer');
-
-    void callback(Object token) {}
-    final finalizer = Finalizer<Object>(callback);
-    Expect.throwsArgumentError(() => sendPort.send(finalizer));
-  }
-
   Future testForbiddenClosures() async {
     print('testForbiddenClosures');
     for (final closure in nonCopyableClosures) {
diff --git a/runtime/tests/vm/dart_2/finalizer/finalizer_isolate_groups_run_gc_helper.dart b/runtime/tests/vm/dart_2/finalizer/finalizer_isolate_groups_run_gc_helper.dart
deleted file mode 100644
index 58ff5bb..0000000
--- a/runtime/tests/vm/dart_2/finalizer/finalizer_isolate_groups_run_gc_helper.dart
+++ /dev/null
@@ -1,38 +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.
-
-// @dart = 2.9
-
-import 'dart:isolate';
-
-import 'helpers.dart';
-
-int callbackCount = 0;
-
-void callback(Nonce token) {
-  callbackCount++;
-  print('$name: Running finalizer: token: $token');
-}
-
-final finalizer = Finalizer<Nonce>(callback);
-
-String name;
-
-void main(List<String> arguments, SendPort port) async {
-  name = arguments[0];
-
-  final token = Nonce(42);
-  makeObjectWithFinalizer(finalizer, token);
-
-  final awaitBeforeShuttingDown = ReceivePort();
-  port.send(awaitBeforeShuttingDown.sendPort);
-  final message = await awaitBeforeShuttingDown.first;
-  print('$name: $message');
-
-  await Future.delayed(Duration(milliseconds: 1));
-  print('$name: Awaited to see if there were any callbacks.');
-
-  print('$name: Helper isolate exiting. num callbacks: $callbackCount.');
-  port.send(callbackCount);
-}
diff --git a/runtime/tests/vm/dart_2/finalizer/finalizer_isolate_groups_run_gc_test.dart b/runtime/tests/vm/dart_2/finalizer/finalizer_isolate_groups_run_gc_test.dart
deleted file mode 100644
index afd09bb..0000000
--- a/runtime/tests/vm/dart_2/finalizer/finalizer_isolate_groups_run_gc_test.dart
+++ /dev/null
@@ -1,95 +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.
-
-// VMOptions=
-// VMOptions=--use_compactor
-// VMOptions=--use_compactor --force_evacuation
-
-// @dart = 2.9
-
-import 'dart:async';
-import 'dart:isolate';
-
-import 'package:async/async.dart';
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() async {
-  await testFinalizerInOtherIsolateGroupGCBeforeExit();
-  await testFinalizerInOtherIsolateGroupGCAfterExit();
-  await testFinalizerInOtherIsolateGroupNoGC();
-
-  print('$name: End of test, shutting down.');
-}
-
-const name = 'main';
-
-bool hotReloadBot;
-
-Future<void> testFinalizerInOtherIsolateGroupGCBeforeExit() async {
-  final receivePort = ReceivePort();
-  final messagesQueue = StreamQueue(receivePort);
-
-  await Isolate.spawnUri(
-    Uri.parse('finalizer_isolate_groups_run_gc_helper.dart'),
-    ['helper 1'],
-    receivePort.sendPort,
-  );
-  final signalHelperIsolate = await messagesQueue.next as SendPort;
-
-  doGC(name: name);
-  await yieldToMessageLoop(name: name);
-
-  signalHelperIsolate.send('Done GCing.');
-
-  final helperCallbacks = await messagesQueue.next as int;
-  messagesQueue.cancel();
-  print('$name: Helper exited.');
-  // Different isolate group, so we don't expect a GC in this isolate to cause
-  // collected objects in the helper.
-  // Except for in --hot-reload-test-mode, then the GC is triggered.
-  hotReloadBot = helperCallbacks == 1;
-}
-
-Future<void> testFinalizerInOtherIsolateGroupGCAfterExit() async {
-  final receivePort = ReceivePort();
-  final messagesQueue = StreamQueue(receivePort);
-  await Isolate.spawnUri(
-    Uri.parse('finalizer_isolate_groups_run_gc_helper.dart'),
-    ['helper 2'],
-    receivePort.sendPort,
-  );
-
-  final signalHelperIsolate = await messagesQueue.next as SendPort;
-
-  signalHelperIsolate.send('Before GCing.');
-
-  final helperCallbacks = await messagesQueue.next as int;
-  messagesQueue.cancel();
-  print('$name: Helper exited.');
-  Expect.equals(hotReloadBot ? 1 : 0, helperCallbacks);
-
-  doGC(name: name);
-  await yieldToMessageLoop(name: name);
-}
-
-Future<void> testFinalizerInOtherIsolateGroupNoGC() async {
-  final receivePort = ReceivePort();
-  final messagesQueue = StreamQueue(receivePort);
-
-  await Isolate.spawnUri(
-    Uri.parse('finalizer_isolate_groups_run_gc_helper.dart'),
-    ['helper 3'],
-    receivePort.sendPort,
-  );
-  final signalHelperIsolate = await messagesQueue.next as SendPort;
-
-  signalHelperIsolate.send('Before quitting main isolate.');
-
-  final helperCallbacks = await messagesQueue.next as int;
-  messagesQueue.cancel();
-  print('$name: Helper exited.');
-  Expect.equals(hotReloadBot ? 1 : 0, helperCallbacks);
-}
diff --git a/runtime/tests/vm/dart_2/finalizer/finalizer_isolates_run_gc_test.dart b/runtime/tests/vm/dart_2/finalizer/finalizer_isolates_run_gc_test.dart
deleted file mode 100644
index 7c2103d..0000000
--- a/runtime/tests/vm/dart_2/finalizer/finalizer_isolates_run_gc_test.dart
+++ /dev/null
@@ -1,104 +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.
-
-// VMOptions=
-// VMOptions=--use_compactor
-// VMOptions=--use_compactor --force_evacuation
-
-// @dart = 2.9
-
-import 'dart:async';
-import 'dart:isolate';
-
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() async {
-  await testNormalExit();
-  await testSendAndExit();
-  await testSendAndExitFinalizer();
-  print('End of test, shutting down.');
-}
-
-final finalizerTokens = <Nonce>{};
-
-void callback(Nonce token) {
-  print('Running finalizer: token: $token');
-  finalizerTokens.add(token);
-}
-
-void runIsolateAttachFinalizer(Object message) {
-  final finalizer = Finalizer<Nonce>(callback);
-  final value = Nonce(1001);
-  final token = Nonce(1002);
-  finalizer.attach(value, token);
-  final token9 = Nonce(9002);
-  makeObjectWithFinalizer(finalizer, token9);
-  if (message == null) {
-    print('Isolate done.');
-    return;
-  }
-  final list = message as List;
-  assert(list.length == 2);
-  final sendPort = list[0] as SendPort;
-  final tryToSendFinalizer = list[1] as bool;
-  if (tryToSendFinalizer) {
-    Expect.throws(() {
-      // TODO(http://dartbug.com/47777): Send and exit support.
-      print('Trying to send and exit finalizer.');
-      Isolate.exit(sendPort, [value, finalizer]);
-    });
-  }
-  print('Isolate sending and exit.');
-  Isolate.exit(sendPort, [value]);
-}
-
-Future testNormalExit() async {
-  final portExitMessage = ReceivePort();
-  await Isolate.spawn(
-    runIsolateAttachFinalizer,
-    null,
-    onExit: portExitMessage.sendPort,
-  );
-  await portExitMessage.first;
-
-  doGC();
-  await yieldToMessageLoop();
-
-  Expect.equals(0, finalizerTokens.length);
-}
-
-@pragma('vm:never-inline')
-Future<Finalizer> testSendAndExitHelper({bool trySendFinalizer = false}) async {
-  final port = ReceivePort();
-  await Isolate.spawn(
-    runIsolateAttachFinalizer,
-    [port.sendPort, trySendFinalizer],
-  );
-  final message = await port.first as List;
-  print('Received message ($message).');
-  final value = message[0] as Nonce;
-  print('Received value ($value), but now forgetting about it.');
-
-  Expect.equals(1, message.length);
-  // TODO(http://dartbug.com/47777): Send and exit support.
-  return null;
-}
-
-Future testSendAndExit() async {
-  await testSendAndExitHelper(trySendFinalizer: false);
-
-  doGC();
-  await yieldToMessageLoop();
-
-  Expect.equals(0, finalizerTokens.length);
-}
-
-Future testSendAndExitFinalizer() async {
-  final finalizer = await testSendAndExitHelper(trySendFinalizer: true);
-
-  // TODO(http://dartbug.com/47777): Send and exit support.
-  Expect.isNull(finalizer);
-}
diff --git a/runtime/tests/vm/dart_2/finalizer/finalizer_nullable_run_gc_test.dart b/runtime/tests/vm/dart_2/finalizer/finalizer_nullable_run_gc_test.dart
deleted file mode 100644
index b033c1b..0000000
--- a/runtime/tests/vm/dart_2/finalizer/finalizer_nullable_run_gc_test.dart
+++ /dev/null
@@ -1,45 +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.
-
-// @dart = 2.9
-
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() {
-  testFinalizer();
-}
-
-void testFinalizer() async {
-  final finalizerTokens = <Nonce>{};
-  void callback(Nonce token) {
-    print('Running finalizer: token: $token');
-    finalizerTokens.add(token);
-  }
-
-  final finalizer = Finalizer<Nonce>(callback);
-
-  {
-    final detach = Nonce(2022);
-    final token = null;
-
-    makeObjectWithFinalizer(finalizer, token, detach: detach);
-
-    doGC();
-
-    // We haven't stopped running synchronous dart code yet.
-    Expect.isFalse(finalizerTokens.contains(token));
-
-    await Future.delayed(Duration(milliseconds: 1));
-
-    // Now we have.
-    Expect.isTrue(finalizerTokens.contains(token));
-
-    // Try detaching after finalizer ran.
-    finalizer.detach(detach);
-  }
-
-  print('End of test, shutting down.');
-}
diff --git a/runtime/tests/vm/dart_2/finalizer/finalizer_run_gc_test.dart b/runtime/tests/vm/dart_2/finalizer/finalizer_run_gc_test.dart
deleted file mode 100644
index 9c17461..0000000
--- a/runtime/tests/vm/dart_2/finalizer/finalizer_run_gc_test.dart
+++ /dev/null
@@ -1,92 +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.
-
-// VMOptions=
-// VMOptions=--use_compactor
-// VMOptions=--use_compactor --force_evacuation
-
-// @dart = 2.9
-
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() {
-  testWrongArguments();
-  testFinalizer();
-}
-
-void testWrongArguments() {
-  void callback(Object token) {
-    throw 'This should never happen!';
-  }
-
-  final finalizer = Finalizer<Nonce>(callback);
-  final myFinalizable = Nonce(1000);
-  final token = Nonce(2000);
-  final detach = Nonce(3000);
-
-  Expect.throws(() {
-    finalizer.attach(myFinalizable, token, detach: 123);
-  });
-  Expect.throws(() {
-    finalizer.attach(123, token, detach: detach);
-  });
-}
-
-void testFinalizer() async {
-  final finalizerTokens = <Object>{};
-  void callback(Object token) {
-    print('Running finalizer: token: $token');
-    finalizerTokens.add(token);
-  }
-
-  final finalizer = Finalizer<Nonce>(callback);
-
-  {
-    final detach = Nonce(2022);
-    final token = Nonce(42);
-
-    makeObjectWithFinalizer(finalizer, token, detach: detach);
-
-    doGC();
-
-    // We haven't stopped running synchronous dart code yet.
-    Expect.isFalse(finalizerTokens.contains(token));
-
-    await Future.delayed(Duration(milliseconds: 1));
-
-    // Now we have.
-    Expect.isTrue(finalizerTokens.contains(token));
-
-    // Try detaching after finalizer ran.
-    finalizer.detach(detach);
-  }
-
-  {
-    final token = Nonce(1337);
-    final token2 = Nonce(1338);
-    final detachkey = Nonce(1984);
-    {
-      final value = Nonce(2);
-      final value2 = Nonce(2000000);
-      finalizer.attach(value, token, detach: detachkey);
-      finalizer.attach(value2, token2, detach: detachkey);
-      // Should detach 2 finalizers.
-      finalizer.detach(detachkey);
-      // Try detaching again, should do nothing.
-      finalizer.detach(detachkey);
-    }
-    doGC();
-    await yieldToMessageLoop();
-    Expect.isFalse(finalizerTokens.contains(token));
-    Expect.isFalse(finalizerTokens.contains(token2));
-  }
-
-  // Not running finalizer on shutdown.
-  final value = Nonce(3);
-  final token = Nonce(1337);
-  finalizer.attach(value, token);
-  print('End of test, shutting down.');
-}
diff --git a/runtime/tests/vm/dart_2/finalizer/finalizer_zone_run_gc_test.dart b/runtime/tests/vm/dart_2/finalizer/finalizer_zone_run_gc_test.dart
deleted file mode 100644
index 17646d1..0000000
--- a/runtime/tests/vm/dart_2/finalizer/finalizer_zone_run_gc_test.dart
+++ /dev/null
@@ -1,75 +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.
-
-// VMOptions=
-// VMOptions=--use_compactor
-// VMOptions=--use_compactor --force_evacuation
-
-// @dart = 2.9
-
-import 'dart:async';
-
-import 'package:expect/expect.dart';
-
-import 'helpers.dart';
-
-void main() async {
-  await testFinalizerZone();
-  await testFinalizerException();
-}
-
-Future<void> testFinalizerZone() async {
-  Zone expectedZone;
-  Zone actualZone;
-
-  final finalizer = runZoned(() {
-    expectedZone = Zone.current;
-
-    void callback(Object token) {
-      actualZone = Zone.current;
-    }
-
-    return Finalizer<Nonce>(callback);
-  });
-
-  final detach = Nonce(2022);
-  final token = Nonce(42);
-
-  makeObjectWithFinalizer(finalizer, token, detach: detach);
-
-  doGC();
-
-  // We haven't stopped running synchronous dart code yet.
-  Expect.isNull(actualZone);
-
-  await yieldToMessageLoop();
-
-  // Now we have.
-  Expect.equals(expectedZone, actualZone);
-}
-
-Future<void> testFinalizerException() async {
-  Object caughtError;
-
-  final finalizer = runZonedGuarded(() {
-    void callback(Object token) {
-      throw 'uncaught!';
-    }
-
-    return Finalizer<Nonce>(callback);
-  }, (Object error, StackTrace stack) {
-    caughtError = error;
-  });
-
-  final detach = Nonce(2022);
-  final token = Nonce(42);
-
-  makeObjectWithFinalizer(finalizer, token, detach: detach);
-
-  doGC();
-
-  Expect.isNull(caughtError);
-  await yieldToMessageLoop();
-  Expect.isNotNull(caughtError);
-}
diff --git a/runtime/tests/vm/dart_2/finalizer/helpers.dart b/runtime/tests/vm/dart_2/finalizer/helpers.dart
deleted file mode 100644
index a82646c..0000000
--- a/runtime/tests/vm/dart_2/finalizer/helpers.dart
+++ /dev/null
@@ -1,57 +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.
-
-// @dart = 2.9
-
-// ignore: import_internal_library, unused_import
-import 'dart:_internal';
-import 'dart:async';
-
-/// A user-defined class of which objects can be identified with a field value.
-class Nonce {
-  final int value;
-
-  Nonce(this.value);
-
-  String toString() => 'Nonce($value)';
-}
-
-/// Never inline to ensure `value` becomes unreachable.
-@pragma('vm:never-inline')
-void makeObjectWithFinalizer<T>(Finalizer<T> finalizer, T token,
-    {Object detach}) {
-  final value = Nonce(1);
-  finalizer.attach(value, token, detach: detach);
-}
-
-/// Triggers garbage collection.
-// Defined in `dart:_internal`.
-// ignore: undefined_identifier
-void triggerGc() => VMInternalsForTesting.collectAllGarbage();
-
-void Function(String) _namedPrint(String name) {
-  if (name != null) {
-    return (String value) => print('$name: $value');
-  }
-  return (String value) => print(value);
-}
-
-/// Does a GC and if [doAwait] awaits a future to enable running finalizers.
-///
-/// Also prints for debug purposes.
-///
-/// If provided, [name] prefixes the debug prints.
-void doGC({String name}) {
-  final _print = _namedPrint(name);
-
-  _print('Do GC.');
-  triggerGc();
-  _print('GC done');
-}
-
-Future<void> yieldToMessageLoop({String name}) async {
-  await Future.delayed(Duration(milliseconds: 1));
-  _namedPrint(name)('Await done.');
-  return null;
-}
diff --git a/runtime/tests/vm/dart_2/finalizer/weak_reference_run_gc_test.dart b/runtime/tests/vm/dart_2/finalizer/weak_reference_run_gc_test.dart
index 708d540..8c7583d 100644
--- a/runtime/tests/vm/dart_2/finalizer/weak_reference_run_gc_test.dart
+++ b/runtime/tests/vm/dart_2/finalizer/weak_reference_run_gc_test.dart
@@ -4,9 +4,10 @@
 
 // @dart = 2.9
 
-import 'package:expect/expect.dart';
+// ignore: import_internal_library, unused_import
+import 'dart:_internal';
 
-import 'helpers.dart';
+import 'package:expect/expect.dart';
 
 void main() {
   testWeakReferenceNonExpandoKey();
@@ -14,6 +15,14 @@
   testWeakReference();
 }
 
+class Nonce {
+  final int value;
+
+  Nonce(this.value);
+
+  String toString() => 'Nonce($value)';
+}
+
 void testWeakReferenceNonExpandoKey() {
   Expect.throwsArgumentError(() {
     WeakReference<String>("Hello world!");
@@ -48,3 +57,7 @@
 
   print('End of test, shutting down.');
 }
+
+// Defined in `dart:_internal`.
+// ignore: undefined_identifier
+void triggerGc() => VMInternalsForTesting.collectAllGarbage();
diff --git a/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart b/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
index 91fd27d..1843f0c 100644
--- a/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
@@ -247,7 +247,6 @@
 
     await testWeakProperty();
     await testWeakReference();
-    await testFinalizer();
 
     await testForbiddenClosures();
   }
@@ -759,14 +758,6 @@
     }
   }
 
-  Future testFinalizer() async {
-    print('testFinalizer');
-
-    void callback(Object token) {}
-    final finalizer = Finalizer<Object>(callback);
-    Expect.throwsArgumentError(() => sendPort.send(finalizer));
-  }
-
   Future testForbiddenClosures() async {
     print('testForbiddenClosures');
     for (final closure in nonCopyableClosures) {
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 8feee00..1f5066c 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -108,7 +108,6 @@
 [ $compiler == dartkp ]
 dart/causal_stacks/async_throws_stack_no_causal_non_symbolic_test: SkipByDesign # --no-lazy... does nothing on precompiler.
 dart/causal_stacks/async_throws_stack_no_causal_test: SkipByDesign # --no-lazy... does nothing on precompiler.
-dart/finalizer/finalizer_isolate_groups_run_gc_test: SkipByDesign # Isolate.spawnUri is not supported in AOT.
 dart/redirection_type_shuffling_test: SkipByDesign # Uses dart:mirrors.
 dart/scavenger_abort_test: SkipSlow
 dart/v8_snapshot_profile_writer_test: Pass, Slow # Can be slow due to re-invoking the precompiler.
@@ -443,11 +442,9 @@
 # These Isolate tests that use spawnURI are hence skipped on purpose.
 [ $runtime == dart_precompiled || $runtime == vm && ($arch == simarm || $arch == simarm64 || $arch == simarm64c || $arch == simriscv32 || $arch == simriscv64) ]
 dart/data_uri_spawn_test: SkipByDesign # Isolate.spawnUri
-dart/finalizer/finalizer_isolate_groups_run_gc_test: SkipByDesign # uses spawnUri.
 dart/isolates/send_object_to_spawn_uri_isolate_test: SkipByDesign # uses spawnUri
 dart/issue32950_test: SkipByDesign # uses spawnUri.
 dart_2/data_uri_spawn_test: SkipByDesign # Isolate.spawnUri
-dart_2/finalizer/finalizer_isolate_groups_run_gc_test: SkipByDesign # uses spawnUri.
 dart_2/isolates/send_object_to_spawn_uri_isolate_test: SkipByDesign # uses spawnUri
 dart_2/issue32950_test: SkipByDesign # uses spawnUri.
 
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index e2b8a40..f694613b 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -5140,7 +5140,7 @@
       Deserializer::InitializeHeader(property, kWeakPropertyCid,
                                      WeakProperty::InstanceSize());
       ReadFromTo(property);
-      property->untag()->next_seen_by_gc_ = WeakProperty::null();
+      property->untag()->next_ = WeakProperty::null();
     }
   }
 };
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index e91180e..dc432e3 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -267,10 +267,6 @@
   ASSERT_EQUAL(WeakProperty::InstanceSize(), cls.host_instance_size());
   cls = object_store->weak_reference_class();
   ASSERT_EQUAL(WeakReference::InstanceSize(), cls.host_instance_size());
-  cls = object_store->finalizer_class();
-  ASSERT_EQUAL(Finalizer::InstanceSize(), cls.host_instance_size());
-  cls = object_store->finalizer_entry_class();
-  ASSERT_EQUAL(FinalizerEntry::InstanceSize(), cls.host_instance_size());
   cls = object_store->linked_hash_map_class();
   ASSERT_EQUAL(LinkedHashMap::InstanceSize(), cls.host_instance_size());
   cls = object_store->immutable_linked_hash_map_class();
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index 501c3a8..93e1979 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -68,9 +68,6 @@
   V(TypeArguments)                                                             \
   V(AbstractType)                                                              \
   V(Type)                                                                      \
-  V(FinalizerBase)                                                             \
-  V(Finalizer)                                                                 \
-  V(FinalizerEntry)                                                            \
   V(FunctionType)                                                              \
   V(TypeRef)                                                                   \
   V(TypeParameter)                                                             \
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 8d01fc7..4d28937 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -2797,16 +2797,6 @@
     case Slot::Kind::kClosure_function:
     case Slot::Kind::kClosure_function_type_arguments:
     case Slot::Kind::kClosure_instantiator_type_arguments:
-    case Slot::Kind::kFinalizer_callback:
-    case Slot::Kind::kFinalizer_type_arguments:
-    case Slot::Kind::kFinalizerBase_all_entries:
-    case Slot::Kind::kFinalizerBase_detachments:
-    case Slot::Kind::kFinalizerBase_entries_collected:
-    case Slot::Kind::kFinalizerEntry_detach:
-    case Slot::Kind::kFinalizerEntry_finalizer:
-    case Slot::Kind::kFinalizerEntry_next:
-    case Slot::Kind::kFinalizerEntry_token:
-    case Slot::Kind::kFinalizerEntry_value:
     case Slot::Kind::kFunction_data:
     case Slot::Kind::kFunction_signature:
     case Slot::Kind::kFunctionType_named_parameter_names:
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index dfd04ac..4a512f8 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -227,16 +227,6 @@
     case Slot::Kind::kClosure_hash:
     case Slot::Kind::kCapturedVariable:
     case Slot::Kind::kDartField:
-    case Slot::Kind::kFinalizer_callback:
-    case Slot::Kind::kFinalizer_type_arguments:
-    case Slot::Kind::kFinalizerBase_all_entries:
-    case Slot::Kind::kFinalizerBase_detachments:
-    case Slot::Kind::kFinalizerBase_entries_collected:
-    case Slot::Kind::kFinalizerEntry_detach:
-    case Slot::Kind::kFinalizerEntry_finalizer:
-    case Slot::Kind::kFinalizerEntry_next:
-    case Slot::Kind::kFinalizerEntry_token:
-    case Slot::Kind::kFinalizerEntry_value:
     case Slot::Kind::kFunction_data:
     case Slot::Kind::kFunction_signature:
     case Slot::Kind::kFunctionType_named_parameter_names:
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index 995ce8cf..ab82fe2 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -53,15 +53,6 @@
 //   that) or like a non-final field.
 #define NULLABLE_BOXED_NATIVE_SLOTS_LIST(V)                                    \
   V(Array, UntaggedArray, type_arguments, TypeArguments, FINAL)                \
-  V(Finalizer, UntaggedFinalizer, type_arguments, TypeArguments, FINAL)        \
-  V(FinalizerBase, UntaggedFinalizerBase, all_entries, LinkedHashSet, VAR)     \
-  V(FinalizerBase, UntaggedFinalizerBase, detachments, Dynamic, VAR)           \
-  V(FinalizerBase, UntaggedFinalizer, entries_collected, FinalizerEntry, VAR)  \
-  V(FinalizerEntry, UntaggedFinalizerEntry, value, Dynamic, VAR)               \
-  V(FinalizerEntry, UntaggedFinalizerEntry, detach, Dynamic, VAR)              \
-  V(FinalizerEntry, UntaggedFinalizerEntry, token, Dynamic, VAR)               \
-  V(FinalizerEntry, UntaggedFinalizerEntry, finalizer, FinalizerBase, VAR)     \
-  V(FinalizerEntry, UntaggedFinalizerEntry, next, FinalizerEntry, VAR)         \
   V(Function, UntaggedFunction, signature, FunctionType, FINAL)                \
   V(Context, UntaggedContext, parent, Context, FINAL)                          \
   V(Closure, UntaggedClosure, instantiator_type_arguments, TypeArguments,      \
@@ -100,7 +91,6 @@
   V(Closure, UntaggedClosure, function, Function, FINAL)                       \
   V(Closure, UntaggedClosure, context, Context, FINAL)                         \
   V(Closure, UntaggedClosure, hash, Context, VAR)                              \
-  V(Finalizer, UntaggedFinalizer, callback, Closure, FINAL)                    \
   V(Function, UntaggedFunction, data, Dynamic, FINAL)                          \
   V(FunctionType, UntaggedFunctionType, named_parameter_names, Array, FINAL)   \
   V(FunctionType, UntaggedFunctionType, parameter_types, Array, FINAL)         \
@@ -169,7 +159,6 @@
   AOT_ONLY_UNBOXED_NATIVE_SLOTS_LIST(V)                                        \
   V(ClosureData, UntaggedClosureData, default_type_arguments_kind, Uint8,      \
     FINAL)                                                                     \
-  V(FinalizerBase, UntaggedFinalizerBase, isolate, IntPtr, VAR)                \
   V(Function, UntaggedFunction, entry_point, Uword, FINAL)                     \
   V(Function, UntaggedFunction, kind_tag, Uint32, FINAL)                       \
   V(Function, UntaggedFunction, packed_fields, Uint32, FINAL)                  \
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 9abd1fd..006ea70 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -818,13 +818,6 @@
   V(ByteDataViewLength, TypedDataBase_length)                                  \
   V(ByteDataViewOffsetInBytes, TypedDataView_offset_in_bytes)                  \
   V(ByteDataViewTypedData, TypedDataView_typed_data)                           \
-  V(Finalizer_getCallback, Finalizer_callback)                                 \
-  V(FinalizerBase_getAllEntries, FinalizerBase_all_entries)                    \
-  V(FinalizerBase_getDetachments, FinalizerBase_detachments)                   \
-  V(FinalizerEntry_getDetach, FinalizerEntry_detach)                           \
-  V(FinalizerEntry_getNext, FinalizerEntry_next)                               \
-  V(FinalizerEntry_getToken, FinalizerEntry_token)                             \
-  V(FinalizerEntry_getValue, FinalizerEntry_value)                             \
   V(GrowableArrayLength, GrowableObjectArray_length)                           \
   V(ImmutableLinkedHashBase_getData, ImmutableLinkedHashBase_data)             \
   V(ImmutableLinkedHashBase_getIndex, ImmutableLinkedHashBase_index)           \
@@ -842,14 +835,6 @@
   V(WeakReference_getTarget, WeakReference_target)
 
 #define STORE_NATIVE_FIELD(V)                                                  \
-  V(Finalizer_setCallback, Finalizer_callback)                                 \
-  V(FinalizerBase_setAllEntries, FinalizerBase_all_entries)                    \
-  V(FinalizerBase_setDetachments, FinalizerBase_detachments)                   \
-  V(FinalizerEntry_setDetach, FinalizerEntry_detach)                           \
-  V(FinalizerEntry_setFinalizer, FinalizerEntry_finalizer)                     \
-  V(FinalizerEntry_setNext, FinalizerEntry_next)                               \
-  V(FinalizerEntry_setToken, FinalizerEntry_token)                             \
-  V(FinalizerEntry_setValue, FinalizerEntry_value)                             \
   V(LinkedHashBase_setData, LinkedHashBase_data)                               \
   V(LinkedHashBase_setIndex, LinkedHashBase_index)                             \
   V(WeakProperty_setKey, WeakProperty_key)                                     \
@@ -934,10 +919,6 @@
     case MethodRecognizer::kFfiAsExternalTypedDataFloat:
     case MethodRecognizer::kFfiAsExternalTypedDataDouble:
     case MethodRecognizer::kGetNativeField:
-    case MethodRecognizer::kFinalizerBase_exchangeEntriesCollectedWithNull:
-    case MethodRecognizer::kFinalizerBase_getIsolateFinalizers:
-    case MethodRecognizer::kFinalizerBase_setIsolate:
-    case MethodRecognizer::kFinalizerBase_setIsolateFinalizers:
     case MethodRecognizer::kObjectEquals:
     case MethodRecognizer::kStringBaseLength:
     case MethodRecognizer::kStringBaseIsEmpty:
@@ -1586,41 +1567,6 @@
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += MathUnary(MathUnaryInstr::kSqrt);
     } break;
-    case MethodRecognizer::kFinalizerBase_setIsolate:
-      ASSERT_EQUAL(function.NumParameters(), 1);
-      body += LoadLocal(parsed_function_->RawParameterVariable(0));
-      body += LoadIsolate();
-      body += ConvertUntaggedToUnboxed(kUnboxedIntPtr);
-      body += StoreNativeField(Slot::FinalizerBase_isolate());
-      body += NullConstant();
-      break;
-    case MethodRecognizer::kFinalizerBase_getIsolateFinalizers:
-      ASSERT_EQUAL(function.NumParameters(), 0);
-      body += LoadIsolate();
-      body += RawLoadField(compiler::target::Isolate::finalizers_offset());
-      break;
-    case MethodRecognizer::kFinalizerBase_setIsolateFinalizers:
-      ASSERT_EQUAL(function.NumParameters(), 1);
-      body += LoadIsolate();
-      body += LoadLocal(parsed_function_->RawParameterVariable(0));
-      body += RawStoreField(compiler::target::Isolate::finalizers_offset());
-      body += NullConstant();
-      break;
-    case MethodRecognizer::kFinalizerBase_exchangeEntriesCollectedWithNull:
-      ASSERT_EQUAL(function.NumParameters(), 1);
-      ASSERT(this->optimizing_);
-      // This relies on being force-optimized to do an 'atomic' exchange w.r.t.
-      // the GC.
-      // As an alternative design we could introduce an ExchangeNativeFieldInstr
-      // that uses the same machine code as std::atomic::exchange. Or we could
-      // use an FfiNative to do that in C.
-      body += LoadLocal(parsed_function_->RawParameterVariable(0));
-      // No GC from here til StoreNativeField.
-      body += LoadNativeField(Slot::FinalizerBase_entries_collected());
-      body += LoadLocal(parsed_function_->RawParameterVariable(0));
-      body += NullConstant();
-      body += StoreNativeField(Slot::FinalizerBase_entries_collected());
-      break;
 #define IL_BODY(method, slot)                                                  \
   case MethodRecognizer::k##method:                                            \
     ASSERT_EQUAL(function.NumParameters(), 1);                                 \
@@ -4028,19 +3974,6 @@
   return Fragment(unbox);
 }
 
-Fragment FlowGraphBuilder::LoadThread() {
-  LoadThreadInstr* instr = new (Z) LoadThreadInstr();
-  Push(instr);
-  return Fragment(instr);
-}
-
-Fragment FlowGraphBuilder::LoadIsolate() {
-  Fragment body;
-  body += LoadThread();
-  body += LoadUntagged(compiler::target::Thread::isolate_offset());
-  return body;
-}
-
 // TODO(http://dartbug.com/47487): Support unboxed output value.
 Fragment FlowGraphBuilder::BoolToInt() {
   // TODO(http://dartbug.com/36855) Build IfThenElseInstr, instead of letting
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 2a92d6a..03a18f6 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -276,12 +276,6 @@
   // target representation.
   Fragment UnboxTruncate(Representation to);
 
-  // Loads the (untagged) thread address.
-  Fragment LoadThread();
-
-  // Loads the (untagged) isolate address.
-  Fragment LoadIsolate();
-
   // Converts a true to 1 and false to 0.
   Fragment BoolToInt();
 
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 1676f7c..e8a7016 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -110,28 +110,6 @@
   V(::, _sqrt, MathSqrt, 0x03183390)                                           \
   V(::, _exp, MathExp, 0x00f4ffd0)                                             \
   V(::, _log, MathLog, 0x09ae8462)                                             \
-  V(FinalizerBase, get:_allEntries, FinalizerBase_getAllEntries, 0xf03ff26b)   \
-  V(FinalizerBase, set:_allEntries, FinalizerBase_setAllEntries, 0x8f0920e8)   \
-  V(FinalizerBase, get:_detachments, FinalizerBase_getDetachments, 0x2f650f36) \
-  V(FinalizerBase, set:_detachments, FinalizerBase_setDetachments, 0x788f1df3) \
-  V(FinalizerBase, _exchangeEntriesCollectedWithNull,                          \
-    FinalizerBase_exchangeEntriesCollectedWithNull, 0x6c9124fb)                \
-  V(FinalizerBase, _setIsolate, FinalizerBase_setIsolate, 0xbcf7db91)          \
-  V(FinalizerBase, get:_isolateFinalizers, FinalizerBase_getIsolateFinalizers, \
-    0x70f53b2b)                                                                \
-  V(FinalizerBase, set:_isolateFinalizers, FinalizerBase_setIsolateFinalizers, \
-    0xb3e66928)                                                                \
-  V(_FinalizerImpl, get:_callback, Finalizer_getCallback, 0x6f3d56bc)          \
-  V(_FinalizerImpl, set:_callback, Finalizer_setCallback, 0xc6aa96f9)          \
-  V(FinalizerEntry, get:value, FinalizerEntry_getValue, 0xf5c9b9d7)            \
-  V(FinalizerEntry, set:value, FinalizerEntry_setValue, 0x5501cc54)            \
-  V(FinalizerEntry, get:detach, FinalizerEntry_getDetach, 0x171cd968)          \
-  V(FinalizerEntry, set:detach, FinalizerEntry_setDetach, 0x7654ebe5)          \
-  V(FinalizerEntry, set:finalizer, FinalizerEntry_setFinalizer, 0x15cfefe9)    \
-  V(FinalizerEntry, get:token, FinalizerEntry_getToken, 0x04915a72)            \
-  V(FinalizerEntry, set:token, FinalizerEntry_setToken, 0x63c96cef)            \
-  V(FinalizerEntry, get:next, FinalizerEntry_getNext, 0x7102d7a4)              \
-  V(FinalizerEntry, set:next, FinalizerEntry_setNext, 0xd0b2ee61)              \
   V(Float32x4, _Float32x4FromDoubles, Float32x4FromDoubles, 0x1845792b)        \
   V(Float32x4, Float32x4.zero, Float32x4Zero, 0xd3b64002)                      \
   V(Float32x4, _Float32x4Splat, Float32x4Splat, 0x13a552c3)                    \
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index d9ddcb3..9cc619d 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -439,10 +439,6 @@
       return WeakProperty::InstanceSize();
     case kWeakReferenceCid:
       return WeakReference::InstanceSize();
-    case kFinalizerCid:
-      return Finalizer::InstanceSize();
-    case kFinalizerEntryCid:
-      return FinalizerEntry::InstanceSize();
     case kByteBufferCid:
     case kByteDataViewCid:
     case kPointerCid:
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 11d0013..f502d99 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -1045,34 +1045,6 @@
   FINAL_CLASS();
 };
 
-class FinalizerBase : public AllStatic {
- public:
-  static word all_entries_offset();
-  static word detachments_offset();
-  static word entries_collected_offset();
-  static word isolate_offset();
-  FINAL_CLASS();
-};
-
-class Finalizer : public AllStatic {
- public:
-  static word type_arguments_offset();
-  static word callback_offset();
-  static word InstanceSize();
-  FINAL_CLASS();
-};
-
-class FinalizerEntry : public AllStatic {
- public:
-  static word value_offset();
-  static word detach_offset();
-  static word token_offset();
-  static word next_offset();
-  static word finalizer_offset();
-  static word InstanceSize();
-  FINAL_CLASS();
-};
-
 class MirrorReference : public AllStatic {
  public:
   static word InstanceSize();
@@ -1270,7 +1242,6 @@
   static word current_tag_offset();
   static word user_tag_offset();
   static word ic_miss_code_offset();
-  static word finalizers_offset();
 #if !defined(PRODUCT)
   static word single_step_offset();
 #endif  // !defined(PRODUCT)
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index ee0e4c2..6f1d535 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -183,7 +183,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 24;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 28;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 40;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 32;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     20;
@@ -191,7 +190,7 @@
     IsolateGroup_shared_class_table_offset = 8;
 static constexpr dart::compiler::target::word
     IsolateGroup_cached_class_table_table_offset = 16;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 44;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 40;
 static constexpr dart::compiler::target::word Isolate_user_tag_offset = 20;
 static constexpr dart::compiler::target::word LinkedHashBase_data_offset = 12;
 static constexpr dart::compiler::target::word
@@ -220,12 +219,12 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    164;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    160;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 116;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    184;
+    180;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -437,22 +436,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
 static constexpr dart::compiler::target::word Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    24;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 20;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    12;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    8;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    16;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 20;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 24;
@@ -535,8 +518,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     28;
 static constexpr dart::compiler::target::word Field_InstanceSize = 60;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 28;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 88;
@@ -773,7 +754,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 48;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 56;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 80;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 64;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -781,7 +761,7 @@
     IsolateGroup_shared_class_table_offset = 16;
 static constexpr dart::compiler::target::word
     IsolateGroup_cached_class_table_table_offset = 32;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 88;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 80;
 static constexpr dart::compiler::target::word Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_data_offset = 24;
 static constexpr dart::compiler::target::word
@@ -810,12 +790,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -1033,22 +1013,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 40;
 static constexpr dart::compiler::target::word Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    48;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 40;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    24;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 24;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    32;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 40;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 48;
@@ -1132,8 +1096,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Field_InstanceSize = 96;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 56;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 128;
@@ -1368,7 +1330,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 24;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 28;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 40;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 32;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     20;
@@ -1376,7 +1337,7 @@
     IsolateGroup_shared_class_table_offset = 8;
 static constexpr dart::compiler::target::word
     IsolateGroup_cached_class_table_table_offset = 16;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 44;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 40;
 static constexpr dart::compiler::target::word Isolate_user_tag_offset = 20;
 static constexpr dart::compiler::target::word LinkedHashBase_data_offset = 12;
 static constexpr dart::compiler::target::word
@@ -1405,12 +1366,12 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    164;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    160;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 116;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    184;
+    180;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -1622,22 +1583,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
 static constexpr dart::compiler::target::word Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    24;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 20;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    12;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    8;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    16;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 20;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 24;
@@ -1717,8 +1662,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     28;
 static constexpr dart::compiler::target::word Field_InstanceSize = 60;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 28;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 88;
@@ -1955,7 +1898,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 48;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 56;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 80;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 64;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -1963,7 +1905,7 @@
     IsolateGroup_shared_class_table_offset = 16;
 static constexpr dart::compiler::target::word
     IsolateGroup_cached_class_table_table_offset = 32;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 88;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 80;
 static constexpr dart::compiler::target::word Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_data_offset = 24;
 static constexpr dart::compiler::target::word
@@ -1992,12 +1934,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -2215,22 +2157,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 40;
 static constexpr dart::compiler::target::word Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    48;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 40;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    24;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 24;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    32;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 40;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 48;
@@ -2315,8 +2241,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Field_InstanceSize = 96;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 56;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 128;
@@ -2551,7 +2475,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 48;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 56;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 80;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 64;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -2559,7 +2482,7 @@
     IsolateGroup_shared_class_table_offset = 16;
 static constexpr dart::compiler::target::word
     IsolateGroup_cached_class_table_table_offset = 32;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 88;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 80;
 static constexpr dart::compiler::target::word Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_data_offset = 16;
 static constexpr dart::compiler::target::word
@@ -2588,12 +2511,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -2811,22 +2734,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 32;
 static constexpr dart::compiler::target::word Type_type_state_offset = 34;
 static constexpr dart::compiler::target::word Type_nullability_offset = 35;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    36;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    20;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 24;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    20;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 24;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 40;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 36;
@@ -2910,8 +2817,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word Field_InstanceSize = 64;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 40;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 32;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 96;
@@ -3146,7 +3051,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 48;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 56;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 80;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 64;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -3154,7 +3058,7 @@
     IsolateGroup_shared_class_table_offset = 16;
 static constexpr dart::compiler::target::word
     IsolateGroup_cached_class_table_table_offset = 32;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 88;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 80;
 static constexpr dart::compiler::target::word Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_data_offset = 16;
 static constexpr dart::compiler::target::word
@@ -3183,12 +3087,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -3406,22 +3310,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 32;
 static constexpr dart::compiler::target::word Type_type_state_offset = 34;
 static constexpr dart::compiler::target::word Type_nullability_offset = 35;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    36;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    20;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 24;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    20;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 24;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 40;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 36;
@@ -3506,8 +3394,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word Field_InstanceSize = 64;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 40;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 32;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 96;
@@ -3742,7 +3628,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 24;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 28;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 40;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 32;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     20;
@@ -3750,7 +3635,7 @@
     IsolateGroup_shared_class_table_offset = 8;
 static constexpr dart::compiler::target::word
     IsolateGroup_cached_class_table_table_offset = 16;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 44;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 40;
 static constexpr dart::compiler::target::word Isolate_user_tag_offset = 20;
 static constexpr dart::compiler::target::word LinkedHashBase_data_offset = 12;
 static constexpr dart::compiler::target::word
@@ -3779,12 +3664,12 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    164;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    160;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 116;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    184;
+    180;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -3996,22 +3881,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
 static constexpr dart::compiler::target::word Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    24;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 20;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    12;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    8;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    16;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 20;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 24;
@@ -4096,8 +3965,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     28;
 static constexpr dart::compiler::target::word Field_InstanceSize = 60;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 28;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 88;
@@ -4334,7 +4201,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 48;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 56;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 80;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 64;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -4342,7 +4208,7 @@
     IsolateGroup_shared_class_table_offset = 16;
 static constexpr dart::compiler::target::word
     IsolateGroup_cached_class_table_table_offset = 32;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 88;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 80;
 static constexpr dart::compiler::target::word Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_data_offset = 24;
 static constexpr dart::compiler::target::word
@@ -4371,12 +4237,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -4594,22 +4460,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 40;
 static constexpr dart::compiler::target::word Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    48;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 40;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    24;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 24;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    32;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 40;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 48;
@@ -4694,8 +4544,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Field_InstanceSize = 96;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 56;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 128;
@@ -4927,7 +4775,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 20;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 24;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 36;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 28;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     20;
@@ -4963,12 +4810,12 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    164;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    160;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 116;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    184;
+    180;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -5180,22 +5027,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
 static constexpr dart::compiler::target::word Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    24;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 20;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    12;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    8;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    16;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 20;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 24;
@@ -5278,8 +5109,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     28;
 static constexpr dart::compiler::target::word Field_InstanceSize = 60;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 28;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 88;
@@ -5511,7 +5340,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 40;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 48;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 72;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 56;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -5547,12 +5375,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -5770,22 +5598,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 40;
 static constexpr dart::compiler::target::word Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    48;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 40;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    24;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 24;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    32;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 40;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 48;
@@ -5869,8 +5681,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Field_InstanceSize = 96;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 56;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 128;
@@ -6100,7 +5910,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 20;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 24;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 36;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 28;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     20;
@@ -6136,12 +5945,12 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    164;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    160;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 116;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    184;
+    180;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -6353,22 +6162,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
 static constexpr dart::compiler::target::word Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    24;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 20;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    12;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    8;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    16;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 20;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 24;
@@ -6448,8 +6241,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     28;
 static constexpr dart::compiler::target::word Field_InstanceSize = 60;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 28;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 88;
@@ -6681,7 +6472,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 40;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 48;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 72;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 56;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -6717,12 +6507,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -6940,22 +6730,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 40;
 static constexpr dart::compiler::target::word Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    48;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 40;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    24;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 24;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    32;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 40;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 48;
@@ -7040,8 +6814,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Field_InstanceSize = 96;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 56;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 128;
@@ -7271,7 +7043,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 40;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 48;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 72;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 56;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -7307,12 +7078,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -7530,22 +7301,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 32;
 static constexpr dart::compiler::target::word Type_type_state_offset = 34;
 static constexpr dart::compiler::target::word Type_nullability_offset = 35;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    36;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    20;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 24;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    20;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 24;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 40;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 36;
@@ -7629,8 +7384,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word Field_InstanceSize = 64;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 40;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 32;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 96;
@@ -7860,7 +7613,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 40;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 48;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 72;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 56;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -7896,12 +7648,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -8119,22 +7871,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 32;
 static constexpr dart::compiler::target::word Type_type_state_offset = 34;
 static constexpr dart::compiler::target::word Type_nullability_offset = 35;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    36;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    20;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 24;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    20;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 24;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 40;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 36;
@@ -8219,8 +7955,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word Field_InstanceSize = 64;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 40;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 32;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 96;
@@ -8450,7 +8184,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 20;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 24;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 36;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 28;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     20;
@@ -8486,12 +8219,12 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    164;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    160;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 116;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    184;
+    180;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -8703,22 +8436,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 20;
 static constexpr dart::compiler::target::word Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    24;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 20;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    12;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    8;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 4;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 12;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    16;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 20;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 24;
@@ -8803,8 +8520,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     28;
 static constexpr dart::compiler::target::word Field_InstanceSize = 60;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 28;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 88;
@@ -9036,7 +8751,6 @@
 static constexpr dart::compiler::target::word Int32x4_value_offset = 8;
 static constexpr dart::compiler::target::word Isolate_current_tag_offset = 40;
 static constexpr dart::compiler::target::word Isolate_default_tag_offset = 48;
-static constexpr dart::compiler::target::word Isolate_finalizers_offset = 72;
 static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 56;
 static constexpr dart::compiler::target::word IsolateGroup_object_store_offset =
     40;
@@ -9072,12 +8786,12 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    328;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 240;
+    320;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 232;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -9295,22 +9009,6 @@
 static constexpr dart::compiler::target::word Type_type_class_id_offset = 40;
 static constexpr dart::compiler::target::word Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word Finalizer_type_arguments_offset =
-    48;
-static constexpr dart::compiler::target::word Finalizer_callback_offset = 40;
-static constexpr dart::compiler::target::word FinalizerBase_all_entries_offset =
-    24;
-static constexpr dart::compiler::target::word FinalizerBase_detachments_offset =
-    16;
-static constexpr dart::compiler::target::word
-    FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word FinalizerBase_isolate_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_value_offset = 8;
-static constexpr dart::compiler::target::word FinalizerEntry_detach_offset = 16;
-static constexpr dart::compiler::target::word FinalizerEntry_token_offset = 24;
-static constexpr dart::compiler::target::word FinalizerEntry_finalizer_offset =
-    32;
-static constexpr dart::compiler::target::word FinalizerEntry_next_offset = 40;
 static constexpr dart::compiler::target::word FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     FunctionType_named_parameter_names_offset = 48;
@@ -9395,8 +9093,6 @@
 static constexpr dart::compiler::target::word FfiTrampolineData_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Field_InstanceSize = 96;
-static constexpr dart::compiler::target::word Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word FinalizerEntry_InstanceSize = 56;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word Function_InstanceSize = 128;
@@ -9649,8 +9345,6 @@
     24;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     28;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    40;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     32;
 static constexpr dart::compiler::target::word
@@ -9660,7 +9354,7 @@
 static constexpr dart::compiler::target::word
     AOT_IsolateGroup_cached_class_table_table_offset = 16;
 static constexpr dart::compiler::target::word AOT_Isolate_single_step_offset =
-    44;
+    40;
 static constexpr dart::compiler::target::word AOT_Isolate_user_tag_offset = 20;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_data_offset =
     12;
@@ -9695,13 +9389,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 164;
+    AOT_ObjectStore_double_type_offset = 160;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    120;
+    116;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 184;
+    AOT_ObjectStore_string_type_offset = 180;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 4;
@@ -9932,28 +9626,6 @@
     20;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 24;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    20;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 8;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    4;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    4;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    12;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    20;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 24;
@@ -10048,9 +9720,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 28;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    28;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 44;
@@ -10313,8 +9982,6 @@
     48;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     56;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    80;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -10324,7 +9991,7 @@
 static constexpr dart::compiler::target::word
     AOT_IsolateGroup_cached_class_table_table_offset = 32;
 static constexpr dart::compiler::target::word AOT_Isolate_single_step_offset =
-    88;
+    80;
 static constexpr dart::compiler::target::word AOT_Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_data_offset =
     24;
@@ -10359,13 +10026,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -10597,28 +10264,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    40;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    40;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 48;
@@ -10715,9 +10360,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 80;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    56;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 80;
@@ -10983,8 +10625,6 @@
     48;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     56;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    80;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -10994,7 +10634,7 @@
 static constexpr dart::compiler::target::word
     AOT_IsolateGroup_cached_class_table_table_offset = 32;
 static constexpr dart::compiler::target::word AOT_Isolate_single_step_offset =
-    88;
+    80;
 static constexpr dart::compiler::target::word AOT_Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_data_offset =
     24;
@@ -11029,13 +10669,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -11267,28 +10907,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    40;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    40;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 48;
@@ -11386,9 +11004,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 80;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    56;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 80;
@@ -11650,8 +11265,6 @@
     48;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     56;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    80;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -11661,7 +11274,7 @@
 static constexpr dart::compiler::target::word
     AOT_IsolateGroup_cached_class_table_table_offset = 32;
 static constexpr dart::compiler::target::word AOT_Isolate_single_step_offset =
-    88;
+    80;
 static constexpr dart::compiler::target::word AOT_Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_data_offset =
     16;
@@ -11696,13 +11309,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -11934,28 +11547,6 @@
     32;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 34;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 35;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 36;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    32;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 20;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 24;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    12;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 20;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    24;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 36;
@@ -12052,9 +11643,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    32;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 56;
@@ -12316,8 +11904,6 @@
     48;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     56;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    80;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -12327,7 +11913,7 @@
 static constexpr dart::compiler::target::word
     AOT_IsolateGroup_cached_class_table_table_offset = 32;
 static constexpr dart::compiler::target::word AOT_Isolate_single_step_offset =
-    88;
+    80;
 static constexpr dart::compiler::target::word AOT_Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_data_offset =
     16;
@@ -12362,13 +11948,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -12600,28 +12186,6 @@
     32;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 34;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 35;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 36;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    32;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 20;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 24;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    12;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 20;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    24;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 36;
@@ -12719,9 +12283,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    32;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 56;
@@ -12983,8 +12544,6 @@
     24;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     28;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    40;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     32;
 static constexpr dart::compiler::target::word
@@ -12994,7 +12553,7 @@
 static constexpr dart::compiler::target::word
     AOT_IsolateGroup_cached_class_table_table_offset = 16;
 static constexpr dart::compiler::target::word AOT_Isolate_single_step_offset =
-    44;
+    40;
 static constexpr dart::compiler::target::word AOT_Isolate_user_tag_offset = 20;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_data_offset =
     12;
@@ -13029,13 +12588,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 164;
+    AOT_ObjectStore_double_type_offset = 160;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    120;
+    116;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 184;
+    AOT_ObjectStore_string_type_offset = 180;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 4;
@@ -13266,28 +12825,6 @@
     20;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 24;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    20;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 8;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    4;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    4;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    12;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    20;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 24;
@@ -13384,9 +12921,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 28;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    28;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 44;
@@ -13649,8 +13183,6 @@
     48;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     56;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    80;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -13660,7 +13192,7 @@
 static constexpr dart::compiler::target::word
     AOT_IsolateGroup_cached_class_table_table_offset = 32;
 static constexpr dart::compiler::target::word AOT_Isolate_single_step_offset =
-    88;
+    80;
 static constexpr dart::compiler::target::word AOT_Isolate_user_tag_offset = 40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_data_offset =
     24;
@@ -13695,13 +13227,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -13933,28 +13465,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    40;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    40;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 48;
@@ -14052,9 +13562,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 80;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    56;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 80;
@@ -14313,8 +13820,6 @@
     20;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     24;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    36;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     28;
 static constexpr dart::compiler::target::word
@@ -14357,13 +13862,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 164;
+    AOT_ObjectStore_double_type_offset = 160;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    120;
+    116;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 184;
+    AOT_ObjectStore_string_type_offset = 180;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 4;
@@ -14594,28 +14099,6 @@
     20;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 24;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    20;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 8;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    4;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    4;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    12;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    20;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 24;
@@ -14710,9 +14193,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 28;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    28;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 44;
@@ -14970,8 +14450,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     48;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    72;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -15014,13 +14492,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -15252,28 +14730,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    40;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    40;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 48;
@@ -15370,9 +14826,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 80;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    56;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 80;
@@ -15633,8 +15086,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     48;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    72;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -15677,13 +15128,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -15915,28 +15366,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    40;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    40;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 48;
@@ -16034,9 +15463,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 80;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    56;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 80;
@@ -16293,8 +15719,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     48;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    72;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -16337,13 +15761,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -16575,28 +15999,6 @@
     32;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 34;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 35;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 36;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    32;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 20;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 24;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    12;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 20;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    24;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 36;
@@ -16693,9 +16095,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    32;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 56;
@@ -16952,8 +16351,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     48;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    72;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -16996,13 +16393,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -17234,28 +16631,6 @@
     32;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 34;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 35;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 36;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    32;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 20;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 24;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    12;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 20;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    24;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 36;
@@ -17353,9 +16728,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    32;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 56;
@@ -17612,8 +16984,6 @@
     20;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     24;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    36;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     28;
 static constexpr dart::compiler::target::word
@@ -17656,13 +17026,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 164;
+    AOT_ObjectStore_double_type_offset = 160;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    120;
+    116;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 184;
+    AOT_ObjectStore_string_type_offset = 180;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    108;
+    104;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 4;
@@ -17893,28 +17263,6 @@
     20;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 22;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 23;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 24;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    20;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 8;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 16;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    4;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    4;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    12;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    20;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 28;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 24;
@@ -18011,9 +17359,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 28;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    28;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 44;
@@ -18271,8 +17616,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Isolate_default_tag_offset =
     48;
-static constexpr dart::compiler::target::word AOT_Isolate_finalizers_offset =
-    72;
 static constexpr dart::compiler::target::word AOT_Isolate_ic_miss_code_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -18315,13 +17658,13 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 328;
+    AOT_ObjectStore_double_type_offset = 320;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    240;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 368;
+    AOT_ObjectStore_string_type_offset = 360;
 static constexpr dart::compiler::target::word AOT_ObjectStore_type_type_offset =
-    216;
+    208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
@@ -18553,28 +17896,6 @@
     40;
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 42;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 43;
-static constexpr dart::compiler::target::word
-    AOT_Finalizer_type_arguments_offset = 48;
-static constexpr dart::compiler::target::word AOT_Finalizer_callback_offset =
-    40;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_all_entries_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_detachments_offset = 16;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerBase_entries_collected_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerBase_isolate_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_value_offset =
-    8;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_detach_offset =
-    16;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_token_offset =
-    24;
-static constexpr dart::compiler::target::word
-    AOT_FinalizerEntry_finalizer_offset = 32;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_next_offset =
-    40;
 static constexpr dart::compiler::target::word AOT_FunctionType_hash_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_FunctionType_named_parameter_names_offset = 48;
@@ -18672,9 +17993,6 @@
 static constexpr dart::compiler::target::word
     AOT_FfiTrampolineData_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Field_InstanceSize = 80;
-static constexpr dart::compiler::target::word AOT_Finalizer_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_FinalizerEntry_InstanceSize =
-    56;
 static constexpr dart::compiler::target::word AOT_Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Float64x2_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Function_InstanceSize = 80;
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 7f4c232..cbd470c 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -149,7 +149,6 @@
   FIELD(Int32x4, value_offset)                                                 \
   FIELD(Isolate, current_tag_offset)                                           \
   FIELD(Isolate, default_tag_offset)                                           \
-  FIELD(Isolate, finalizers_offset)                                            \
   FIELD(Isolate, ic_miss_code_offset)                                          \
   FIELD(IsolateGroup, object_store_offset)                                     \
   FIELD(IsolateGroup, shared_class_table_offset)                               \
@@ -301,17 +300,6 @@
   FIELD(Type, type_class_id_offset)                                            \
   FIELD(Type, type_state_offset)                                               \
   FIELD(Type, nullability_offset)                                              \
-  FIELD(Finalizer, type_arguments_offset)                                      \
-  FIELD(Finalizer, callback_offset)                                            \
-  FIELD(FinalizerBase, all_entries_offset)                                     \
-  FIELD(FinalizerBase, detachments_offset)                                     \
-  FIELD(FinalizerBase, entries_collected_offset)                               \
-  FIELD(FinalizerBase, isolate_offset)                                         \
-  FIELD(FinalizerEntry, value_offset)                                          \
-  FIELD(FinalizerEntry, detach_offset)                                         \
-  FIELD(FinalizerEntry, token_offset)                                          \
-  FIELD(FinalizerEntry, finalizer_offset)                                      \
-  FIELD(FinalizerEntry, next_offset)                                           \
   FIELD(FunctionType, hash_offset)                                             \
   FIELD(FunctionType, named_parameter_names_offset)                            \
   FIELD(FunctionType, nullability_offset)                                      \
@@ -374,8 +362,6 @@
   SIZEOF(ExternalTypedData, InstanceSize, UntaggedExternalTypedData)           \
   SIZEOF(FfiTrampolineData, InstanceSize, UntaggedFfiTrampolineData)           \
   SIZEOF(Field, InstanceSize, UntaggedField)                                   \
-  SIZEOF(Finalizer, InstanceSize, UntaggedFinalizer)                           \
-  SIZEOF(FinalizerEntry, InstanceSize, UntaggedFinalizerEntry)                 \
   SIZEOF(Float32x4, InstanceSize, UntaggedFloat32x4)                           \
   SIZEOF(Float64x2, InstanceSize, UntaggedFloat64x2)                           \
   SIZEOF(Function, InstanceSize, UntaggedFunction)                             \
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 9042281..b2fd4b3 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -370,7 +370,6 @@
     Object::InitNullAndBool(vm_isolate_->group());
     vm_isolate_->isolate_group_->set_object_store(new ObjectStore());
     vm_isolate_->isolate_object_store()->Init();
-    vm_isolate_->finalizers_ = GrowableObjectArray::null();
     Object::Init(vm_isolate_->group());
     OffsetsTable::Init();
     ArgumentsDescriptor::Init();
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 501568e..46df59f 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -677,14 +677,18 @@
 }
 
 ObjectPtr DartLibraryCalls::LookupHandler(Dart_Port port_id) {
-  Thread* const thread = Thread::Current();
-  Zone* const zone = thread->zone();
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
   const auto& function = Function::Handle(
       zone, thread->isolate_group()->object_store()->lookup_port_handler());
+  const int kNumArguments = 1;
   ASSERT(!function.IsNull());
   Array& args = Array::Handle(
       zone, thread->isolate()->isolate_object_store()->dart_args_1());
-  ASSERT(!args.IsNull());
+  if (args.IsNull()) {
+    args = Array::New(kNumArguments);
+    thread->isolate()->isolate_object_store()->set_dart_args_1(args);
+  }
   args.SetAt(0, Integer::Handle(zone, Integer::New(port_id)));
   const Object& result =
       Object::Handle(zone, DartEntry::InvokeFunction(function, args));
@@ -702,7 +706,24 @@
   return result.ptr();
 }
 
-static void DebuggerSetResumeIfStepping(Isolate* isolate) {
+ObjectPtr DartLibraryCalls::HandleMessage(Dart_Port port_id,
+                                          const Instance& message) {
+  auto thread = Thread::Current();
+  auto zone = thread->zone();
+  auto isolate = thread->isolate();
+  auto object_store = thread->isolate_group()->object_store();
+  const auto& function =
+      Function::Handle(zone, object_store->handle_message_function());
+  const int kNumArguments = 2;
+  ASSERT(!function.IsNull());
+  Array& args =
+      Array::Handle(zone, isolate->isolate_object_store()->dart_args_2());
+  if (args.IsNull()) {
+    args = Array::New(kNumArguments);
+    isolate->isolate_object_store()->set_dart_args_2(args);
+  }
+  args.SetAt(0, Integer::Handle(zone, Integer::New(port_id)));
+  args.SetAt(1, message);
 #if !defined(PRODUCT)
   if (isolate->debugger()->IsStepping()) {
     // If the isolate is being debugged and the debugger was stepping
@@ -711,47 +732,6 @@
     isolate->debugger()->SetResumeAction(Debugger::kStepInto);
   }
 #endif
-}
-
-ObjectPtr DartLibraryCalls::HandleMessage(Dart_Port port_id,
-                                          const Instance& message) {
-  auto* const thread = Thread::Current();
-  auto* const zone = thread->zone();
-  auto* const isolate = thread->isolate();
-  auto* const object_store = thread->isolate_group()->object_store();
-  const auto& function =
-      Function::Handle(zone, object_store->handle_message_function());
-  ASSERT(!function.IsNull());
-  Array& args =
-      Array::Handle(zone, isolate->isolate_object_store()->dart_args_2());
-  ASSERT(!args.IsNull());
-  args.SetAt(0, Integer::Handle(zone, Integer::New(port_id)));
-  args.SetAt(1, message);
-  DebuggerSetResumeIfStepping(isolate);
-  const Object& handler =
-      Object::Handle(zone, DartEntry::InvokeFunction(function, args));
-  return handler.ptr();
-}
-
-ObjectPtr DartLibraryCalls::HandleFinalizerMessage(
-    const FinalizerBase& finalizer) {
-  if (FLAG_trace_finalizers) {
-    THR_Print("Running finalizer %p callback on isolate %p\n",
-              finalizer.ptr()->untag(), finalizer.isolate());
-  }
-
-  auto* const thread = Thread::Current();
-  auto* const zone = thread->zone();
-  auto* const isolate = thread->isolate();
-  auto* const object_store = thread->isolate_group()->object_store();
-  const auto& function =
-      Function::Handle(zone, object_store->handle_finalizer_message_function());
-  ASSERT(!function.IsNull());
-  Array& args =
-      Array::Handle(zone, isolate->isolate_object_store()->dart_args_1());
-  ASSERT(!args.IsNull());
-  args.SetAt(0, finalizer);
-  DebuggerSetResumeIfStepping(isolate);
   const Object& handler =
       Object::Handle(zone, DartEntry::InvokeFunction(function, args));
   return handler.ptr();
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index c5cc2be..4f650a8 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -36,8 +36,8 @@
   intptr_t TypeArgsLen() const;  // 0 if no type argument vector is passed.
   intptr_t FirstArgIndex() const { return TypeArgsLen() > 0 ? 1 : 0; }
   intptr_t CountWithTypeArgs() const { return FirstArgIndex() + Count(); }
-  intptr_t Count() const;  // Excluding type arguments vector.
-  intptr_t Size() const;   // Excluding type arguments vector.
+  intptr_t Count() const;            // Excluding type arguments vector.
+  intptr_t Size() const;             // Excluding type arguments vector.
   intptr_t SizeWithTypeArgs() const { return FirstArgIndex() + Size(); }
   intptr_t PositionalCount() const;  // Excluding type arguments vector.
   intptr_t NamedCount() const { return Count() - PositionalCount(); }
@@ -292,12 +292,10 @@
   // handler for this port id.
   static ObjectPtr HandleMessage(Dart_Port port_id, const Instance& message);
 
-  // Invokes the finalizer to run its callbacks.
-  static ObjectPtr HandleFinalizerMessage(const FinalizerBase& finalizer);
-
   // Returns a list of open ReceivePorts.
   static ObjectPtr LookupOpenPorts();
 
+
   // Returns null on success, an ErrorPtr on failure.
   static ObjectPtr DrainMicrotaskQueue();
 
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 68b49e4..1e77f74 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -202,7 +202,6 @@
     "Generate code for a generic CPU, unknown at compile time")                \
   D(trace_cha, bool, false, "Trace CHA operations")                            \
   R(trace_field_guards, false, bool, false, "Trace changes in field's cids.")  \
-  D(trace_finalizers, bool, false, "Traces finalizers.")                       \
   D(trace_ic, bool, false, "Trace IC handling")                                \
   D(trace_ic_miss_in_optimized, bool, false,                                   \
     "Trace IC miss in optimized code")                                         \
diff --git a/runtime/vm/heap/gc_shared.cc b/runtime/vm/heap/gc_shared.cc
deleted file mode 100644
index 0941bd6..0000000
--- a/runtime/vm/heap/gc_shared.cc
+++ /dev/null
@@ -1,39 +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.
-
-// Logic shared between the Scavenger and Marker.
-
-#include "vm/heap/gc_shared.h"
-
-#include "vm/dart_api_state.h"
-#include "vm/heap/scavenger.h"
-#include "vm/log.h"
-#include "vm/message_handler.h"
-#include "vm/object.h"
-
-namespace dart {
-
-void GCLinkedLists::Clear() {
-#define FOREACH(type, var) var.Clear();
-  GC_LINKED_LIST(FOREACH)
-#undef FOREACH
-}
-
-bool GCLinkedLists::IsEmpty() {
-#define FOREACH(type, var)                                                     \
-  if (!var.IsEmpty()) {                                                        \
-    return false;                                                              \
-  }
-  GC_LINKED_LIST(FOREACH)
-  return true;
-#undef FOREACH
-}
-
-void GCLinkedLists::FlushInto(GCLinkedLists* to) {
-#define FOREACH(type, var) var.FlushInto(&to->var);
-  GC_LINKED_LIST(FOREACH)
-#undef FOREACH
-}
-
-}  // namespace dart
diff --git a/runtime/vm/heap/gc_shared.h b/runtime/vm/heap/gc_shared.h
deleted file mode 100644
index 3320868..0000000
--- a/runtime/vm/heap/gc_shared.h
+++ /dev/null
@@ -1,195 +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.
-
-// Logic shared between the Scavenger and Marker.
-
-#ifndef RUNTIME_VM_HEAP_GC_SHARED_H_
-#define RUNTIME_VM_HEAP_GC_SHARED_H_
-
-#include "vm/compiler/runtime_api.h"
-#if defined(SHOULD_NOT_INCLUDE_RUNTIME)
-#error "Should not include runtime"
-#endif
-
-#include "vm/dart_api_state.h"
-#include "vm/heap/scavenger.h"
-#include "vm/log.h"
-#include "vm/message_handler.h"
-#include "vm/object.h"
-
-namespace dart {
-
-// These object types have a linked list chaining all pending objects when
-// processing these in the GC.
-// The field should not be visited by pointer visitors.
-// The field should only be set during a GC.
-//
-// Macro params:
-// - type
-// - variable name
-#define GC_LINKED_LIST(V)                                                      \
-  V(WeakProperty, weak_properties)                                             \
-  V(WeakReference, weak_references)                                            \
-  V(FinalizerEntry, finalizer_entries)
-
-template <typename Type, typename PtrType>
-struct GCLinkedList {
- public:
-  void Enqueue(PtrType ptr) {
-    ptr->untag()->next_seen_by_gc_ = head;
-    if (head == Type::null()) {
-      tail = ptr;
-    }
-    head = ptr;
-  }
-
-  void FlushInto(GCLinkedList<Type, PtrType>* to) {
-    if (to->head == Type::null()) {
-      ASSERT(to->tail == Type::null());
-      to->head = head;
-      to->tail = tail;
-    } else {
-      ASSERT(to->tail != Type::null());
-      ASSERT(to->tail->untag()->next_seen_by_gc() == Type::null());
-      to->tail->untag()->next_seen_by_gc_ = head;
-      to->tail = tail;
-    }
-    Clear();
-  }
-
-  PtrType Clear() {
-    PtrType return_value = head;
-    head = Type::null();
-    tail = Type::null();
-    return return_value;
-  }
-
-  bool IsEmpty() { return head == Type::null() && tail == Type::null(); }
-
- private:
-  PtrType head = Type::null();
-  PtrType tail = Type::null();
-};
-
-struct GCLinkedLists {
- public:
-  void Clear();
-  bool IsEmpty();
-  void FlushInto(GCLinkedLists* to);
-
-#define FOREACH(type, var) GCLinkedList<type, type##Ptr> var;
-  GC_LINKED_LIST(FOREACH)
-#undef FOREACH
-};
-
-#ifdef DEBUG
-#define TRACE_FINALIZER(format, ...)                                           \
-  if (FLAG_trace_finalizers) {                                                 \
-    THR_Print("%s %p " format "\n", visitor->kName, visitor, __VA_ARGS__);     \
-  }
-#else
-#define TRACE_FINALIZER(format, ...)
-#endif
-
-// This function processes all finalizer entries discovered by a scavenger or
-// marker. If an entry is referencing an object that is going to die, such entry
-// is cleared and enqueued in the respective finalizer.
-//
-// Finalizer entries belonging to unreachable finalizer entries do not get
-// processed, so the callback will not be called for these finalizers.
-//
-// For more documentation see runtime/docs/gc.md.
-//
-// |GCVisitorType| is a concrete type implementing either marker or scavenger.
-// It is expected to provide |SetNullIfCollected| method for clearing fields
-// referring to dead objects and |kName| field which contains visitor name for
-// tracing output.
-template <typename GCVisitorType>
-void MournFinalized(GCVisitorType* visitor) {
-  FinalizerEntryPtr current_entry = visitor->delayed_.finalizer_entries.Clear();
-  while (current_entry != FinalizerEntry::null()) {
-    TRACE_FINALIZER("Processing Entry %p", current_entry->untag());
-    FinalizerEntryPtr next_entry =
-        current_entry->untag()->next_seen_by_gc_.Decompress(
-            current_entry->heap_base());
-    current_entry->untag()->next_seen_by_gc_ = FinalizerEntry::null();
-
-    uword heap_base = current_entry->heap_base();
-    const bool value_collected_this_gc = GCVisitorType::SetNullIfCollected(
-        heap_base, &current_entry->untag()->value_);
-    GCVisitorType::SetNullIfCollected(heap_base,
-                                      &current_entry->untag()->detach_);
-    GCVisitorType::SetNullIfCollected(heap_base,
-                                      &current_entry->untag()->finalizer_);
-
-    ObjectPtr token_object = current_entry->untag()->token();
-    // See sdk/lib/_internal/vm/lib/internal_patch.dart FinalizerBase.detach.
-    const bool is_detached = token_object == current_entry;
-
-    if (value_collected_this_gc && !is_detached) {
-      FinalizerBasePtr finalizer = current_entry->untag()->finalizer();
-
-      if (finalizer.IsRawNull()) {
-        TRACE_FINALIZER("Value collected entry %p finalizer null",
-                        current_entry->untag());
-
-        // Do nothing, the finalizer has been GCed.
-      } else if (finalizer.IsFinalizer()) {
-        TRACE_FINALIZER("Value collected entry %p finalizer %p",
-                        current_entry->untag(), finalizer->untag());
-
-        FinalizerPtr finalizer_dart = static_cast<FinalizerPtr>(finalizer);
-        // Move entry to entries collected and current head of that list as
-        // the next element. Using a atomic exchange satisfies concurrency
-        // between the parallel GC tasks.
-        // We rely on the fact that the mutator thread is not running to avoid
-        // races between GC and mutator modifying Finalizer.entries_collected.
-        //
-        // We only run in serial marker or in the finalize step in the marker,
-        // both are in safepoint.
-        // The main scavenger worker is at safepoint, the other scavenger
-        // workers are are not, but they bypass safepoint because the main
-        // worker is at a safepoint already.
-        ASSERT(Thread::Current()->IsAtSafepoint() ||
-               Thread::Current()->BypassSafepoints());
-
-        FinalizerEntryPtr previous_head =
-            finalizer_dart->untag()->exchange_entries_collected(current_entry);
-        current_entry->untag()->set_next(previous_head);
-        const bool first_entry = previous_head.IsRawNull();
-        // Schedule calling Dart finalizer.
-        if (first_entry) {
-          Isolate* isolate = finalizer->untag()->isolate_;
-          if (isolate == nullptr) {
-            TRACE_FINALIZER(
-                "Not scheduling finalizer %p callback on isolate null",
-                finalizer->untag());
-          } else {
-            TRACE_FINALIZER("Scheduling finalizer %p callback on isolate %p",
-                            finalizer->untag(), isolate);
-
-            PersistentHandle* handle =
-                isolate->group()->api_state()->AllocatePersistentHandle();
-            handle->set_ptr(finalizer);
-            MessageHandler* message_handler = isolate->message_handler();
-            message_handler->PostMessage(
-                Message::New(handle, Message::kNormalPriority),
-                /*before_events*/ false);
-          }
-        }
-      } else {
-        // TODO(http://dartbug.com/47777): Implement NativeFinalizer.
-        UNREACHABLE();
-      }
-    }
-
-    current_entry = next_entry;
-  }
-}
-
-#undef TRACE_FINALIZER
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_HEAP_GC_SHARED_H_
diff --git a/runtime/vm/heap/heap_sources.gni b/runtime/vm/heap/heap_sources.gni
index a8e8d99..de6d25e 100644
--- a/runtime/vm/heap/heap_sources.gni
+++ b/runtime/vm/heap/heap_sources.gni
@@ -11,8 +11,6 @@
   "compactor.h",
   "freelist.cc",
   "freelist.h",
-  "gc_shared.cc",
-  "gc_shared.h",
   "heap.cc",
   "heap.h",
   "marker.cc",
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index f760b67..3309815 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -4,12 +4,9 @@
 
 #include "vm/heap/marker.h"
 
-#include "platform/assert.h"
 #include "platform/atomic.h"
 #include "vm/allocation.h"
 #include "vm/dart_api_state.h"
-#include "vm/flags.h"
-#include "vm/heap/gc_shared.h"
 #include "vm/heap/pages.h"
 #include "vm/heap/pointer_block.h"
 #include "vm/isolate.h"
@@ -17,12 +14,10 @@
 #include "vm/object_id_ring.h"
 #include "vm/raw_object.h"
 #include "vm/stack_frame.h"
-#include "vm/tagged_pointer.h"
 #include "vm/thread_barrier.h"
 #include "vm/thread_pool.h"
 #include "vm/thread_registry.h"
 #include "vm/timeline.h"
-#include "vm/token.h"
 #include "vm/visitor.h"
 
 namespace dart {
@@ -39,35 +34,34 @@
         page_space_(page_space),
         work_list_(marking_stack),
         deferred_work_list_(deferred_marking_stack),
+        delayed_weak_properties_(WeakProperty::null()),
+        delayed_weak_properties_tail_(WeakProperty::null()),
+        delayed_weak_references_(WeakReference::null()),
+        delayed_weak_references_tail_(WeakReference::null()),
         marked_bytes_(0),
         marked_micros_(0) {
     ASSERT(thread_->isolate_group() == isolate_group);
   }
-  ~MarkingVisitorBase() { ASSERT(delayed_.IsEmpty()); }
-
-#ifdef DEBUG
-  const char* kName = "Marker";
-#endif
+  ~MarkingVisitorBase() {
+    ASSERT(delayed_weak_properties_ == WeakProperty::null());
+    ASSERT(delayed_weak_references_ == WeakReference::null());
+  }
 
   uintptr_t marked_bytes() const { return marked_bytes_; }
   int64_t marked_micros() const { return marked_micros_; }
   void AddMicros(int64_t micros) { marked_micros_ += micros; }
 
-  bool IsMarked(ObjectPtr raw) {
-    ASSERT(raw->IsHeapObject());
-    ASSERT(raw->IsOldObject());
-    return raw->untag()->IsMarked();
-  }
-
   bool ProcessPendingWeakProperties() {
     bool more_to_mark = false;
-    WeakPropertyPtr cur_weak = delayed_.weak_properties.Clear();
+    WeakPropertyPtr cur_weak = delayed_weak_properties_;
+    delayed_weak_properties_tail_ = delayed_weak_properties_ =
+        WeakProperty::null();
     while (cur_weak != WeakProperty::null()) {
       WeakPropertyPtr next_weak =
-          cur_weak->untag()->next_seen_by_gc_.Decompress(cur_weak->heap_base());
+          cur_weak->untag()->next_.Decompress(cur_weak->heap_base());
       ObjectPtr raw_key = cur_weak->untag()->key();
       // Reset the next pointer in the weak property.
-      cur_weak->untag()->next_seen_by_gc_ = WeakProperty::null();
+      cur_weak->untag()->next_ = WeakProperty::null();
       if (raw_key->IsSmiOrNewObject() || raw_key->untag()->IsMarked()) {
         ObjectPtr raw_val = cur_weak->untag()->value();
         if (!raw_val->IsSmiOrNewObject() && !raw_val->untag()->IsMarked()) {
@@ -79,8 +73,7 @@
         cur_weak->untag()->VisitPointersNonvirtual(this);
       } else {
         // Requeue this weak property to be handled later.
-        ASSERT(IsMarked(cur_weak));
-        delayed_.weak_properties.Enqueue(cur_weak);
+        EnqueueWeakProperty(cur_weak);
       }
       // Advance to next weak property in the queue.
       cur_weak = next_weak;
@@ -132,9 +125,6 @@
         } else if (class_id == kWeakReferenceCid) {
           WeakReferencePtr raw_weak = static_cast<WeakReferencePtr>(raw_obj);
           size = ProcessWeakReference(raw_weak);
-        } else if (class_id == kFinalizerEntryCid) {
-          FinalizerEntryPtr raw_weak = static_cast<FinalizerEntryPtr>(raw_obj);
-          size = ProcessFinalizerEntry(raw_weak);
         } else {
           size = raw_obj->untag()->VisitPointersNonvirtual(this);
         }
@@ -192,6 +182,34 @@
     }
   }
 
+  void EnqueueWeakProperty(WeakPropertyPtr raw_weak) {
+    ASSERT(raw_weak->IsHeapObject());
+    ASSERT(raw_weak->IsOldObject());
+    ASSERT(raw_weak->IsWeakProperty());
+    ASSERT(raw_weak->untag()->IsMarked());
+    ASSERT(raw_weak->untag()->next_ ==
+           CompressedWeakPropertyPtr(WeakProperty::null()));
+    raw_weak->untag()->next_ = delayed_weak_properties_;
+    if (delayed_weak_properties_ == WeakProperty::null()) {
+      delayed_weak_properties_tail_ = raw_weak;
+    }
+    delayed_weak_properties_ = raw_weak;
+  }
+
+  void EnqueueWeakReference(WeakReferencePtr raw_weak) {
+    ASSERT(raw_weak->IsHeapObject());
+    ASSERT(raw_weak->IsOldObject());
+    ASSERT(raw_weak->IsWeakReference());
+    ASSERT(raw_weak->untag()->IsMarked());
+    ASSERT(raw_weak->untag()->next_ ==
+           CompressedWeakReferencePtr(WeakReference::null()));
+    raw_weak->untag()->next_ = delayed_weak_references_;
+    if (delayed_weak_references_ == WeakReference::null()) {
+      delayed_weak_references_tail_ = raw_weak;
+    }
+    delayed_weak_references_ = raw_weak;
+  }
+
   intptr_t ProcessWeakProperty(WeakPropertyPtr raw_weak) {
     // The fate of the weak property is determined by its key.
     ObjectPtr raw_key =
@@ -200,8 +218,7 @@
     if (raw_key->IsHeapObject() && raw_key->IsOldObject() &&
         !raw_key->untag()->IsMarked()) {
       // Key was white. Enqueue the weak property.
-      ASSERT(IsMarked(raw_weak));
-      delayed_.weak_properties.Enqueue(raw_weak);
+      EnqueueWeakProperty(raw_weak);
       return raw_weak->untag()->HeapSize();
     }
     // Key is gray or black. Make the weak property black.
@@ -218,8 +235,7 @@
         !raw_target->untag()->IsMarked()) {
       // Target was white. Enqueue the weak reference. It is potentially dead.
       // It might still be made alive by weak properties in next rounds.
-      ASSERT(IsMarked(raw_weak));
-      delayed_.weak_references.Enqueue(raw_weak);
+      EnqueueWeakReference(raw_weak);
     }
     // Always visit the type argument.
     ObjectPtr raw_type_arguments =
@@ -229,17 +245,6 @@
     return raw_weak->untag()->HeapSize();
   }
 
-  intptr_t ProcessFinalizerEntry(FinalizerEntryPtr raw_entry) {
-    ASSERT(IsMarked(raw_entry));
-    delayed_.finalizer_entries.Enqueue(raw_entry);
-    // Only visit token and next.
-    MarkObject(LoadCompressedPointerIgnoreRace(&raw_entry->untag()->token_)
-                   .Decompress(raw_entry->heap_base()));
-    MarkObject(LoadCompressedPointerIgnoreRace(&raw_entry->untag()->next_)
-                   .Decompress(raw_entry->heap_base()));
-    return raw_entry->untag()->HeapSize();
-  }
-
   void ProcessDeferredMarking() {
     ObjectPtr raw_obj;
     while ((raw_obj = deferred_work_list_.Pop()) != nullptr) {
@@ -274,15 +279,15 @@
   void FinalizeMarking() {
     work_list_.Finalize();
     deferred_work_list_.Finalize();
-    MournFinalized(this);
   }
 
   void MournWeakProperties() {
-    WeakPropertyPtr cur_weak = delayed_.weak_properties.Clear();
+    WeakPropertyPtr cur_weak = delayed_weak_properties_;
+    delayed_weak_properties_ = WeakProperty::null();
     while (cur_weak != WeakProperty::null()) {
       WeakPropertyPtr next_weak =
-          cur_weak->untag()->next_seen_by_gc_.Decompress(cur_weak->heap_base());
-      cur_weak->untag()->next_seen_by_gc_ = WeakProperty::null();
+          cur_weak->untag()->next_.Decompress(cur_weak->heap_base());
+      cur_weak->untag()->next_ = WeakProperty::null();
       RELEASE_ASSERT(!cur_weak->untag()->key()->untag()->IsMarked());
       WeakProperty::Clear(cur_weak);
       cur_weak = next_weak;
@@ -290,58 +295,72 @@
   }
 
   void MournWeakReferences() {
-    WeakReferencePtr cur_weak = delayed_.weak_references.Clear();
+    WeakReferencePtr cur_weak = delayed_weak_references_;
+    delayed_weak_references_ = WeakReference::null();
     while (cur_weak != WeakReference::null()) {
       WeakReferencePtr next_weak =
-          cur_weak->untag()->next_seen_by_gc_.Decompress(cur_weak->heap_base());
-      cur_weak->untag()->next_seen_by_gc_ = WeakReference::null();
-
+          cur_weak->untag()->next_.Decompress(cur_weak->heap_base());
+      cur_weak->untag()->next_ = WeakReference::null();
       // If we did not mark the target through a weak property in a later round,
       // then the target is dead and we should clear it.
-      SetNullIfCollected(cur_weak->heap_base(), &cur_weak->untag()->target_);
-
+      if (!cur_weak->untag()->target()->untag()->IsMarked()) {
+        WeakReference::Clear(cur_weak);
+      }
       cur_weak = next_weak;
     }
   }
 
-  // Returns whether the object referred to in `ptr_address` was GCed this GC.
-  static bool SetNullIfCollected(uword heap_base,
-                                 CompressedObjectPtr* ptr_address) {
-    ObjectPtr raw = ptr_address->Decompress(heap_base);
-    if (raw.IsRawNull()) {
-      // Object already null before this GC.
-      return false;
-    }
-    if (raw.IsNewObject()) {
-      // Object not touched during this GC.
-      return false;
-    }
-    if (raw->untag()->IsMarked()) {
-      return false;
-    }
-    *ptr_address = Object::null();
-    return true;
-  }
-
   bool WaitForWork(RelaxedAtomic<uintptr_t>* num_busy) {
     return work_list_.WaitForWork(num_busy);
   }
 
-  void Flush(GCLinkedLists* global_list) {
+  void Flush(WeakPropertyPtr* weak_properties_head,
+             WeakPropertyPtr* weak_properties_tail,
+             WeakReferencePtr* weak_references_head,
+             WeakReferencePtr* weak_references_tail) {
     work_list_.Flush();
     deferred_work_list_.Flush();
-    delayed_.FlushInto(global_list);
+
+    if (*weak_properties_head == WeakProperty::null()) {
+      *weak_properties_head = delayed_weak_properties_;
+      *weak_properties_tail = delayed_weak_properties_tail_;
+    } else {
+      (*weak_properties_tail)->untag()->next_ = delayed_weak_properties_;
+      *weak_properties_tail = delayed_weak_properties_tail_;
+    }
+    delayed_weak_properties_tail_ = delayed_weak_properties_ =
+        WeakProperty::null();
+
+    if (*weak_references_head == WeakReference::null()) {
+      *weak_references_head = delayed_weak_references_;
+      *weak_references_tail = delayed_weak_references_tail_;
+    } else {
+      (*weak_references_tail)->untag()->next_ = delayed_weak_references_;
+      *weak_references_tail = delayed_weak_references_tail_;
+    }
+    delayed_weak_references_tail_ = delayed_weak_references_ =
+        WeakReference::null();
   }
 
-  void Adopt(GCLinkedLists* other) {
-    ASSERT(delayed_.IsEmpty());
-    other->FlushInto(&delayed_);
+  void Adopt(WeakPropertyPtr weak_properties_head,
+             WeakPropertyPtr weak_properties_tail,
+             WeakReferencePtr weak_references_head,
+             WeakReferencePtr weak_references_tail) {
+    ASSERT(delayed_weak_properties_ == WeakProperty::null());
+    ASSERT(delayed_weak_properties_tail_ == WeakProperty::null());
+    ASSERT(delayed_weak_references_ == WeakReference::null());
+    ASSERT(delayed_weak_references_tail_ == WeakReference::null());
+    delayed_weak_properties_ = weak_properties_head;
+    delayed_weak_properties_tail_ = weak_properties_tail;
+    delayed_weak_references_ = weak_references_head;
+    delayed_weak_references_tail_ = weak_references_tail;
   }
 
   void AbandonWork() {
     work_list_.AbandonWork();
     deferred_work_list_.AbandonWork();
-    delayed_.Clear();
+    delayed_weak_properties_ = WeakProperty::null();
+    delayed_weak_references_ = WeakReference::null();
   }
 
  private:
@@ -411,13 +430,13 @@
   PageSpace* page_space_;
   MarkerWorkList work_list_;
   MarkerWorkList deferred_work_list_;
-  GCLinkedLists delayed_;
+  WeakPropertyPtr delayed_weak_properties_;
+  WeakPropertyPtr delayed_weak_properties_tail_;
+  WeakReferencePtr delayed_weak_references_;
+  WeakReferencePtr delayed_weak_references_tail_;
   uintptr_t marked_bytes_;
   int64_t marked_micros_;
 
-  template <typename GCVisitorType>
-  friend void MournFinalized(GCVisitorType* visitor);
-
   DISALLOW_IMPLICIT_CONSTRUCTORS(MarkingVisitorBase);
 };
 
@@ -727,9 +746,6 @@
       // Phase 3: Weak processing and statistics.
       visitor_->MournWeakProperties();
       visitor_->MournWeakReferences();
-      // Don't MournFinalized here, do it on main thread, so that we don't have
-      // to coordinate workers.
-
       marker_->IterateWeakRoots(thread);
       int64_t stop = OS::GetCurrentMonotonicMicros();
       visitor_->AddMicros(stop - start);
@@ -968,7 +984,6 @@
       visitor.FinalizeMarking();
       visitor.MournWeakProperties();
       visitor.MournWeakReferences();
-      MournFinalized(&visitor);
       IterateWeakRoots(thread);
       // All marking done; detach code, etc.
       int64_t stop = OS::GetCurrentMonotonicMicros();
@@ -983,7 +998,10 @@
       RelaxedAtomic<uintptr_t> num_busy = 0;
       // Phase 1: Iterate over roots and drain marking stack in tasks.
 
-      GCLinkedLists global_list;
+      WeakPropertyPtr weak_properties_head = WeakProperty::null();
+      WeakPropertyPtr weak_properties_tail = WeakProperty::null();
+      WeakReferencePtr weak_references_head = WeakReference::null();
+      WeakReferencePtr weak_references_tail = WeakReference::null();
 
       for (intptr_t i = 0; i < num_tasks; ++i) {
         SyncMarkingVisitor* visitor = visitors_[i];
@@ -995,12 +1013,12 @@
                                      &marking_stack_, &deferred_marking_stack_);
           visitors_[i] = visitor;
         }
-
         // Move all work from local blocks to the global list. Any given
         // visitor might not get to run if it fails to reach TryEnter soon
         // enough, and we must fail to visit objects but they're sitting in
         // such a visitor's local blocks.
-        visitor->Flush(&global_list);
+        visitor->Flush(&weak_properties_head, &weak_properties_tail,
+                       &weak_references_head, &weak_references_tail);
         // Need to move weak property list too.
 
         if (i < (num_tasks - 1)) {
@@ -1011,7 +1029,8 @@
           ASSERT(result);
         } else {
           // Last worker is the main thread.
-          visitor->Adopt(&global_list);
+          visitor->Adopt(weak_properties_head, weak_properties_tail,
+                         weak_references_head, weak_references_tail);
           ParallelMarkTask task(this, isolate_group_, &marking_stack_, barrier,
                                 visitor, &num_busy);
           task.RunEnteredIsolateGroup();
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index e7dcfc1..e8b433a 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -4,14 +4,11 @@
 
 #include "vm/heap/scavenger.h"
 
-#include "platform/assert.h"
 #include "platform/leak_sanitizer.h"
-#include "vm/class_id.h"
 #include "vm/dart.h"
 #include "vm/dart_api_state.h"
 #include "vm/flag_list.h"
 #include "vm/heap/become.h"
-#include "vm/heap/gc_shared.h"
 #include "vm/heap/pages.h"
 #include "vm/heap/pointer_block.h"
 #include "vm/heap/safepoint.h"
@@ -23,7 +20,6 @@
 #include "vm/object.h"
 #include "vm/object_id_ring.h"
 #include "vm/object_set.h"
-#include "vm/port.h"
 #include "vm/stack_frame.h"
 #include "vm/thread_barrier.h"
 #include "vm/thread_registry.h"
@@ -135,12 +131,13 @@
         freelist_(freelist),
         bytes_promoted_(0),
         visiting_old_object_(nullptr),
-        promoted_list_(promotion_stack) {}
-  ~ScavengerVisitorBase() { ASSERT(delayed_.IsEmpty()); }
-
-#ifdef DEBUG
-  const char* kName = "Scavenger";
-#endif
+        promoted_list_(promotion_stack),
+        delayed_weak_properties_(WeakProperty::null()),
+        delayed_weak_references_(WeakReference::null()) {}
+  ~ScavengerVisitorBase() {
+    ASSERT(delayed_weak_properties_ == WeakProperty::null());
+    ASSERT(delayed_weak_references_ == WeakReference::null());
+  }
 
   virtual void VisitTypedDataViewPointers(TypedDataViewPtr view,
                                           CompressedObjectPtr* first,
@@ -302,7 +299,6 @@
 
       MournWeakProperties();
       MournOrUpdateWeakReferences();
-      MournFinalized(this);
     }
     page_space_->ReleaseLock(freelist_);
     thread_ = nullptr;
@@ -312,15 +308,13 @@
 
   void AbandonWork() {
     promoted_list_.AbandonWork();
-    delayed_.Clear();
+    delayed_weak_properties_ = WeakProperty::null();
+    delayed_weak_references_ = WeakReference::null();
   }
 
   NewPage* head() const { return head_; }
   NewPage* tail() const { return tail_; }
 
-  static bool SetNullIfCollected(uword heap_base,
-                                 CompressedObjectPtr* ptr_address);
-
  private:
   void UpdateStoreBuffer(ObjectPtr obj) {
     ASSERT(obj->IsHeapObject());
@@ -517,13 +511,8 @@
   inline void ProcessToSpace();
   DART_FORCE_INLINE intptr_t ProcessCopied(ObjectPtr raw_obj);
   inline void ProcessPromotedList();
-
-  bool IsNotForwarding(ObjectPtr raw) {
-    ASSERT(raw->IsHeapObject());
-    ASSERT(raw->IsNewObject());
-    return !IsForwarding(ReadHeaderRelaxed(raw));
-  }
-
+  inline void EnqueueWeakProperty(WeakPropertyPtr raw_weak);
+  inline void EnqueueWeakReference(WeakReferencePtr raw_weak);
   inline void MournWeakProperties();
   inline void MournOrUpdateWeakReferences();
 
@@ -534,16 +523,15 @@
   FreeList* freelist_;
   intptr_t bytes_promoted_;
   ObjectPtr visiting_old_object_;
+
   PromotionWorkList promoted_list_;
-  GCLinkedLists delayed_;
+  WeakPropertyPtr delayed_weak_properties_;
+  WeakReferencePtr delayed_weak_references_;
 
   NewPage* head_ = nullptr;
   NewPage* tail_ = nullptr;  // Allocating from here.
   NewPage* scan_ = nullptr;  // Resolving from here.
 
-  template <typename GCVisitorType>
-  friend void MournFinalized(GCVisitorType* visitor);
-
   DISALLOW_COPY_AND_ASSIGN(ScavengerVisitorBase);
 };
 
@@ -1335,10 +1323,11 @@
   // Finished this round of scavenging. Process the pending weak properties
   // for which the keys have become reachable. Potentially this adds more
   // objects to the to space.
-  WeakPropertyPtr cur_weak = delayed_.weak_properties.Clear();
+  WeakPropertyPtr cur_weak = delayed_weak_properties_;
+  delayed_weak_properties_ = WeakProperty::null();
   while (cur_weak != WeakProperty::null()) {
     WeakPropertyPtr next_weak =
-        cur_weak->untag()->next_seen_by_gc_.Decompress(cur_weak->heap_base());
+        cur_weak->untag()->next_.Decompress(cur_weak->heap_base());
     // Promoted weak properties are not enqueued. So we can guarantee that
     // we do not need to think about store barriers here.
     ASSERT(cur_weak->IsNewObject());
@@ -1352,12 +1341,11 @@
     ASSERT(from_->Contains(raw_addr));
     uword header = ReadHeaderRelaxed(raw_key);
     // Reset the next pointer in the weak property.
-    cur_weak->untag()->next_seen_by_gc_ = WeakProperty::null();
+    cur_weak->untag()->next_ = WeakProperty::null();
     if (IsForwarding(header)) {
       cur_weak->untag()->VisitPointersNonvirtual(this);
     } else {
-      ASSERT(IsNotForwarding(cur_weak));
-      delayed_.weak_properties.Enqueue(cur_weak);
+      EnqueueWeakProperty(cur_weak);
     }
     // Advance to next weak property in the queue.
     cur_weak = next_weak;
@@ -1390,6 +1378,38 @@
 }
 
 template <bool parallel>
+void ScavengerVisitorBase<parallel>::EnqueueWeakProperty(
+    WeakPropertyPtr raw_weak) {
+  ASSERT(raw_weak->IsHeapObject());
+  ASSERT(raw_weak->IsNewObject());
+  ASSERT(raw_weak->IsWeakProperty());
+#if defined(DEBUG)
+  uword header = ReadHeaderRelaxed(raw_weak);
+  ASSERT(!IsForwarding(header));
+#endif  // defined(DEBUG)
+  ASSERT(raw_weak->untag()->next_ ==
+         CompressedWeakPropertyPtr(WeakProperty::null()));
+  raw_weak->untag()->next_ = delayed_weak_properties_;
+  delayed_weak_properties_ = raw_weak;
+}
+
+template <bool parallel>
+void ScavengerVisitorBase<parallel>::EnqueueWeakReference(
+    WeakReferencePtr raw_weak) {
+  ASSERT(raw_weak->IsHeapObject());
+  ASSERT(raw_weak->IsNewObject());
+  ASSERT(raw_weak->IsWeakReference());
+#if defined(DEBUG)
+  uword header = ReadHeaderRelaxed(raw_weak);
+  ASSERT(!IsForwarding(header));
+#endif  // defined(DEBUG)
+  ASSERT(raw_weak->untag()->next_ ==
+         CompressedWeakReferencePtr(WeakReference::null()));
+  raw_weak->untag()->next_ = delayed_weak_references_;
+  delayed_weak_references_ = raw_weak;
+}
+
+template <bool parallel>
 intptr_t ScavengerVisitorBase<parallel>::ProcessCopied(ObjectPtr raw_obj) {
   intptr_t class_id = raw_obj->GetClassId();
   if (UNLIKELY(class_id == kWeakPropertyCid)) {
@@ -1400,8 +1420,7 @@
       uword header = ReadHeaderRelaxed(raw_key);
       if (!IsForwarding(header)) {
         // Key is white.  Enqueue the weak property.
-        ASSERT(IsNotForwarding(raw_weak));
-        delayed_.weak_properties.Enqueue(raw_weak);
+        EnqueueWeakProperty(raw_weak);
         return raw_weak->untag()->HeapSize();
       }
     }
@@ -1415,8 +1434,7 @@
       if (!IsForwarding(header)) {
         // Target is white. Enqueue the weak reference. Always visit type
         // arguments.
-        ASSERT(IsNotForwarding(raw_weak));
-        delayed_.weak_references.Enqueue(raw_weak);
+        EnqueueWeakReference(raw_weak);
 #if !defined(DART_COMPRESSED_POINTERS)
         ScavengePointer(&raw_weak->untag()->type_arguments_);
 #else
@@ -1426,21 +1444,6 @@
         return raw_weak->untag()->HeapSize();
       }
     }
-  } else if (UNLIKELY(class_id == kFinalizerEntryCid)) {
-    FinalizerEntryPtr raw_entry = static_cast<FinalizerEntryPtr>(raw_obj);
-    ASSERT(IsNotForwarding(raw_entry));
-    delayed_.finalizer_entries.Enqueue(raw_entry);
-    // Only visit token and next.
-#if !defined(DART_COMPRESSED_POINTERS)
-    ScavengePointer(&raw_entry->untag()->token_);
-    ScavengePointer(&raw_entry->untag()->next_);
-#else
-    ScavengeCompressedPointer(raw_entry->heap_base(),
-                              &raw_entry->untag()->token_);
-    ScavengeCompressedPointer(raw_entry->heap_base(),
-                              &raw_entry->untag()->next_);
-#endif
-    return raw_entry->untag()->HeapSize();
   }
   return raw_obj->untag()->VisitPointersNonvirtual(this);
 }
@@ -1504,12 +1507,13 @@
 
   // The queued weak properties at this point do not refer to reachable keys,
   // so we clear their key and value fields.
-  WeakPropertyPtr cur_weak = delayed_.weak_properties.Clear();
+  WeakPropertyPtr cur_weak = delayed_weak_properties_;
+  delayed_weak_properties_ = WeakProperty::null();
   while (cur_weak != WeakProperty::null()) {
     WeakPropertyPtr next_weak =
-        cur_weak->untag()->next_seen_by_gc_.Decompress(cur_weak->heap_base());
+        cur_weak->untag()->next_.Decompress(cur_weak->heap_base());
     // Reset the next pointer in the weak property.
-    cur_weak->untag()->next_seen_by_gc_ = WeakProperty::null();
+    cur_weak->untag()->next_ = WeakProperty::null();
 
 #if defined(DEBUG)
     ObjectPtr raw_key = cur_weak->untag()->key();
@@ -1533,48 +1537,31 @@
 
   // The queued weak references at this point either should have their target
   // updated or should be cleared.
-  WeakReferencePtr cur_weak = delayed_.weak_references.Clear();
+  WeakReferencePtr cur_weak = delayed_weak_references_;
+  delayed_weak_references_ = WeakReference::null();
   while (cur_weak != WeakReference::null()) {
     WeakReferencePtr next_weak =
-        cur_weak->untag()->next_seen_by_gc_.Decompress(cur_weak->heap_base());
+        cur_weak->untag()->next_.Decompress(cur_weak->heap_base());
     // Reset the next pointer in the weak reference.
-    cur_weak->untag()->next_seen_by_gc_ = WeakReference::null();
+    cur_weak->untag()->next_ = WeakReference::null();
 
-    // If we did not mark the target through a weak property in a later round,
-    // then the target is dead and we should clear it.
-    SetNullIfCollected(cur_weak->heap_base(), &cur_weak->untag()->target_);
+    ObjectPtr raw_target = cur_weak->untag()->target();
+    uword raw_addr = UntaggedObject::ToAddr(raw_target);
+    uword header = *reinterpret_cast<uword*>(raw_addr);
+    if (IsForwarding(header)) {
+      // Get the new location of the object.
+      cur_weak->untag()->target_ = ForwardedObj(header);
+    } else {
+      ASSERT(raw_target->IsHeapObject());
+      ASSERT(raw_target->IsNewObject());
+      WeakReference::Clear(cur_weak);
+    }
 
     // Advance to next weak reference in the queue.
     cur_weak = next_weak;
   }
 }
 
-// Returns whether the object referred to in `ptr_address` was GCed this GC.
-template <bool parallel>
-bool ScavengerVisitorBase<parallel>::SetNullIfCollected(
-    uword heap_base,
-    CompressedObjectPtr* ptr_address) {
-  ObjectPtr raw = ptr_address->Decompress(heap_base);
-  if (raw.IsRawNull()) {
-    // Object already null before this GC.
-    return false;
-  }
-  if (raw.IsOldObject()) {
-    // Object not touched during this GC.
-    return false;
-  }
-  uword header = *reinterpret_cast<uword*>(UntaggedObject::ToAddr(raw));
-  if (IsForwarding(header)) {
-    // Get the new location of the object.
-    *ptr_address = ForwardedObj(header);
-    return false;
-  }
-  ASSERT(raw->IsHeapObject());
-  ASSERT(raw->IsNewObject());
-  *ptr_address = Object::null();
-  return true;
-}
-
 void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
   ASSERT(Thread::Current()->IsAtSafepoint() ||
          (Thread::Current()->task_kind() == Thread::kMarkerTask) ||
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 1190825..2f8c8cc 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1388,15 +1388,6 @@
         }
       }
     }
-  } else if (message->IsFinalizerInvocationRequest()) {
-    const Object& msg_handler = Object::Handle(
-        zone,
-        DartLibraryCalls::HandleFinalizerMessage(FinalizerBase::Cast(msg)));
-    if (msg_handler.IsError()) {
-      status = ProcessUnhandledException(Error::Cast(msg_handler));
-    } else {
-      // The handler closure which was used to successfully handle the message.
-    }
   } else if (message->dest_port() == Message::kIllegalPort) {
     // Check whether this is a delayed OOB message which needed handling as
     // part of the regular message dispatch. All other messages are dropped on
@@ -1695,7 +1686,6 @@
       default_tag_(UserTag::null()),
       ic_miss_code_(Code::null()),
       field_table_(new FieldTable(/*isolate=*/this)),
-      finalizers_(GrowableObjectArray::null()),
       isolate_group_(isolate_group),
       isolate_object_store_(new IsolateObjectStore()),
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -2475,34 +2465,6 @@
     }
   }
 
-  // Set live finalizers isolate to null, before deleting the message handler.
-  // TODO(http://dartbug.com/47777): How to detect if the isolate field was ever
-  // initialized beyond RAW_NULL?
-  const auto& finalizers =
-      GrowableObjectArray::Handle(stack_zone.GetZone(), finalizers_);
-  if (!finalizers.IsNull()) {
-    const intptr_t num_finalizers = finalizers.Length();
-    auto& weak_reference = WeakReference::Handle(stack_zone.GetZone());
-    auto& finalizer = FinalizerBase::Handle(stack_zone.GetZone());
-    for (int i = 0; i < num_finalizers; i++) {
-      weak_reference ^= finalizers.At(i);
-      finalizer ^= weak_reference.target();
-      if (!finalizer.IsNull()) {
-        if (finalizer.isolate() == this) {
-          if (FLAG_trace_finalizers) {
-            THR_Print("Isolate %p Setting finalizer %p isolate to null\n", this,
-                      finalizer.ptr()->untag());
-          }
-          // Finalizer was not sent to another isolate with send and exit.
-          finalizer.set_isolate(nullptr);
-        } else {
-          // TODO(http://dartbug.com/47777): Send and exit support.
-          UNREACHABLE();
-        }
-      }
-    }
-  }
-
   // Close all the ports owned by this isolate.
   PortMap::ClosePorts(message_handler());
 
@@ -2609,6 +2571,7 @@
           "--check-reloaded is enabled.\n");
     }
   }
+
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
   // Then, proceed with low-level teardown.
@@ -2758,7 +2721,6 @@
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&ic_miss_code_));
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&tag_table_));
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&sticky_error_));
-  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&finalizers_));
 #if !defined(PRODUCT)
   visitor->VisitPointer(
       reinterpret_cast<ObjectPtr*>(&pending_service_extension_calls_));
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index bd1e9fb..e714838 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -1065,10 +1065,6 @@
   void set_init_callback_data(void* value) { init_callback_data_ = value; }
   void* init_callback_data() const { return init_callback_data_; }
 
-  static intptr_t finalizers_offset() {
-    return OFFSET_OF(Isolate, finalizers_);
-  }
-
 #if !defined(DART_PRECOMPILED_RUNTIME)
   NativeCallbackTrampolines* native_callback_trampolines() {
     return &native_callback_trampolines_;
@@ -1544,9 +1540,6 @@
   UserTagPtr default_tag_;
   CodePtr ic_miss_code_;
   FieldTable* field_table_ = nullptr;
-  // Used to clear out `UntaggedFinalizerBase::isolate_` pointers on isolate
-  // shutdown to prevent usage of dangling pointers.
-  GrowableObjectArrayPtr finalizers_;
   bool single_step_ = false;
   bool is_system_isolate_ = false;
   // End accessed from generated code.
@@ -1658,7 +1651,7 @@
   Dart_EnvironmentCallback environment_callback_ = nullptr;
   Random random_;
   Simulator* simulator_ = nullptr;
-  Mutex mutex_;  // Protects compiler stats.
+  Mutex mutex_;                            // Protects compiler stats.
   MessageHandler* message_handler_ = nullptr;
   intptr_t defer_finalization_count_ = 0;
   DeoptContext* deopt_context_ = nullptr;
@@ -1734,7 +1727,7 @@
   friend class ServiceIsolate;
   friend class Thread;
   friend class Timeline;
-  friend class IsolateGroup;  // reload_context_
+  friend class IsolateGroup;   // reload_context_
 
   DISALLOW_COPY_AND_ASSIGN(Isolate);
 };
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index f5e8986..0b1eb10 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1300,8 +1300,7 @@
     }
     if (!Api::IsFfiEnabled() &&
         target_library.url() == Symbols::DartFfi().ptr() &&
-        library->url() != Symbols::DartCore().ptr() &&
-        library->url() != Symbols::DartInternal().ptr()) {
+        library->url() != Symbols::DartCore().ptr()) {
       H.ReportError(
           "import of dart:ffi is not supported in the current Dart runtime");
     }
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index d9d0680..0f2d2e4 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -45,20 +45,12 @@
   ASSERT(IsPersistentHandle());
 }
 
-Message::Message(PersistentHandle* handle, Priority priority)
-    : dest_port_(ILLEGAL_PORT),
-      payload_(handle),
-      snapshot_length_(kFinalizerSnapshotLen),
-      priority_(priority) {
-  ASSERT(IsFinalizerInvocationRequest());
-}
-
 Message::~Message() {
   if (IsSnapshot()) {
     free(payload_.snapshot_);
   }
   delete finalizable_data_;
-  if (IsPersistentHandle() || IsFinalizerInvocationRequest()) {
+  if (IsPersistentHandle()) {
     auto isolate_group = IsolateGroup::Current();
     isolate_group->api_state()->FreePersistentHandle(
         payload_.persistent_handle_);
diff --git a/runtime/vm/message.h b/runtime/vm/message.h
index 46064a9..4c82bdf 100644
--- a/runtime/vm/message.h
+++ b/runtime/vm/message.h
@@ -62,13 +62,8 @@
   // the VM heap. This is indicated by setting the len_ field to 0.
   Message(Dart_Port dest_port, ObjectPtr raw_obj, Priority priority);
 
-  // A message sent from SendPort.send or SendPort.sendAndExit where sender and
-  // receiver are in the same isolate group.
   Message(Dart_Port dest_port, PersistentHandle* handle, Priority priority);
 
-  // A message sent from GC to run a finalizer.
-  Message(PersistentHandle* handle, Priority priority);
-
   ~Message();
 
   template <typename... Args>
@@ -99,7 +94,7 @@
     return payload_.raw_obj_;
   }
   PersistentHandle* persistent_handle() const {
-    ASSERT(IsPersistentHandle() || IsFinalizerInvocationRequest());
+    ASSERT(IsPersistentHandle());
     return payload_.persistent_handle_;
   }
   Priority priority() const { return priority_; }
@@ -108,9 +103,7 @@
   // of at the top of the message loop. Control messages from dart:isolate or
   // vm-service requests.
   bool IsOOB() const { return priority_ == Message::kOOBPriority; }
-  bool IsSnapshot() const {
-    return !IsRaw() && !IsPersistentHandle() && !IsFinalizerInvocationRequest();
-  }
+  bool IsSnapshot() const { return !IsRaw() && !IsPersistentHandle(); }
   // A message whose object is an immortal object from the vm-isolate's heap.
   bool IsRaw() const { return snapshot_length_ == 0; }
   // A message sent from SendPort.send or SendPort.sendAndExit where sender and
@@ -118,10 +111,6 @@
   bool IsPersistentHandle() const {
     return snapshot_length_ == kPersistentHandleSnapshotLen;
   }
-  // A message sent from GC to run a finalizer.
-  bool IsFinalizerInvocationRequest() const {
-    return snapshot_length_ == kFinalizerSnapshotLen;
-  }
 
   void DropFinalizers() {
     if (finalizable_data_ != nullptr) {
@@ -135,7 +124,6 @@
 
  private:
   static intptr_t const kPersistentHandleSnapshotLen = -1;
-  static intptr_t const kFinalizerSnapshotLen = -2;
 
   friend class MessageQueue;
 
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 228c745..715641b 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -211,8 +211,6 @@
   Thread* thread() const { return Thread::Current(); }
 
  private:
-  template <typename GCVisitorType>
-  friend void MournFinalized(GCVisitorType* visitor);
   friend class PortMap;
   friend class MessageHandlerTestPeer;
   friend class MessageHandlerTask;
diff --git a/runtime/vm/message_snapshot.cc b/runtime/vm/message_snapshot.cc
index a5e5d7a..22de126 100644
--- a/runtime/vm/message_snapshot.cc
+++ b/runtime/vm/message_snapshot.cc
@@ -3916,11 +3916,6 @@
 ObjectPtr ReadMessage(Thread* thread, Message* message) {
   if (message->IsRaw()) {
     return message->raw_obj();
-  } else if (message->IsFinalizerInvocationRequest()) {
-    PersistentHandle* handle = message->persistent_handle();
-    Object& msg_obj = Object::Handle(thread->zone(), handle->ptr());
-    ASSERT(msg_obj.IsFinalizer());
-    return msg_obj.ptr();
   } else if (message->IsPersistentHandle()) {
     return ReadObjectGraphCopyMessage(thread, message->persistent_handle());
   } else {
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 6a96faf..fe33347 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -118,7 +118,7 @@
 
 cpp_vtable Object::builtin_vtables_[kNumPredefinedCids] = {};
 
-// These are initialized to a value that will force an illegal memory access if
+// These are initialized to a value that will force a illegal memory access if
 // they are being used.
 #if defined(RAW_NULL)
 #error RAW_NULL should not be defined.
@@ -2341,14 +2341,6 @@
     pending_classes.Add(cls);
     RegisterClass(cls, Symbols::FfiDynamicLibrary(), lib);
 
-    cls = Class::New<Finalizer, RTN::Finalizer>(isolate_group);
-    cls.set_type_arguments_field_offset(
-        Finalizer::type_arguments_offset(),
-        RTN::Finalizer::type_arguments_offset());
-    cls.set_num_type_arguments_unsafe(1);
-    object_store->set_finalizer_class(cls);
-    RegisterPrivateClass(cls, Symbols::_FinalizerImpl(), core_lib);
-
     // Pre-register the internal library so we can place the vm class
     // FinalizerEntry there rather than the core library.
     lib = Library::LookupLibrary(thread, Symbols::DartInternal());
@@ -2361,10 +2353,6 @@
     ASSERT(!lib.IsNull());
     ASSERT(lib.ptr() == Library::InternalLibrary());
 
-    cls = Class::New<FinalizerEntry, RTN::FinalizerEntry>(isolate_group);
-    object_store->set_finalizer_entry_class(cls);
-    RegisterClass(cls, Symbols::FinalizerEntry(), lib);
-
     // Finish the initialization by compiling the bootstrap scripts containing
     // the base interfaces and the implementation of the internal classes.
     const Error& error = Error::Handle(
@@ -2532,10 +2520,6 @@
     object_store->set_weak_property_class(cls);
     cls = Class::New<WeakReference, RTN::WeakReference>(isolate_group);
     object_store->set_weak_reference_class(cls);
-    cls = Class::New<Finalizer, RTN::Finalizer>(isolate_group);
-    object_store->set_finalizer_class(cls);
-    cls = Class::New<FinalizerEntry, RTN::FinalizerEntry>(isolate_group);
-    object_store->set_finalizer_entry_class(cls);
 
     cls = Class::New<MirrorReference, RTN::MirrorReference>(isolate_group);
     cls = Class::New<UserTag, RTN::UserTag>(isolate_group);
@@ -26021,50 +26005,14 @@
                        space, WeakReference::ContainsCompressedPointers());
   return static_cast<WeakReferencePtr>(raw);
 }
+
 const char* WeakReference::ToCString() const {
   TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments());
   String& type_args_name = String::Handle(type_args.UserVisibleName());
-  return OS::SCreate(Thread::Current()->zone(), "_WeakReference%s",
+  return OS::SCreate(Thread::Current()->zone(), "WeakReference%s",
                      type_args_name.ToCString());
 }
 
-const char* FinalizerBase::ToCString() const {
-  return "FinalizerBase";
-}
-
-FinalizerPtr Finalizer::New(Heap::Space space) {
-  ASSERT(IsolateGroup::Current()->object_store()->finalizer_class() !=
-         Class::null());
-  ObjectPtr raw =
-      Object::Allocate(Finalizer::kClassId, Finalizer::InstanceSize(), space,
-                       Finalizer::ContainsCompressedPointers());
-  return static_cast<FinalizerPtr>(raw);
-}
-
-const char* Finalizer::ToCString() const {
-  TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments());
-  String& type_args_name = String::Handle(type_args.UserVisibleName());
-  return OS::SCreate(Thread::Current()->zone(), "_FinalizerImpl%s",
-                     type_args_name.ToCString());
-}
-
-FinalizerEntryPtr FinalizerEntry::New(Heap::Space space) {
-  ASSERT(IsolateGroup::Current()->object_store()->finalizer_entry_class() !=
-         Class::null());
-  ObjectPtr raw =
-      Object::Allocate(FinalizerEntry::kClassId, FinalizerEntry::InstanceSize(),
-                       space, FinalizerEntry::ContainsCompressedPointers());
-  return static_cast<FinalizerEntryPtr>(raw);
-}
-
-void FinalizerEntry::set_finalizer(const FinalizerBase& value) const {
-  untag()->set_finalizer(value.ptr());
-}
-
-const char* FinalizerEntry::ToCString() const {
-  return "FinalizerEntry";
-}
-
 AbstractTypePtr MirrorReference::GetAbstractTypeReferent() const {
   ASSERT(Object::Handle(referent()).IsAbstractType());
   return AbstractType::Cast(Object::Handle(referent())).ptr();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index cb4eb7d..668b201 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -3177,29 +3177,7 @@
   bool ForceOptimize() const {
     return IsFfiFromAddress() || IsFfiGetAddress() || IsFfiLoad() ||
            IsFfiStore() || IsFfiTrampoline() || IsFfiAsExternalTypedData() ||
-           IsTypedDataViewFactory() || IsUtf8Scan() || IsGetNativeField() ||
-           IsFinalizerForceOptimized();
-  }
-
-  bool IsFinalizerForceOptimized() const {
-    // Either because of unboxed/untagged data, or because we don't want the GC
-    // to trigger in between.
-    switch (recognized_kind()) {
-      case MethodRecognizer::kFinalizerBase_getIsolateFinalizers:
-      case MethodRecognizer::kFinalizerBase_setIsolate:
-      case MethodRecognizer::kFinalizerBase_setIsolateFinalizers:
-        // Unboxed/untagged representation not supported in unoptimized.
-        return true;
-      case MethodRecognizer::kFinalizerBase_exchangeEntriesCollectedWithNull:
-        // Prevent the GC from running so that the operation is atomic from
-        // a GC point of view. Always double check implementation in
-        // kernel_to_il.cc that no GC can happen in between the relevant IL
-        // instructions.
-        // TODO(https://dartbug.com/48527): Support inlining.
-        return true;
-      default:
-        return false;
-    }
+           IsTypedDataViewFactory() || IsUtf8Scan() || IsGetNativeField();
   }
 
   bool CanBeInlined() const;
@@ -5942,7 +5920,9 @@
   static intptr_t UnroundedSize(intptr_t length) {
     return HeaderSize() + length;
   }
-  static intptr_t InstanceSize() { return 0; }
+  static intptr_t InstanceSize() {
+    return 0;
+  }
   static intptr_t InstanceSize(intptr_t length) {
     return RoundedAllocationSize(UnroundedSize(length));
   }
@@ -12000,7 +11980,7 @@
   }
 
   static void Clear(WeakPropertyPtr raw_weak) {
-    ASSERT(raw_weak->untag()->next_seen_by_gc_ ==
+    ASSERT(raw_weak->untag()->next_ ==
            CompressedWeakPropertyPtr(WeakProperty::null()));
     // This action is performed by the GC. No barrier.
     raw_weak->untag()->key_ = Object::null();
@@ -12032,112 +12012,18 @@
     return RoundedAllocationSize(sizeof(UntaggedWeakReference));
   }
 
+  static void Clear(WeakReferencePtr raw_weak) {
+    ASSERT(raw_weak->untag()->next_ ==
+           CompressedWeakReferencePtr(WeakReference::null()));
+    // This action is performed by the GC. No barrier.
+    raw_weak->untag()->target_ = Object::null();
+  }
+
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(WeakReference, Instance);
   friend class Class;
 };
 
-class FinalizerEntry : public Instance {
- public:
-  ObjectPtr value() const { return untag()->value(); }
-  void set_value(const Object& value) const { untag()->set_value(value.ptr()); }
-  static intptr_t value_offset() {
-    return OFFSET_OF(UntaggedFinalizerEntry, value_);
-  }
-
-  ObjectPtr detach() const { return untag()->detach(); }
-  void set_detach(const Object& value) const {
-    untag()->set_detach(value.ptr());
-  }
-  static intptr_t detach_offset() {
-    return OFFSET_OF(UntaggedFinalizerEntry, detach_);
-  }
-
-  ObjectPtr token() const { return untag()->token(); }
-  void set_token(const Object& value) const { untag()->set_token(value.ptr()); }
-  static intptr_t token_offset() {
-    return OFFSET_OF(UntaggedFinalizerEntry, token_);
-  }
-
-  FinalizerBasePtr finalizer() const { return untag()->finalizer(); }
-  void set_finalizer(const FinalizerBase& value) const;
-  static intptr_t finalizer_offset() {
-    return OFFSET_OF(UntaggedFinalizerEntry, finalizer_);
-  }
-
-  FinalizerEntryPtr next() const { return untag()->next(); }
-  void set_next(const FinalizerEntry& value) const {
-    untag()->set_next(value.ptr());
-  }
-  static intptr_t next_offset() {
-    return OFFSET_OF(UntaggedFinalizerEntry, next_);
-  }
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(UntaggedFinalizerEntry));
-  }
-
-  static FinalizerEntryPtr New(Heap::Space space = Heap::kNew);
-
- private:
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(FinalizerEntry, Instance);
-  friend class Class;
-};
-
-class FinalizerBase : public Instance {
- public:
-  static intptr_t isolate_offset() {
-    return OFFSET_OF(UntaggedFinalizerBase, isolate_);
-  }
-  Isolate* isolate() const { return untag()->isolate_; }
-  void set_isolate(Isolate* value) const { untag()->isolate_ = value; }
-
-  static intptr_t detachments_offset() {
-    return OFFSET_OF(UntaggedFinalizerBase, detachments_);
-  }
-
-  LinkedHashSetPtr all_entries() const { return untag()->all_entries(); }
-  static intptr_t all_entries_offset() {
-    return OFFSET_OF(UntaggedFinalizerBase, all_entries_);
-  }
-
-  FinalizerEntryPtr entries_collected() const {
-    return untag()->entries_collected();
-  }
-  void set_entries_collected(const FinalizerEntry& value) const {
-    untag()->set_entries_collected(value.ptr());
-  }
-  static intptr_t entries_collected_offset() {
-    return OFFSET_OF(UntaggedFinalizer, entries_collected_);
-  }
-
- private:
-  HEAP_OBJECT_IMPLEMENTATION(FinalizerBase, Instance);
-  friend class Class;
-};
-
-class Finalizer : public FinalizerBase {
- public:
-  static intptr_t type_arguments_offset() {
-    return OFFSET_OF(UntaggedFinalizer, type_arguments_);
-  }
-
-  ObjectPtr callback() const { return untag()->callback(); }
-  static intptr_t callback_offset() {
-    return OFFSET_OF(UntaggedFinalizer, callback_);
-  }
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(UntaggedFinalizer));
-  }
-
-  static FinalizerPtr New(Heap::Space space = Heap::kNew);
-
- private:
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(Finalizer, FinalizerBase);
-  friend class Class;
-};
-
 class MirrorReference : public Instance {
  public:
   ObjectPtr referent() const { return untag()->referent(); }
diff --git a/runtime/vm/object_graph_copy.cc b/runtime/vm/object_graph_copy.cc
index ede344d..638febe 100644
--- a/runtime/vm/object_graph_copy.cc
+++ b/runtime/vm/object_graph_copy.cc
@@ -35,9 +35,6 @@
   V(ExceptionHandlers)                                                         \
   V(FfiTrampolineData)                                                         \
   V(Field)                                                                     \
-  V(Finalizer)                                                                 \
-  V(FinalizerBase)                                                             \
-  V(FinalizerEntry)                                                            \
   V(Function)                                                                  \
   V(FunctionType)                                                              \
   V(FutureOr)                                                                  \
@@ -603,7 +600,6 @@
       // those are the only non-abstract classes (so we avoid checking more cids
       // here that cannot happen in reality)
       HANDLE_ILLEGAL_CASE(DynamicLibrary)
-      HANDLE_ILLEGAL_CASE(Finalizer)
       HANDLE_ILLEGAL_CASE(MirrorReference)
       HANDLE_ILLEGAL_CASE(Pointer)
       HANDLE_ILLEGAL_CASE(ReceivePort)
@@ -1366,8 +1362,8 @@
         Object::null());
     // To satisfy some ASSERT()s in GC we'll use Object:null() explicitly here.
     Base::StoreCompressedPointerNoBarrier(
-        Types::GetWeakPropertyPtr(to),
-        OFFSET_OF(UntaggedWeakProperty, next_seen_by_gc_), Object::null());
+        Types::GetWeakPropertyPtr(to), OFFSET_OF(UntaggedWeakProperty, next_),
+        Object::null());
     Base::EnqueueWeakProperty(from);
   }
 
@@ -1384,8 +1380,8 @@
         from, to, OFFSET_OF(UntaggedWeakReference, type_arguments_));
     // To satisfy some ASSERT()s in GC we'll use Object:null() explicitly here.
     Base::StoreCompressedPointerNoBarrier(
-        Types::GetWeakReferencePtr(to),
-        OFFSET_OF(UntaggedWeakReference, next_seen_by_gc_), Object::null());
+        Types::GetWeakReferencePtr(to), OFFSET_OF(UntaggedWeakReference, next_),
+        Object::null());
     Base::EnqueueWeakReference(from);
   }
 
@@ -1819,7 +1815,7 @@
         // We force the GC to compact, which is more likely to discover
         // untracked pointers (and other issues, like incorrect class table).
         thread_->heap()->CollectAllGarbage(GCReason::kDebugging,
-                                           /*compact=*/true);
+                                           /*compact=*/ true);
       }
 
       // Fast copy failed due to
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 59245d6..210f508 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -1700,29 +1700,6 @@
   jsobj.AddProperty("target", target_handle);
 }
 
-void FinalizerBase::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  UNREACHABLE();
-}
-
-void Finalizer::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  JSONObject jsobj(stream);
-  PrintSharedInstanceJSON(&jsobj, ref);
-  jsobj.AddProperty("kind", "Finalizer");
-  jsobj.AddServiceId(*this);
-  if (ref) {
-    return;
-  }
-
-  const Object& finalizer_callback = Object::Handle(callback());
-  jsobj.AddProperty("callback", finalizer_callback);
-
-  // Not exposing entries.
-}
-
-void FinalizerEntry::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  UNREACHABLE();
-}
-
 void MirrorReference::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index bdbc4a1..23f9b4d 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -78,8 +78,6 @@
   resume_capabilities_ = GrowableObjectArray::New();
   exit_listeners_ = GrowableObjectArray::New();
   error_listeners_ = GrowableObjectArray::New();
-  dart_args_1_ = Array::New(1);
-  dart_args_2_ = Array::New(2);
 
   // Allocate pre-allocated unhandled exception object initialized with the
   // pre-allocated OutOfMemoryError.
@@ -469,24 +467,7 @@
   auto* const thread = Thread::Current();
   SafepointWriteRwLocker locker(thread,
                                 thread->isolate_group()->program_lock());
-  if (handle_finalizer_message_function_.load() == Function::null()) {
-    auto* const zone = thread->zone();
-    auto& cls = Class::Handle(zone);
-    auto& function = Function::Handle(zone);
-    auto& error = Error::Handle(zone);
-
-    const auto& ffi_lib = Library::Handle(zone, Library::FfiLibrary());
-    ASSERT(!ffi_lib.IsNull());
-
-    cls = finalizer_class();
-    ASSERT(!cls.IsNull());
-    error = cls.EnsureIsFinalized(thread);
-    ASSERT(error.IsNull());
-    function =
-        cls.LookupFunctionAllowPrivate(Symbols::_handleFinalizerMessage());
-    ASSERT(!function.IsNull());
-    handle_finalizer_message_function_.store(function.ptr());
-  }
+  // TODO(http://dartbug.com/47777): Implement finalizers.
 }
 
 void ObjectStore::LazyInitIsolateMembers() {
@@ -531,14 +512,13 @@
     auto* const zone = thread->zone();
     auto& cls = Class::Handle(zone);
     auto& field = Field::Handle(zone);
-    auto& error = Error::Handle(zone);
 
     const auto& internal_lib =
         Library::Handle(zone, Library::InternalLibrary());
     cls = internal_lib.LookupClass(Symbols::Symbol());
     ASSERT(!cls.IsNull());
-    error = cls.EnsureIsFinalized(thread);
-    ASSERT(error.IsNull());
+    const auto& error = cls.EnsureIsFinalized(thread);
+    ASSERT(error == Error::null());
     symbol_class_.store(cls.ptr());
 
     field = cls.LookupInstanceFieldAllowPrivate(Symbols::_name());
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 26bce63..f86b8c5 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -55,7 +55,6 @@
   LAZY_CORE(Function, _object_to_string_function)                              \
   LAZY_INTERNAL(Class, symbol_class)                                           \
   LAZY_INTERNAL(Field, symbol_name_field)                                      \
-  LAZY_FFI(Function, handle_finalizer_message_function)                        \
   LAZY_ASYNC(Type, non_nullable_future_rare_type)                              \
   LAZY_ASYNC(Type, non_nullable_future_never_type)                             \
   LAZY_ASYNC(Type, nullable_future_null_type)                                  \
@@ -127,9 +126,6 @@
   RW(Class, expando_class)                                                     \
   RW(Class, weak_property_class)                                               \
   RW(Class, weak_reference_class)                                              \
-  RW(Class, finalizer_class)                                                   \
-  RW(Class, finalizer_entry_class)                                             \
-  RW(Class, finalizer_native_class)                                            \
   ARW_AR(Array, symbol_table)                                                  \
   RW(Array, canonical_types)                                                   \
   RW(Array, canonical_function_types)                                          \
@@ -319,8 +315,8 @@
   RW(UnhandledException, preallocated_unhandled_exception)                     \
   RW(StackTrace, preallocated_stack_trace)                                     \
   RW(UnwindError, preallocated_unwind_error)                                   \
-  R_(Array, dart_args_1)                                                       \
-  R_(Array, dart_args_2)                                                       \
+  RW(Array, dart_args_1)                                                       \
+  RW(Array, dart_args_2)                                                       \
   R_(GrowableObjectArray, resume_capabilities)                                 \
   R_(GrowableObjectArray, exit_listeners)                                      \
   R_(GrowableObjectArray, error_listeners)
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 8a647cb..237ffb0 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include <limits>
-#include <memory>
 
 #include "include/dart_api.h"
 
@@ -17,15 +16,12 @@
 #include "vm/code_descriptors.h"
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/compiler_state.h"
-#include "vm/compiler/runtime_api.h"
 #include "vm/dart_api_impl.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
 #include "vm/debugger_api_impl_test.h"
-#include "vm/flags.h"
 #include "vm/isolate.h"
 #include "vm/malloc_hooks.h"
-#include "vm/message_handler.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/resolver.h"
@@ -4009,1037 +4005,6 @@
   WeakReference_Preserve_ReachableThroughWeakProperty(thread, Heap::kOld);
 }
 
-static int NumEntries(const FinalizerEntry& entry, intptr_t acc = 0) {
-  if (entry.IsNull()) {
-    return acc;
-  }
-  return NumEntries(FinalizerEntry::Handle(entry.next()), acc + 1);
-}
-
-static void Finalizer_PreserveOne(Thread* thread,
-                                  Heap::Space space,
-                                  bool with_detach) {
-#ifdef DEBUG
-  SetFlagScope<bool> sfs(&FLAG_trace_finalizers, true);
-#endif
-
-  MessageHandler* handler = thread->isolate()->message_handler();
-  {
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(0, aq.queue()->Length());
-  }
-
-  const auto& finalizer = Finalizer::Handle(Finalizer::New(space));
-  finalizer.set_isolate(thread->isolate());
-  const auto& entry = FinalizerEntry::Handle(FinalizerEntry::New(space));
-  entry.set_finalizer(finalizer);
-  const auto& value = String::Handle(OneByteString::New("value", space));
-  entry.set_value(value);
-  auto& detach = Object::Handle();
-  if (with_detach) {
-    detach = OneByteString::New("detach", space);
-  } else {
-    detach = Object::null();
-  }
-  entry.set_detach(detach);
-  const auto& token = String::Handle(OneByteString::New("token", space));
-  entry.set_token(token);
-
-  if (space == Heap::kNew) {
-    GCTestHelper::CollectNewSpace();
-  } else {
-    GCTestHelper::CollectAllGarbage();
-  }
-
-  // Nothing in the entry should have been collected.
-  EXPECT_NE(Object::null(), entry.value());
-  EXPECT((entry.detach() == Object::null()) ^ with_detach);
-  EXPECT_NE(Object::null(), entry.token());
-
-  // The entry should not have moved to the collected list.
-  EXPECT_EQ(0,
-            NumEntries(FinalizerEntry::Handle(finalizer.entries_collected())));
-
-  // We should have no messages.
-  {
-    // Acquire ownership of message handler queues.
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(0, aq.queue()->Length());
-  }
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_PreserveNoDetachOne_NewSpace) {
-  Finalizer_PreserveOne(thread, Heap::kNew, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_PreserveNoDetachOne_OldSpace) {
-  Finalizer_PreserveOne(thread, Heap::kOld, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_PreserveWithDetachOne_NewSpace) {
-  Finalizer_PreserveOne(thread, Heap::kNew, true);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_PreserveWithDetachOne_OldSpace) {
-  Finalizer_PreserveOne(thread, Heap::kOld, true);
-}
-
-static void Finalizer_ClearDetachOne(Thread* thread, Heap::Space space) {
-#ifdef DEBUG
-  SetFlagScope<bool> sfs(&FLAG_trace_finalizers, true);
-#endif
-
-  MessageHandler* handler = thread->isolate()->message_handler();
-  {
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(0, aq.queue()->Length());
-  }
-
-  const auto& finalizer = Finalizer::Handle(Finalizer::New(space));
-  finalizer.set_isolate(thread->isolate());
-  const auto& entry = FinalizerEntry::Handle(FinalizerEntry::New(space));
-  entry.set_finalizer(finalizer);
-  const auto& value = String::Handle(OneByteString::New("value", space));
-  entry.set_value(value);
-  const auto& token = String::Handle(OneByteString::New("token", space));
-  entry.set_token(token);
-
-  {
-    HANDLESCOPE(thread);
-    const auto& detach = String::Handle(OneByteString::New("detach", space));
-    entry.set_detach(detach);
-  }
-
-  if (space == Heap::kNew) {
-    GCTestHelper::CollectNewSpace();
-  } else {
-    GCTestHelper::CollectAllGarbage();
-  }
-
-  // Detach should have been collected.
-  EXPECT_NE(Object::null(), entry.value());
-  EXPECT_EQ(Object::null(), entry.detach());
-  EXPECT_NE(Object::null(), entry.token());
-
-  // The entry should not have moved to the collected list.
-  EXPECT_EQ(0,
-            NumEntries(FinalizerEntry::Handle(finalizer.entries_collected())));
-
-  // We should have no messages.
-  {
-    // Acquire ownership of message handler queues.
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(0, aq.queue()->Length());
-  }
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearDetachOne_NewSpace) {
-  Finalizer_ClearDetachOne(thread, Heap::kNew);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearDetachOne_OldSpace) {
-  Finalizer_ClearDetachOne(thread, Heap::kOld);
-}
-
-static void Finalizer_ClearValueOne(Thread* thread,
-                                    Heap::Space space,
-                                    bool null_token) {
-#ifdef DEBUG
-  SetFlagScope<bool> sfs(&FLAG_trace_finalizers, true);
-#endif
-
-  MessageHandler* handler = thread->isolate()->message_handler();
-  {
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(0, aq.queue()->Length());
-  }
-
-  const auto& finalizer = Finalizer::Handle(Finalizer::New(space));
-  finalizer.set_isolate(thread->isolate());
-  const auto& entry = FinalizerEntry::Handle(FinalizerEntry::New(space));
-  entry.set_finalizer(finalizer);
-  const auto& detach = String::Handle(OneByteString::New("detach", space));
-  auto& token = Object::Handle();
-  if (null_token) {
-    // Null is a valid token in Dart finalizers.
-    token = Object::null();
-  } else {
-    token = OneByteString::New("token", space);
-  }
-  entry.set_token(token);
-  entry.set_detach(detach);
-
-  {
-    HANDLESCOPE(thread);
-    const auto& value = String::Handle(OneByteString::New("value", space));
-    entry.set_value(value);
-  }
-
-  if (space == Heap::kNew) {
-    GCTestHelper::CollectNewSpace();
-  } else {
-    GCTestHelper::CollectAllGarbage();
-  }
-
-  // Value should have been collected.
-  EXPECT_EQ(Object::null(), entry.value());
-  EXPECT_NE(Object::null(), entry.detach());
-
-  // The entry should have moved to the collected list.
-  EXPECT_EQ(1,
-            NumEntries(FinalizerEntry::Handle(finalizer.entries_collected())));
-
-  // We should have 1 message.
-  {
-    // Acquire ownership of message handler queues.
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(1, aq.queue()->Length());
-  }
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearValueOne_NewSpace) {
-  Finalizer_ClearValueOne(thread, Heap::kNew, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearValueOne_OldSpace) {
-  Finalizer_ClearValueOne(thread, Heap::kOld, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearValueNullTokenOne_NewSpace) {
-  Finalizer_ClearValueOne(thread, Heap::kNew, true);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearValueNullTokenOne_OldSpace) {
-  Finalizer_ClearValueOne(thread, Heap::kOld, true);
-}
-
-static void Finalizer_DetachOne(Thread* thread,
-                                Heap::Space space,
-                                bool clear_value) {
-#ifdef DEBUG
-  SetFlagScope<bool> sfs(&FLAG_trace_finalizers, true);
-#endif
-
-  MessageHandler* handler = thread->isolate()->message_handler();
-  {
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(0, aq.queue()->Length());
-  }
-
-  const auto& finalizer = Finalizer::Handle(Finalizer::New(space));
-  finalizer.set_isolate(thread->isolate());
-  const auto& entry = FinalizerEntry::Handle(FinalizerEntry::New(space));
-  entry.set_finalizer(finalizer);
-  const auto& detach = String::Handle(OneByteString::New("detach", space));
-  entry.set_detach(detach);
-
-  // Simulate calling detach, setting the token of the entry to the entry.
-  entry.set_token(entry);
-
-  auto& value = String::Handle();
-  {
-    HANDLESCOPE(thread);
-
-    const auto& object = String::Handle(OneByteString::New("value", space));
-    entry.set_value(object);
-    if (!clear_value) {
-      value = object.ptr();
-    }
-  }
-
-  if (space == Heap::kNew) {
-    GCTestHelper::CollectNewSpace();
-  } else {
-    GCTestHelper::CollectAllGarbage();
-  }
-
-  EXPECT((entry.value() == Object::null()) ^ !clear_value);
-  EXPECT_NE(Object::null(), entry.detach());
-  EXPECT_EQ(entry.ptr(), entry.token());
-
-  // The entry should have been removed entirely
-  EXPECT_EQ(0,
-            NumEntries(FinalizerEntry::Handle(finalizer.entries_collected())));
-
-  // We should have no message.
-  {
-    // Acquire ownership of message handler queues.
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(0, aq.queue()->Length());
-  }
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_DetachOne_NewSpace) {
-  Finalizer_DetachOne(thread, Heap::kNew, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_DetachOne_OldSpace) {
-  Finalizer_DetachOne(thread, Heap::kOld, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_DetachAndClearValueOne_NewSpace) {
-  Finalizer_DetachOne(thread, Heap::kNew, true);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_DetachAndClearValueOne_OldSpace) {
-  Finalizer_DetachOne(thread, Heap::kOld, true);
-}
-
-static void Finalizer_GcFinalizer(Thread* thread, Heap::Space space) {
-#ifdef DEBUG
-  SetFlagScope<bool> sfs(&FLAG_trace_finalizers, true);
-#endif
-
-  MessageHandler* handler = thread->isolate()->message_handler();
-  {
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(0, aq.queue()->Length());
-  }
-
-  const auto& detach = String::Handle(OneByteString::New("detach", space));
-  const auto& token = String::Handle(OneByteString::New("token", space));
-
-  {
-    HANDLESCOPE(thread);
-    const auto& finalizer = Finalizer::Handle(Finalizer::New(space));
-    finalizer.set_isolate(thread->isolate());
-    const auto& entry = FinalizerEntry::Handle(FinalizerEntry::New(space));
-    entry.set_finalizer(finalizer);
-    entry.set_detach(detach);
-    entry.set_token(token);
-    const auto& value = String::Handle(OneByteString::New("value", space));
-    entry.set_value(value);
-  }
-
-  if (space == Heap::kNew) {
-    GCTestHelper::CollectNewSpace();
-  } else {
-    GCTestHelper::CollectAllGarbage();
-  }
-
-  // We should have no message, the Finalizer itself has been GCed.
-  {
-    // Acquire ownership of message handler queues.
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(0, aq.queue()->Length());
-  }
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_GcFinalizer_NewSpace) {
-  Finalizer_GcFinalizer(thread, Heap::kNew);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_GcFinalizer_OldSpace) {
-  Finalizer_GcFinalizer(thread, Heap::kOld);
-}
-
-static void Finalizer_TwoEntriesCrossGen(
-    Thread* thread,
-    Heap::Space* spaces,
-    bool collect_old_space,
-    bool collect_new_space,
-    bool evacuate_new_space_and_collect_old_space,
-    bool clear_value_1,
-    bool clear_value_2,
-    bool clear_detach_1,
-    bool clear_detach_2) {
-#ifdef DEBUG
-  SetFlagScope<bool> sfs(&FLAG_trace_finalizers, true);
-#endif
-
-  MessageHandler* handler = thread->isolate()->message_handler();
-  // We're reusing the isolate in a loop, so there are messages from previous
-  // runs of this test.
-  intptr_t queue_length_start = 0;
-  {
-    MessageHandler::AcquiredQueues aq(handler);
-    queue_length_start = aq.queue()->Length();
-  }
-
-  const auto& finalizer = Finalizer::Handle(Finalizer::New(spaces[0]));
-  finalizer.set_isolate(thread->isolate());
-  const auto& entry1 = FinalizerEntry::Handle(FinalizerEntry::New(spaces[1]));
-  entry1.set_finalizer(finalizer);
-  const auto& entry2 = FinalizerEntry::Handle(FinalizerEntry::New(spaces[2]));
-  entry2.set_finalizer(finalizer);
-
-  auto& value1 = String::Handle();
-  auto& detach1 = String::Handle();
-  const auto& token1 = String::Handle(OneByteString::New("token1", spaces[3]));
-  entry1.set_token(token1);
-
-  auto& value2 = String::Handle();
-  auto& detach2 = String::Handle();
-  const auto& token2 = String::Handle(OneByteString::New("token2", spaces[4]));
-  entry2.set_token(token2);
-  entry2.set_detach(detach2);
-
-  {
-    HANDLESCOPE(thread);
-    auto& object = String::Handle();
-
-    object ^= OneByteString::New("value1", spaces[5]);
-    entry1.set_value(object);
-    if (!clear_value_1) {
-      value1 = object.ptr();
-    }
-
-    object ^= OneByteString::New("detach", spaces[6]);
-    entry1.set_detach(object);
-    if (!clear_detach_1) {
-      detach1 = object.ptr();
-    }
-
-    object ^= OneByteString::New("value2", spaces[7]);
-    entry2.set_value(object);
-    if (!clear_value_2) {
-      value2 = object.ptr();
-    }
-
-    object ^= OneByteString::New("detach", spaces[8]);
-    entry2.set_detach(object);
-    if (!clear_detach_2) {
-      detach2 = object.ptr();
-    }
-  }
-
-  if (collect_old_space) {
-    GCTestHelper::CollectOldSpace();
-  }
-  if (collect_new_space) {
-    GCTestHelper::CollectNewSpace();
-  }
-  if (evacuate_new_space_and_collect_old_space) {
-    GCTestHelper::CollectAllGarbage();
-  }
-
-  EXPECT((entry1.value() == Object::null()) ^ !clear_value_1);
-  EXPECT((entry2.value() == Object::null()) ^ !clear_value_2);
-  EXPECT((entry1.detach() == Object::null()) ^ !clear_detach_1);
-  EXPECT((entry2.detach() == Object::null()) ^ !clear_detach_2);
-  EXPECT_NE(Object::null(), entry1.token());
-  EXPECT_NE(Object::null(), entry2.token());
-
-  const intptr_t expect_num_cleared =
-      (clear_value_1 ? 1 : 0) + (clear_value_2 ? 1 : 0);
-  EXPECT_EQ(expect_num_cleared,
-            NumEntries(FinalizerEntry::Handle(finalizer.entries_collected())));
-
-  const intptr_t expect_num_messages = expect_num_cleared == 0 ? 0 : 1;
-  {
-    // Acquire ownership of message handler queues.
-    MessageHandler::AcquiredQueues aq(handler);
-    EXPECT_EQ(expect_num_messages + queue_length_start, aq.queue()->Length());
-  }
-}
-
-const intptr_t kFinalizerTwoEntriesNumObjects = 9;
-
-static void Finalizer_TwoEntries(Thread* thread,
-                                 Heap::Space space,
-                                 bool clear_value_1,
-                                 bool clear_value_2,
-                                 bool clear_detach_1,
-                                 bool clear_detach_2) {
-  const bool collect_old_space = true;
-  const bool collect_new_space = space == Heap::kNew;
-  const bool evacuate_new_space_and_collect_old_space = !collect_new_space;
-
-  Heap::Space spaces[kFinalizerTwoEntriesNumObjects];
-  for (intptr_t i = 0; i < kFinalizerTwoEntriesNumObjects; i++) {
-    spaces[i] = space;
-  }
-  Finalizer_TwoEntriesCrossGen(
-      thread, spaces, collect_old_space, collect_new_space,
-      evacuate_new_space_and_collect_old_space, clear_value_1, clear_value_2,
-      clear_detach_1, clear_detach_2);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearValueTwo_NewSpace) {
-  Finalizer_TwoEntries(thread, Heap::kNew, true, true, false, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearValueTwo_OldSpace) {
-  Finalizer_TwoEntries(thread, Heap::kOld, true, true, false, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearFirstValue_NewSpace) {
-  Finalizer_TwoEntries(thread, Heap::kNew, true, false, false, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearFirstValue_OldSpace) {
-  Finalizer_TwoEntries(thread, Heap::kOld, true, false, false, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearSecondValue_NewSpace) {
-  Finalizer_TwoEntries(thread, Heap::kNew, false, true, false, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearSecondValue_OldSpace) {
-  Finalizer_TwoEntries(thread, Heap::kOld, false, true, false, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_PreserveTwo_NewSpace) {
-  Finalizer_TwoEntries(thread, Heap::kNew, false, false, false, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_PreserveTwo_OldSpace) {
-  Finalizer_TwoEntries(thread, Heap::kOld, false, false, false, false);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearDetachTwo_NewSpace) {
-  Finalizer_TwoEntries(thread, Heap::kNew, false, false, true, true);
-}
-
-ISOLATE_UNIT_TEST_CASE(Finalizer_ClearDetachTwo_OldSpace) {
-  Finalizer_TwoEntries(thread, Heap::kOld, false, false, true, true);
-}
-
-static void Finalizer_TwoEntriesCrossGen(Thread* thread, intptr_t test_i) {
-  ASSERT(test_i < (1 << kFinalizerTwoEntriesNumObjects));
-  Heap::Space spaces[kFinalizerTwoEntriesNumObjects];
-  for (intptr_t i = 0; i < kFinalizerTwoEntriesNumObjects; i++) {
-    spaces[i] = ((test_i >> i) & 0x1) == 0x1 ? Heap::kOld : Heap::kNew;
-  }
-  // Either collect or evacuate new space.
-  for (const bool collect_new_space : {false, true}) {
-    // Always run old space collection first.
-    const bool collect_old_space = true;
-    // Always run old space collection after new space.
-    const bool evacuate_new_space_and_collect_old_space = true;
-    for (intptr_t test_j = 0; test_j < 16; test_j++) {
-      const bool clear_value_1 = (test_j >> 0 & 0x1) == 0x1;
-      const bool clear_value_2 = (test_j >> 1 & 0x1) == 0x1;
-      const bool clear_detach_1 = (test_j >> 2 & 0x1) == 0x1;
-      const bool clear_detach_2 = (test_j >> 3 & 0x1) == 0x1;
-      Finalizer_TwoEntriesCrossGen(
-          thread, spaces, collect_old_space, collect_new_space,
-          evacuate_new_space_and_collect_old_space, clear_value_1,
-          clear_value_2, clear_detach_1, clear_detach_2);
-    }
-  }
-}
-#define FINALIZER_CROSS_GEN_TEST_CASE(n)                                       \
-  ISOLATE_UNIT_TEST_CASE(Finalizer_CrossGen_##n) {                             \
-    Finalizer_TwoEntriesCrossGen(thread, n);                                   \
-  }
-
-#define REPEAT_512(V)                                                          \
-  V(0)                                                                         \
-  V(1)                                                                         \
-  V(2)                                                                         \
-  V(3)                                                                         \
-  V(4)                                                                         \
-  V(5)                                                                         \
-  V(6)                                                                         \
-  V(7)                                                                         \
-  V(8)                                                                         \
-  V(9)                                                                         \
-  V(10)                                                                        \
-  V(11)                                                                        \
-  V(12)                                                                        \
-  V(13)                                                                        \
-  V(14)                                                                        \
-  V(15)                                                                        \
-  V(16)                                                                        \
-  V(17)                                                                        \
-  V(18)                                                                        \
-  V(19)                                                                        \
-  V(20)                                                                        \
-  V(21)                                                                        \
-  V(22)                                                                        \
-  V(23)                                                                        \
-  V(24)                                                                        \
-  V(25)                                                                        \
-  V(26)                                                                        \
-  V(27)                                                                        \
-  V(28)                                                                        \
-  V(29)                                                                        \
-  V(30)                                                                        \
-  V(31)                                                                        \
-  V(32)                                                                        \
-  V(33)                                                                        \
-  V(34)                                                                        \
-  V(35)                                                                        \
-  V(36)                                                                        \
-  V(37)                                                                        \
-  V(38)                                                                        \
-  V(39)                                                                        \
-  V(40)                                                                        \
-  V(41)                                                                        \
-  V(42)                                                                        \
-  V(43)                                                                        \
-  V(44)                                                                        \
-  V(45)                                                                        \
-  V(46)                                                                        \
-  V(47)                                                                        \
-  V(48)                                                                        \
-  V(49)                                                                        \
-  V(50)                                                                        \
-  V(51)                                                                        \
-  V(52)                                                                        \
-  V(53)                                                                        \
-  V(54)                                                                        \
-  V(55)                                                                        \
-  V(56)                                                                        \
-  V(57)                                                                        \
-  V(58)                                                                        \
-  V(59)                                                                        \
-  V(60)                                                                        \
-  V(61)                                                                        \
-  V(62)                                                                        \
-  V(63)                                                                        \
-  V(64)                                                                        \
-  V(65)                                                                        \
-  V(66)                                                                        \
-  V(67)                                                                        \
-  V(68)                                                                        \
-  V(69)                                                                        \
-  V(70)                                                                        \
-  V(71)                                                                        \
-  V(72)                                                                        \
-  V(73)                                                                        \
-  V(74)                                                                        \
-  V(75)                                                                        \
-  V(76)                                                                        \
-  V(77)                                                                        \
-  V(78)                                                                        \
-  V(79)                                                                        \
-  V(80)                                                                        \
-  V(81)                                                                        \
-  V(82)                                                                        \
-  V(83)                                                                        \
-  V(84)                                                                        \
-  V(85)                                                                        \
-  V(86)                                                                        \
-  V(87)                                                                        \
-  V(88)                                                                        \
-  V(89)                                                                        \
-  V(90)                                                                        \
-  V(91)                                                                        \
-  V(92)                                                                        \
-  V(93)                                                                        \
-  V(94)                                                                        \
-  V(95)                                                                        \
-  V(96)                                                                        \
-  V(97)                                                                        \
-  V(98)                                                                        \
-  V(99)                                                                        \
-  V(100)                                                                       \
-  V(101)                                                                       \
-  V(102)                                                                       \
-  V(103)                                                                       \
-  V(104)                                                                       \
-  V(105)                                                                       \
-  V(106)                                                                       \
-  V(107)                                                                       \
-  V(108)                                                                       \
-  V(109)                                                                       \
-  V(110)                                                                       \
-  V(111)                                                                       \
-  V(112)                                                                       \
-  V(113)                                                                       \
-  V(114)                                                                       \
-  V(115)                                                                       \
-  V(116)                                                                       \
-  V(117)                                                                       \
-  V(118)                                                                       \
-  V(119)                                                                       \
-  V(120)                                                                       \
-  V(121)                                                                       \
-  V(122)                                                                       \
-  V(123)                                                                       \
-  V(124)                                                                       \
-  V(125)                                                                       \
-  V(126)                                                                       \
-  V(127)                                                                       \
-  V(128)                                                                       \
-  V(129)                                                                       \
-  V(130)                                                                       \
-  V(131)                                                                       \
-  V(132)                                                                       \
-  V(133)                                                                       \
-  V(134)                                                                       \
-  V(135)                                                                       \
-  V(136)                                                                       \
-  V(137)                                                                       \
-  V(138)                                                                       \
-  V(139)                                                                       \
-  V(140)                                                                       \
-  V(141)                                                                       \
-  V(142)                                                                       \
-  V(143)                                                                       \
-  V(144)                                                                       \
-  V(145)                                                                       \
-  V(146)                                                                       \
-  V(147)                                                                       \
-  V(148)                                                                       \
-  V(149)                                                                       \
-  V(150)                                                                       \
-  V(151)                                                                       \
-  V(152)                                                                       \
-  V(153)                                                                       \
-  V(154)                                                                       \
-  V(155)                                                                       \
-  V(156)                                                                       \
-  V(157)                                                                       \
-  V(158)                                                                       \
-  V(159)                                                                       \
-  V(160)                                                                       \
-  V(161)                                                                       \
-  V(162)                                                                       \
-  V(163)                                                                       \
-  V(164)                                                                       \
-  V(165)                                                                       \
-  V(166)                                                                       \
-  V(167)                                                                       \
-  V(168)                                                                       \
-  V(169)                                                                       \
-  V(170)                                                                       \
-  V(171)                                                                       \
-  V(172)                                                                       \
-  V(173)                                                                       \
-  V(174)                                                                       \
-  V(175)                                                                       \
-  V(176)                                                                       \
-  V(177)                                                                       \
-  V(178)                                                                       \
-  V(179)                                                                       \
-  V(180)                                                                       \
-  V(181)                                                                       \
-  V(182)                                                                       \
-  V(183)                                                                       \
-  V(184)                                                                       \
-  V(185)                                                                       \
-  V(186)                                                                       \
-  V(187)                                                                       \
-  V(188)                                                                       \
-  V(189)                                                                       \
-  V(190)                                                                       \
-  V(191)                                                                       \
-  V(192)                                                                       \
-  V(193)                                                                       \
-  V(194)                                                                       \
-  V(195)                                                                       \
-  V(196)                                                                       \
-  V(197)                                                                       \
-  V(198)                                                                       \
-  V(199)                                                                       \
-  V(200)                                                                       \
-  V(201)                                                                       \
-  V(202)                                                                       \
-  V(203)                                                                       \
-  V(204)                                                                       \
-  V(205)                                                                       \
-  V(206)                                                                       \
-  V(207)                                                                       \
-  V(208)                                                                       \
-  V(209)                                                                       \
-  V(210)                                                                       \
-  V(211)                                                                       \
-  V(212)                                                                       \
-  V(213)                                                                       \
-  V(214)                                                                       \
-  V(215)                                                                       \
-  V(216)                                                                       \
-  V(217)                                                                       \
-  V(218)                                                                       \
-  V(219)                                                                       \
-  V(220)                                                                       \
-  V(221)                                                                       \
-  V(222)                                                                       \
-  V(223)                                                                       \
-  V(224)                                                                       \
-  V(225)                                                                       \
-  V(226)                                                                       \
-  V(227)                                                                       \
-  V(228)                                                                       \
-  V(229)                                                                       \
-  V(230)                                                                       \
-  V(231)                                                                       \
-  V(232)                                                                       \
-  V(233)                                                                       \
-  V(234)                                                                       \
-  V(235)                                                                       \
-  V(236)                                                                       \
-  V(237)                                                                       \
-  V(238)                                                                       \
-  V(239)                                                                       \
-  V(240)                                                                       \
-  V(241)                                                                       \
-  V(242)                                                                       \
-  V(243)                                                                       \
-  V(244)                                                                       \
-  V(245)                                                                       \
-  V(246)                                                                       \
-  V(247)                                                                       \
-  V(248)                                                                       \
-  V(249)                                                                       \
-  V(250)                                                                       \
-  V(251)                                                                       \
-  V(252)                                                                       \
-  V(253)                                                                       \
-  V(254)                                                                       \
-  V(255)                                                                       \
-  V(256)                                                                       \
-  V(257)                                                                       \
-  V(258)                                                                       \
-  V(259)                                                                       \
-  V(260)                                                                       \
-  V(261)                                                                       \
-  V(262)                                                                       \
-  V(263)                                                                       \
-  V(264)                                                                       \
-  V(265)                                                                       \
-  V(266)                                                                       \
-  V(267)                                                                       \
-  V(268)                                                                       \
-  V(269)                                                                       \
-  V(270)                                                                       \
-  V(271)                                                                       \
-  V(272)                                                                       \
-  V(273)                                                                       \
-  V(274)                                                                       \
-  V(275)                                                                       \
-  V(276)                                                                       \
-  V(277)                                                                       \
-  V(278)                                                                       \
-  V(279)                                                                       \
-  V(280)                                                                       \
-  V(281)                                                                       \
-  V(282)                                                                       \
-  V(283)                                                                       \
-  V(284)                                                                       \
-  V(285)                                                                       \
-  V(286)                                                                       \
-  V(287)                                                                       \
-  V(288)                                                                       \
-  V(289)                                                                       \
-  V(290)                                                                       \
-  V(291)                                                                       \
-  V(292)                                                                       \
-  V(293)                                                                       \
-  V(294)                                                                       \
-  V(295)                                                                       \
-  V(296)                                                                       \
-  V(297)                                                                       \
-  V(298)                                                                       \
-  V(299)                                                                       \
-  V(300)                                                                       \
-  V(301)                                                                       \
-  V(302)                                                                       \
-  V(303)                                                                       \
-  V(304)                                                                       \
-  V(305)                                                                       \
-  V(306)                                                                       \
-  V(307)                                                                       \
-  V(308)                                                                       \
-  V(309)                                                                       \
-  V(310)                                                                       \
-  V(311)                                                                       \
-  V(312)                                                                       \
-  V(313)                                                                       \
-  V(314)                                                                       \
-  V(315)                                                                       \
-  V(316)                                                                       \
-  V(317)                                                                       \
-  V(318)                                                                       \
-  V(319)                                                                       \
-  V(320)                                                                       \
-  V(321)                                                                       \
-  V(322)                                                                       \
-  V(323)                                                                       \
-  V(324)                                                                       \
-  V(325)                                                                       \
-  V(326)                                                                       \
-  V(327)                                                                       \
-  V(328)                                                                       \
-  V(329)                                                                       \
-  V(330)                                                                       \
-  V(331)                                                                       \
-  V(332)                                                                       \
-  V(333)                                                                       \
-  V(334)                                                                       \
-  V(335)                                                                       \
-  V(336)                                                                       \
-  V(337)                                                                       \
-  V(338)                                                                       \
-  V(339)                                                                       \
-  V(340)                                                                       \
-  V(341)                                                                       \
-  V(342)                                                                       \
-  V(343)                                                                       \
-  V(344)                                                                       \
-  V(345)                                                                       \
-  V(346)                                                                       \
-  V(347)                                                                       \
-  V(348)                                                                       \
-  V(349)                                                                       \
-  V(350)                                                                       \
-  V(351)                                                                       \
-  V(352)                                                                       \
-  V(353)                                                                       \
-  V(354)                                                                       \
-  V(355)                                                                       \
-  V(356)                                                                       \
-  V(357)                                                                       \
-  V(358)                                                                       \
-  V(359)                                                                       \
-  V(360)                                                                       \
-  V(361)                                                                       \
-  V(362)                                                                       \
-  V(363)                                                                       \
-  V(364)                                                                       \
-  V(365)                                                                       \
-  V(366)                                                                       \
-  V(367)                                                                       \
-  V(368)                                                                       \
-  V(369)                                                                       \
-  V(370)                                                                       \
-  V(371)                                                                       \
-  V(372)                                                                       \
-  V(373)                                                                       \
-  V(374)                                                                       \
-  V(375)                                                                       \
-  V(376)                                                                       \
-  V(377)                                                                       \
-  V(378)                                                                       \
-  V(379)                                                                       \
-  V(380)                                                                       \
-  V(381)                                                                       \
-  V(382)                                                                       \
-  V(383)                                                                       \
-  V(384)                                                                       \
-  V(385)                                                                       \
-  V(386)                                                                       \
-  V(387)                                                                       \
-  V(388)                                                                       \
-  V(389)                                                                       \
-  V(390)                                                                       \
-  V(391)                                                                       \
-  V(392)                                                                       \
-  V(393)                                                                       \
-  V(394)                                                                       \
-  V(395)                                                                       \
-  V(396)                                                                       \
-  V(397)                                                                       \
-  V(398)                                                                       \
-  V(399)                                                                       \
-  V(400)                                                                       \
-  V(401)                                                                       \
-  V(402)                                                                       \
-  V(403)                                                                       \
-  V(404)                                                                       \
-  V(405)                                                                       \
-  V(406)                                                                       \
-  V(407)                                                                       \
-  V(408)                                                                       \
-  V(409)                                                                       \
-  V(410)                                                                       \
-  V(411)                                                                       \
-  V(412)                                                                       \
-  V(413)                                                                       \
-  V(414)                                                                       \
-  V(415)                                                                       \
-  V(416)                                                                       \
-  V(417)                                                                       \
-  V(418)                                                                       \
-  V(419)                                                                       \
-  V(420)                                                                       \
-  V(421)                                                                       \
-  V(422)                                                                       \
-  V(423)                                                                       \
-  V(424)                                                                       \
-  V(425)                                                                       \
-  V(426)                                                                       \
-  V(427)                                                                       \
-  V(428)                                                                       \
-  V(429)                                                                       \
-  V(430)                                                                       \
-  V(431)                                                                       \
-  V(432)                                                                       \
-  V(433)                                                                       \
-  V(434)                                                                       \
-  V(435)                                                                       \
-  V(436)                                                                       \
-  V(437)                                                                       \
-  V(438)                                                                       \
-  V(439)                                                                       \
-  V(440)                                                                       \
-  V(441)                                                                       \
-  V(442)                                                                       \
-  V(443)                                                                       \
-  V(444)                                                                       \
-  V(445)                                                                       \
-  V(446)                                                                       \
-  V(447)                                                                       \
-  V(448)                                                                       \
-  V(449)                                                                       \
-  V(450)                                                                       \
-  V(451)                                                                       \
-  V(452)                                                                       \
-  V(453)                                                                       \
-  V(454)                                                                       \
-  V(455)                                                                       \
-  V(456)                                                                       \
-  V(457)                                                                       \
-  V(458)                                                                       \
-  V(459)                                                                       \
-  V(460)                                                                       \
-  V(461)                                                                       \
-  V(462)                                                                       \
-  V(463)                                                                       \
-  V(464)                                                                       \
-  V(465)                                                                       \
-  V(466)                                                                       \
-  V(467)                                                                       \
-  V(468)                                                                       \
-  V(469)                                                                       \
-  V(470)                                                                       \
-  V(471)                                                                       \
-  V(472)                                                                       \
-  V(473)                                                                       \
-  V(474)                                                                       \
-  V(475)                                                                       \
-  V(476)                                                                       \
-  V(477)                                                                       \
-  V(478)                                                                       \
-  V(479)                                                                       \
-  V(480)                                                                       \
-  V(481)                                                                       \
-  V(482)                                                                       \
-  V(483)                                                                       \
-  V(484)                                                                       \
-  V(485)                                                                       \
-  V(486)                                                                       \
-  V(487)                                                                       \
-  V(488)                                                                       \
-  V(489)                                                                       \
-  V(490)                                                                       \
-  V(491)                                                                       \
-  V(492)                                                                       \
-  V(493)                                                                       \
-  V(494)                                                                       \
-  V(495)                                                                       \
-  V(496)                                                                       \
-  V(497)                                                                       \
-  V(498)                                                                       \
-  V(499)                                                                       \
-  V(500)                                                                       \
-  V(501)                                                                       \
-  V(502)                                                                       \
-  V(503)                                                                       \
-  V(504)                                                                       \
-  V(505)                                                                       \
-  V(506)                                                                       \
-  V(507)                                                                       \
-  V(508)                                                                       \
-  V(509)                                                                       \
-  V(510)                                                                       \
-  V(511)
-
-REPEAT_512(FINALIZER_CROSS_GEN_TEST_CASE)
-
 ISOLATE_UNIT_TEST_CASE(MirrorReference) {
   const MirrorReference& reference =
       MirrorReference::Handle(MirrorReference::New(Object::Handle()));
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 82e1bf8..eb83d68 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -552,8 +552,6 @@
 COMPRESSED_VISITOR(RegExp)
 COMPRESSED_VISITOR(WeakProperty)
 COMPRESSED_VISITOR(WeakReference)
-COMPRESSED_VISITOR(Finalizer)
-COMPRESSED_VISITOR(FinalizerEntry)
 COMPRESSED_VISITOR(MirrorReference)
 COMPRESSED_VISITOR(UserTag)
 REGULAR_VISITOR(SubtypeTestCache)
@@ -596,7 +594,6 @@
 UNREACHABLE_VISITOR(CallSiteData)
 UNREACHABLE_VISITOR(TypedDataBase)
 UNREACHABLE_VISITOR(Error)
-UNREACHABLE_VISITOR(FinalizerBase)
 UNREACHABLE_VISITOR(Number)
 UNREACHABLE_VISITOR(Integer)
 UNREACHABLE_VISITOR(String)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 2142cd4..5a084c5 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -623,20 +623,6 @@
     }
   }
 
-  template <typename type,
-            typename compressed_type,
-            std::memory_order order = std::memory_order_relaxed>
-  type ExchangeCompressedPointer(compressed_type const* addr, type value) {
-    compressed_type previous_value =
-        reinterpret_cast<std::atomic<compressed_type>*>(
-            const_cast<compressed_type*>(addr))
-            ->exchange(static_cast<compressed_type>(value), order);
-    if (value.IsHeapObject()) {
-      CheckHeapPointerStore(value, Thread::Current());
-    }
-    return static_cast<type>(previous_value.Decompress(heap_base()));
-  }
-
   template <std::memory_order order = std::memory_order_relaxed>
   SmiPtr LoadSmi(SmiPtr const* addr) const {
     return reinterpret_cast<std::atomic<SmiPtr>*>(const_cast<SmiPtr*>(addr))
@@ -3279,7 +3265,7 @@
 class UntaggedWeakProperty : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
 
-  COMPRESSED_POINTER_FIELD(ObjectPtr, key)  // Weak reference.
+  COMPRESSED_POINTER_FIELD(ObjectPtr, key)
   VISIT_FROM(key)
   COMPRESSED_POINTER_FIELD(ObjectPtr, value)
   VISIT_TO(value)
@@ -3287,10 +3273,8 @@
 
   // Linked list is chaining all pending weak properties. Not visited by
   // pointer visitors.
-  COMPRESSED_POINTER_FIELD(WeakPropertyPtr, next_seen_by_gc)
+  CompressedWeakPropertyPtr next_;
 
-  template <typename Type, typename PtrType>
-  friend struct GCLinkedList;
   friend class GCMarker;
   template <bool>
   friend class MarkingVisitorBase;
@@ -3304,7 +3288,7 @@
 class UntaggedWeakReference : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakReference);
 
-  COMPRESSED_POINTER_FIELD(ObjectPtr, target)  // Weak reference.
+  COMPRESSED_POINTER_FIELD(ObjectPtr, target)
   VISIT_FROM(target)
   COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, type_arguments)
   VISIT_TO(type_arguments)
@@ -3312,10 +3296,8 @@
 
   // Linked list is chaining all pending weak properties. Not visited by
   // pointer visitors.
-  COMPRESSED_POINTER_FIELD(WeakReferencePtr, next_seen_by_gc)
+  CompressedWeakReferencePtr next_;
 
-  template <typename Type, typename PtrType>
-  friend struct GCLinkedList;
   friend class GCMarker;
   template <bool>
   friend class MarkingVisitorBase;
@@ -3326,92 +3308,6 @@
   friend class SlowObjectCopy;  // For OFFSET_OF
 };
 
-class UntaggedFinalizerBase : public UntaggedInstance {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(FinalizerBase);
-
-  // The isolate this finalizer belongs to. Updated on sent and exit and set
-  // to null on isolate shutdown. See Isolate::finalizers_.
-  Isolate* isolate_;
-
-  COMPRESSED_POINTER_FIELD(ObjectPtr, detachments)
-  VISIT_FROM(detachments)
-  COMPRESSED_POINTER_FIELD(LinkedHashSetPtr, all_entries)
-  COMPRESSED_POINTER_FIELD(FinalizerEntryPtr, entries_collected)
-
-// With compressed pointers, the first field in a subclass is at offset 28.
-// If the fields would be public, the first field in a subclass is at offset 32.
-// On Windows, it is always at offset 32, no matter public/private.
-// This makes it 32 for all OSes.
-// We can't use ALIGN8 on the first fields of the subclasses because they use
-// the COMPRESSED_POINTER_FIELD macro to define it.
-#ifdef DART_COMPRESSED_POINTERS
-  uint32_t align_next_field;
-#endif
-
-  template <typename GCVisitorType>
-  friend void MournFinalized(GCVisitorType* visitor);
-  friend class GCMarker;
-  template <bool>
-  friend class MarkingVisitorBase;
-  friend class Scavenger;
-  template <bool>
-  friend class ScavengerVisitorBase;
-};
-
-class UntaggedFinalizer : public UntaggedFinalizerBase {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(Finalizer);
-
-  COMPRESSED_POINTER_FIELD(ClosurePtr, callback)
-  COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, type_arguments)
-  VISIT_TO(type_arguments)
-
-  template <std::memory_order order = std::memory_order_relaxed>
-  FinalizerEntryPtr exchange_entries_collected(FinalizerEntryPtr value) {
-    return ExchangeCompressedPointer<FinalizerEntryPtr,
-                                     CompressedFinalizerEntryPtr, order>(
-        &entries_collected_, value);
-  }
-
-  template <typename GCVisitorType>
-  friend void MournFinalized(GCVisitorType* visitor);
-  friend class GCMarker;
-  template <bool>
-  friend class MarkingVisitorBase;
-  friend class Scavenger;
-  template <bool>
-  friend class ScavengerVisitorBase;
-};
-
-class UntaggedFinalizerEntry : public UntaggedInstance {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(FinalizerEntry);
-
-  COMPRESSED_POINTER_FIELD(ObjectPtr, value)  // Weak reference.
-  VISIT_FROM(value)
-  COMPRESSED_POINTER_FIELD(ObjectPtr, detach)  // Weak reference.
-  COMPRESSED_POINTER_FIELD(ObjectPtr, token)
-  COMPRESSED_POINTER_FIELD(FinalizerBasePtr, finalizer)  // Weak reference.
-  // Used for the linked list in Finalizer::entries_collected_. That cannot be
-  // an ordinary list because we need to add elements during a GC so we cannot
-  // modify the heap.
-  COMPRESSED_POINTER_FIELD(FinalizerEntryPtr, next)
-  VISIT_TO(next)
-
-  // Linked list is chaining all pending. Not visited by pointer visitors.
-  // Only populated during the GC, otherwise null.
-  COMPRESSED_POINTER_FIELD(FinalizerEntryPtr, next_seen_by_gc)
-
-  template <typename Type, typename PtrType>
-  friend struct GCLinkedList;
-  template <typename GCVisitorType>
-  friend void MournFinalized(GCVisitorType* visitor);
-  friend class GCMarker;
-  template <bool>
-  friend class MarkingVisitorBase;
-  friend class Scavenger;
-  template <bool>
-  friend class ScavengerVisitorBase;
-};
-
 // MirrorReferences are used by mirrors to hold reflectees that are VM
 // internal objects, such as libraries, classes, functions or types.
 class UntaggedMirrorReference : public UntaggedInstance {
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 7953a1f..7784041 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -137,8 +137,6 @@
   V(FfiVoid, "Void")                                                           \
   V(FfiHandle, "Handle")                                                       \
   V(Field, "Field")                                                            \
-  V(FinalizerBase, "FinalizerBase")                                            \
-  V(FinalizerEntry, "FinalizerEntry")                                          \
   V(FinallyRetVal, ":finally_ret_val")                                         \
   V(FirstArg, "x")                                                             \
   V(Float32List, "Float32List")                                                \
@@ -310,7 +308,6 @@
   V(_ExternalUint64Array, "_ExternalUint64Array")                              \
   V(_ExternalUint8Array, "_ExternalUint8Array")                                \
   V(_ExternalUint8ClampedArray, "_ExternalUint8ClampedArray")                  \
-  V(_FinalizerImpl, "_FinalizerImpl")                                          \
   V(_Float32ArrayFactory, "Float32List.")                                      \
   V(_Float32ArrayView, "_Float32ArrayView")                                    \
   V(_Float32List, "_Float32List")                                              \
@@ -410,7 +407,6 @@
   V(_ensureScheduleImmediate, "_ensureScheduleImmediate")                      \
   V(_future, "_future")                                                        \
   V(_handleMessage, "_handleMessage")                                          \
-  V(_handleFinalizerMessage, "_handleFinalizerMessage")                        \
   V(_instanceOf, "_instanceOf")                                                \
   V(_listGetAt, "_listGetAt")                                                  \
   V(_listLength, "_listLength")                                                \
diff --git a/runtime/vm/tagged_pointer.h b/runtime/vm/tagged_pointer.h
index 5a0b99f..0f53fe7 100644
--- a/runtime/vm/tagged_pointer.h
+++ b/runtime/vm/tagged_pointer.h
@@ -413,9 +413,6 @@
 DEFINE_TAGGED_POINTER(RegExp, Instance)
 DEFINE_TAGGED_POINTER(WeakProperty, Instance)
 DEFINE_TAGGED_POINTER(WeakReference, Instance)
-DEFINE_TAGGED_POINTER(FinalizerBase, Instance)
-DEFINE_TAGGED_POINTER(Finalizer, Instance)
-DEFINE_TAGGED_POINTER(FinalizerEntry, Instance)
 DEFINE_TAGGED_POINTER(MirrorReference, Instance)
 DEFINE_TAGGED_POINTER(UserTag, Instance)
 DEFINE_TAGGED_POINTER(FutureOr, Instance)
diff --git a/sdk/lib/_internal/vm/lib/core_patch.dart b/sdk/lib/_internal/vm/lib/core_patch.dart
index 79ff4aa..78b3bab 100644
--- a/sdk/lib/_internal/vm/lib/core_patch.dart
+++ b/sdk/lib/_internal/vm/lib/core_patch.dart
@@ -13,14 +13,10 @@
     show
         allocateOneByteString,
         allocateTwoByteString,
-        checkValidWeakTarget,
         ClassID,
         CodeUnits,
         copyRangeFromUint8ListToOneByteString,
         EfficientLengthIterable,
-        FinalizerBase,
-        FinalizerBaseMembers,
-        FinalizerEntry,
         FixedLengthListBase,
         IterableElementError,
         ListIterator,
@@ -32,12 +28,11 @@
         makeFixedListUnmodifiable,
         makeListFixedLength,
         patch,
-        reachabilityFence,
         unsafeCast,
         writeIntoOneByteString,
         writeIntoTwoByteString;
 
-import "dart:async" show Completer, DeferredLoadException, Future, Timer, Zone;
+import "dart:async" show Completer, DeferredLoadException, Future, Timer;
 
 import "dart:collection"
     show
@@ -54,9 +49,9 @@
 
 import "dart:convert" show ascii, Encoding, json, latin1, utf8;
 
-import "dart:ffi" show Pointer, Struct, Union, NativePort;
+import "dart:ffi" show Pointer, Struct, Union;
 
-import "dart:isolate" show Isolate, RawReceivePort;
+import "dart:isolate" show Isolate;
 
 import "dart:typed_data"
     show Endian, Uint8List, Int64List, Uint16List, Uint32List;
diff --git a/sdk/lib/_internal/vm/lib/expando_patch.dart b/sdk/lib/_internal/vm/lib/expando_patch.dart
index fd5bd93..cf34b7f 100644
--- a/sdk/lib/_internal/vm/lib/expando_patch.dart
+++ b/sdk/lib/_internal/vm/lib/expando_patch.dart
@@ -28,8 +28,7 @@
 
   @patch
   T? operator [](Object object) {
-    // TODO(http://dartbug.com/48634): Rename to `key`.
-    checkValidWeakTarget(object, 'object');
+    _checkType(object);
 
     var mask = _size - 1;
     var idx = object._identityHashCode & mask;
@@ -51,8 +50,7 @@
 
   @patch
   void operator []=(Object object, T? value) {
-    // TODO(http://dartbug.com/48634): Rename to `key`.
-    checkValidWeakTarget(object, 'object');
+    _checkType(object);
 
     var mask = _size - 1;
     var idx = object._identityHashCode & mask;
@@ -149,6 +147,19 @@
     }
   }
 
+  static _checkType(object) {
+    if ((object == null) ||
+        (object is bool) ||
+        (object is num) ||
+        (object is String) ||
+        (object is Pointer) ||
+        (object is Struct) ||
+        (object is Union)) {
+      throw new ArgumentError.value(object,
+          "Expandos are not allowed on strings, numbers, booleans, null, Pointers, Structs or Unions.");
+    }
+  }
+
   int get _size => _data.length;
   int get _limit => (3 * (_size ~/ 4));
 
@@ -159,14 +170,14 @@
 @patch
 class WeakReference<T extends Object> {
   @patch
-  factory WeakReference(T target) = _WeakReferenceImpl<T>;
+  factory WeakReference(T object) = _WeakReferenceImpl<T>;
 }
 
 @pragma("vm:entry-point")
 class _WeakReferenceImpl<T extends Object> implements WeakReference<T> {
-  _WeakReferenceImpl(T target) {
-    checkValidWeakTarget(target, 'target');
-    _target = target;
+  _WeakReferenceImpl(T object) {
+    Expando._checkType(object);
+    _target = object;
   }
 
   @pragma("vm:recognized", "other")
@@ -179,3 +190,11 @@
   @pragma("vm:external-name", "WeakReference_setTarget")
   external set _target(T? value);
 }
+
+@patch
+class Finalizer<T> {
+  @patch
+  factory Finalizer(void Function(T) object) {
+    throw UnimplementedError("Finalizer");
+  }
+}
diff --git a/sdk/lib/_internal/vm/lib/finalizer_patch.dart b/sdk/lib/_internal/vm/lib/finalizer_patch.dart
index a9db853..aec537b 100644
--- a/sdk/lib/_internal/vm/lib/finalizer_patch.dart
+++ b/sdk/lib/_internal/vm/lib/finalizer_patch.dart
@@ -4,83 +4,5 @@
 
 // part of "core_patch.dart";
 
-@patch
-@pragma("vm:entry-point")
-abstract class Finalizer<T> {
-  @patch
-  factory Finalizer(void Function(T) callback) = _FinalizerImpl<T>;
-}
-
-@pragma("vm:entry-point")
-class _FinalizerImpl<T> extends FinalizerBase implements Finalizer<T> {
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external void Function(T) get _callback;
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external set _callback(void Function(T) value);
-
-  /// Constructs a finalizer.
-  ///
-  /// This is fine as a non-atomic operation, because the GC only looks at
-  /// finalizer instances when it process their entries. By preventing inlining
-  /// we ensure the the finalizer to have been fully initialized by the time
-  /// any [attach] on it is called.
-  ///
-  /// Alternatively, we could make it a recognized method and add a reachability
-  /// fence on the relevant members.
-  @pragma('vm:never-inline')
-  _FinalizerImpl(void Function(T) callback) {
-    allEntries = <FinalizerEntry>{};
-    _callback = Zone.current.bindUnaryCallbackGuarded(callback);
-    setIsolate();
-    isolateRegisterFinalizer();
-  }
-
-  void attach(Object value, T token, {Object? detach}) {
-    checkValidWeakTarget(value, 'value');
-    if (detach != null) {
-      checkValidWeakTarget(detach, 'detach');
-    }
-
-    // Initializing the entry in a non-atomic way should be fine.
-    // The only interesting step in the GC is when value is collected.
-    // If the entry gets processed before initializing value, it will be null,
-    // and this is fine. We will not consider it as being collected that GC.
-    final entry = FinalizerEntry()
-      ..value = value
-      ..token = token
-      ..detach = detach
-      ..finalizer = this;
-    allEntries.add(entry);
-    // Ensure value stays reachable until after having initialized the entry.
-    // This ensures the token and finalizer are set.
-    reachabilityFence(value);
-
-    if (detach != null) {
-      (detachments[detach] ??= <FinalizerEntry>{}).add(entry);
-    }
-  }
-
-  void _runFinalizers() {
-    FinalizerEntry? entry = exchangeEntriesCollectedWithNull();
-    while (entry != null) {
-      final token = entry.token;
-      // Check token for identical, detach might have been called.
-      if (!identical(token, entry)) {
-        _callback(unsafeCast<T>(token));
-      }
-      allEntries.remove(entry);
-      final detach = entry.detach;
-      if (detach != null) {
-        detachments[detach]?.remove(entry);
-      }
-      entry = entry.next;
-    }
-  }
-
-  @pragma("vm:entry-point", "call")
-  static _handleFinalizerMessage(_FinalizerImpl finalizer) {
-    finalizer._runFinalizers();
-  }
-}
+// This is a placeholder file which will shortly contain a Finalizer
+// implementation.
diff --git a/sdk/lib/_internal/vm/lib/internal_patch.dart b/sdk/lib/_internal/vm/lib/internal_patch.dart
index 547835c..4c0fa92 100644
--- a/sdk/lib/_internal/vm/lib/internal_patch.dart
+++ b/sdk/lib/_internal/vm/lib/internal_patch.dart
@@ -9,7 +9,7 @@
 
 import "dart:async" show Timer;
 import "dart:core" hide Symbol;
-import "dart:ffi" show Pointer, Struct, Union;
+
 import "dart:isolate" show SendPort;
 import "dart:typed_data" show Int32List, Uint8List;
 
@@ -209,225 +209,3 @@
     throw new LateError.localADI(localName);
   }
 }
-
-void checkValidWeakTarget(object, name) {
-  if ((object == null) ||
-      (object is bool) ||
-      (object is num) ||
-      (object is String) ||
-      (object is Pointer) ||
-      (object is Struct) ||
-      (object is Union)) {
-    throw new ArgumentError.value(object, name,
-        "Cannot be a string, number, boolean, null, Pointer, Struct or Union");
-  }
-}
-
-@pragma("vm:entry-point")
-class FinalizerBase {
-  /// The list of finalizers of this isolate.
-  ///
-  /// Reuses [WeakReference] so that we don't have to implement yet another
-  /// mechanism to hold on weakly to things.
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external static List<WeakReference<FinalizerBase>>? get _isolateFinalizers;
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external static set _isolateFinalizers(
-      List<WeakReference<FinalizerBase>>? value);
-
-  static int _isolateFinalizersPurgeCollectedAt = 1;
-
-  /// Amortizes the cost for purging nulled out entries.
-  ///
-  /// Similar to how Expandos purge their nulled out entries on a rehash when
-  /// resizing.
-  static void _isolateFinalizersEnsureCapacity() {
-    _isolateFinalizers ??= <WeakReference<FinalizerBase>>[];
-    if (_isolateFinalizers!.length < _isolateFinalizersPurgeCollectedAt) {
-      return;
-    }
-    // retainWhere does a single traversal.
-    _isolateFinalizers!.retainWhere((weak) => weak.target != null);
-    // We might have dropped most finalizers, trigger next resize at 2x.
-    _isolateFinalizersPurgeCollectedAt = _isolateFinalizers!.length * 2;
-  }
-
-  /// Registers this [FinalizerBase] to the isolate.
-  ///
-  /// This is used to prevent sending messages from the GC to the isolate after
-  /// isolate shutdown.
-  void _isolateRegisterFinalizer() {
-    _isolateFinalizersEnsureCapacity();
-    _isolateFinalizers!.add(WeakReference(this));
-  }
-
-  /// The isolate this [FinalizerBase] belongs to.
-  ///
-  /// This is used to send finalizer messages to `_handleFinalizerMessage`
-  /// without a Dart_Port.
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external _setIsolate();
-
-  /// All active attachments.
-  ///
-  /// This keeps the [FinalizerEntry]s belonging to this finalizer alive. If an
-  /// entry gets collected, the finalizer is not run when the
-  /// [FinalizerEntry.value] is collected.
-  ///
-  /// TODO(http://dartbug.com/47777): For native finalizers, what data structure
-  /// can we use that we can modify in the VM. So that we don't have to send a
-  /// message to Dart to clean up entries for which the GC has run.
-  ///
-  /// Requirements for data structure:
-  /// 1. Keeps entries reachable. Entries that are collected will never run
-  ///    the GC.
-  /// 2. Atomic insert in Dart on `attach`. GC should not run in between.
-  /// 3. Atomic remove in Dart on `detach`. multiple GC tasks run in parallel.
-  /// 4. Atomic remove in C++ on value being collected. Multiple GC tasks run in
-  ///    parallel.
-  ///
-  /// For Dart finalizers we execute the remove in Dart, much simpler.
-  @pragma("vm:recognized", "other")
-  @pragma('vm:prefer-inline')
-  external Set<FinalizerEntry> get _allEntries;
-  @pragma("vm:recognized", "other")
-  @pragma('vm:prefer-inline')
-  external set _allEntries(Set<FinalizerEntry> entries);
-
-  /// Entries of which the value has been collected.
-  ///
-  /// This is a linked list, with [FinalizerEntry.next].
-  ///
-  /// Atomic exchange: The GC cannot run between reading the value and storing
-  /// `null`. Atomicity guaranteed by force optimizing the function.
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external FinalizerEntry? _exchangeEntriesCollectedWithNull();
-
-  /// A weak map from `detach` keys to [FinalizerEntry]s.
-  ///
-  /// Using the [FinalizerEntry.detach] keys as keys in an [Expando] ensures
-  /// they can be GCed.
-  ///
-  /// [FinalizerEntry]s do not get GCed themselves when their
-  /// [FinalizerEntry.detach] is unreachable, in contrast to `WeakProperty`s
-  /// which are GCed themselves when their `key` is no longer reachable.
-  /// To prevent [FinalizerEntry]s staying around in [_detachments] forever,
-  /// we reuse `WeakProperty`s.
-  /// To avoid code duplication, we do not inline the code but use an [Expando]
-  /// here instead.
-  ///
-  /// We cannot eagerly purge entries from the map (in the Expando) when GCed.
-  /// The map is indexed on detach, and doesn't enable finding the entries
-  /// based on their identity.
-  /// Instead we rely on the WeakProperty being nulled out (assuming the
-  /// `detach` key gets GCed) and then reused.
-  @pragma("vm:recognized", "other")
-  @pragma('vm:prefer-inline')
-  external Expando<Set<FinalizerEntry>>? get _detachments;
-  @pragma("vm:recognized", "other")
-  @pragma('vm:prefer-inline')
-  external set _detachments(Expando<Set<FinalizerEntry>>? value);
-
-  void detach(Object detach) {
-    final entries = detachments[detach];
-    if (entries != null) {
-      for (final entry in entries) {
-        entry.token = entry;
-        _allEntries.remove(entry);
-      }
-      detachments[detach] = null;
-    }
-  }
-}
-
-// Extension so that the members can be accessed from other libs.
-extension FinalizerBaseMembers on FinalizerBase {
-  /// See documentation on [_allEntries].
-  @pragma('vm:prefer-inline')
-  Set<FinalizerEntry> get allEntries => _allEntries;
-  @pragma('vm:prefer-inline')
-  set allEntries(Set<FinalizerEntry> value) => _allEntries = value;
-
-  /// See documentation on [_exchangeEntriesCollectedWithNull].
-  FinalizerEntry? exchangeEntriesCollectedWithNull() =>
-      _exchangeEntriesCollectedWithNull();
-
-  /// See documentation on [_detachments].
-  @pragma('vm:prefer-inline')
-  Expando<Set<FinalizerEntry>> get detachments {
-    _detachments ??= Expando<Set<FinalizerEntry>>();
-    return unsafeCast<Expando<Set<FinalizerEntry>>>(_detachments);
-  }
-
-  /// See documentation on [_isolateRegisterFinalizer].
-  isolateRegisterFinalizer() => _isolateRegisterFinalizer();
-
-  /// See documentation on [_setIsolate].
-  setIsolate() => _setIsolate();
-}
-
-/// Contains the informatation of an active [Finalizer.attach].
-///
-/// It holds on to the [value], optional [detach], and [token]. In addition, it
-/// also keeps a reference the [finalizer] it belings to and a [next] field for
-/// when being used in a linked list.
-///
-/// This is being kept alive by [FinalizerBase._allEntries] until either (1)
-/// [Finalizer.detach] detaches it, or (2) [value] is collected and the
-/// `callback` has been invoked.
-///
-/// Note that the GC itself uses an extra hidden field `next_seen_by_gc` to keep a
-/// linked list of pending entries while running the GC.
-@pragma("vm:entry-point")
-class FinalizerEntry {
-  /// The [value] the [FinalizerBase] is attached to.
-  ///
-  /// Set to `null` by GC when unreachable.
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external Object? get value;
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external set value(Object? value);
-
-  /// The [detach] object can be passed to [FinalizerBase] to detach
-  /// the finalizer.
-  ///
-  /// Set to `null` by GC when unreachable.
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external Object? get detach;
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external set detach(Object? value);
-
-  /// The [token] is passed to [FinalizerBase] when the finalizer is run.
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external Object? get token;
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external set token(Object? value);
-
-  /// The [finalizer] this [FinalizerEntry] belongs to.
-  ///
-  /// Set to `null` by GC when unreachable.
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external set finalizer(FinalizerBase? finalizer);
-
-  /// The [next] entry in a linked list.
-  ///
-  /// Used in for the linked list starting from
-  /// [FinalizerBase._exchangeEntriesCollectedWithNull].
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external FinalizerEntry? get next;
-  @pragma("vm:recognized", "other")
-  @pragma("vm:prefer-inline")
-  external set next(FinalizerEntry? value);
-}
diff --git a/sdk/lib/_internal/wasm/lib/internal_patch.dart b/sdk/lib/_internal/wasm/lib/internal_patch.dart
index 3cd8846..444a8ad 100644
--- a/sdk/lib/_internal/wasm/lib/internal_patch.dart
+++ b/sdk/lib/_internal/wasm/lib/internal_patch.dart
@@ -84,6 +84,12 @@
 // Important: this is unsafe and must be used with care.
 external T unsafeCast<T>(Object? v);
 
+// This function can be used to keep an object alive till that point.
+void reachabilityFence(Object? object) {}
+
+// This function can be used to encode native side effects.
+external void _nativeEffect(Object object);
+
 // Thomas Wang 64-bit mix.
 // https://gist.github.com/badboy/6267743
 int mix64(int n) {
diff --git a/sdk/lib/core/weak.dart b/sdk/lib/core/weak.dart
index 3c8f968..01ef31c 100644
--- a/sdk/lib/core/weak.dart
+++ b/sdk/lib/core/weak.dart
@@ -207,15 +207,15 @@
   /// with different, or the same, finalization token.
   void attach(Object value, T finalizationToken, {Object? detach});
 
-  /// Detaches this finalizer from values attached with [detach].
+  /// Detaches the finalizer from values attached with [detachToken].
   ///
   /// Each attachment between this finalizer and a value,
-  /// which was created by calling [attach] with the [detach] object as
+  /// which was created by calling [attach] with the [detachToken] object as
   /// `detach` argument, is removed.
   ///
   /// If the finalizer was attached multiple times to the same value
   /// with different detachment keys,
-  /// only those attachments which used [detach] are removed.
+  /// only those attachments which used [detachToken] are removed.
   ///
   /// After detaching, an attachment won't cause any callbacks to happen
   /// if the object become inaccessible.
@@ -242,5 +242,5 @@
   ///   }
   /// }
   /// ```
-  void detach(Object detach);
+  void detach(Object detachToken);
 }
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index 968c555..0d4d5b7 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -39,6 +39,7 @@
 
 /// Represents a pointer into the native C memory. Cannot be extended.
 @pragma('vm:entry-point')
+@pragma("wasm:entry-point")
 class Pointer<T extends NativeType> extends NativeType {
   /// Construction from raw integer.
   external factory Pointer.fromAddress(int ptr);
diff --git a/sdk/lib/ffi/struct.dart b/sdk/lib/ffi/struct.dart
index 0a249f8..c02a059 100644
--- a/sdk/lib/ffi/struct.dart
+++ b/sdk/lib/ffi/struct.dart
@@ -8,6 +8,7 @@
 ///
 /// FFI struct types should extend [Struct]. For more information see the
 /// documentation on this class.
+@pragma("wasm:entry-point")
 abstract class _Compound extends NativeType {
   @pragma("vm:entry-point")
   final Object _typedDataBase;
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 6b2b940..96ef3e5 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -723,7 +723,6 @@
   ///     therefore not be sent.
   ///   - [ReceivePort]
   ///   - [DynamicLibrary]
-  ///   - [Finalizer]
   ///   - [Pointer]
   ///   - [UserTag]
   ///   - `MirrorReference`
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index b05ae57..6e19316 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -215,6 +215,20 @@
           "_internal/wasm/lib/developer.dart"
         ]
       },
+      "ffi": {
+        "uri": "ffi/ffi.dart",
+        "patches": [
+          "_internal/vm/lib/ffi_patch.dart",
+          "_internal/vm/lib/ffi_allocation_patch.dart",
+          "_internal/vm/lib/ffi_dynamic_library_patch.dart",
+          "_internal/vm/lib/ffi_native_finalizer_patch.dart",
+          "_internal/vm/lib/ffi_native_type_patch.dart",
+          "_internal/vm/lib/ffi_struct_patch.dart"
+        ]
+      },
+      "nativewrappers": {
+        "uri": "html/dartium/nativewrappers.dart"
+      },
       "isolate": {
         "uri": "isolate/isolate.dart"
       },
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index d4e109f..5c55e5a 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -203,6 +203,17 @@
       uri: developer/developer.dart
       patches:
       - _internal/wasm/lib/developer.dart
+    ffi:
+      uri: "ffi/ffi.dart"
+      patches:
+        - "_internal/vm/lib/ffi_patch.dart"
+        - "_internal/vm/lib/ffi_allocation_patch.dart"
+        - "_internal/vm/lib/ffi_dynamic_library_patch.dart"
+        - "_internal/vm/lib/ffi_native_finalizer_patch.dart"
+        - "_internal/vm/lib/ffi_native_type_patch.dart"
+        - "_internal/vm/lib/ffi_struct_patch.dart"
+    nativewrappers:
+      uri: "html/dartium/nativewrappers.dart"
     isolate:
       uri: isolate/isolate.dart
     math:
diff --git a/tools/VERSION b/tools/VERSION
index 74cb2d0..3c727f4 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 227
+PRERELEASE 228
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 0fd686d..012b604 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -125,6 +125,9 @@
   macros:
     help: "Static meta-programming"
 
+  inference-update-1:
+    help: "Enhanced type inference"
+
 # Experiment flag only used for testing.
   test-experiment:
     help: >-