Version 2.17.0-4.0.dev

Merge commit '1bf93d73a1076223dad79c9af9113de368089436' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index e059e45..8804c02 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -1,6 +1,6 @@
 {
   "copyright": [
-    "Copyright (c) 2021, the Dart project authors. Please see the AUTHORS ",
+    "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."
   ],
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-12-22T16:24:00.538300",
+  "generated": "2022-01-11T09:53:34.372475",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -316,7 +316,7 @@
       "name": "fixnum",
       "rootUri": "../third_party/pkg/fixnum",
       "packageUri": "lib/",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     },
     {
       "name": "front_end",
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7428a56..b72adbc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,11 @@
 - Add `Finalizer` and `WeakReference` which can potentially detect when
   objects are "garbage collected".
 
+#### `dart:indexed_db`
+
+- `IdbFactory.supportsDatabaseNames` has been deprecated. It will always return
+  `false`.
+
 ## 2.16.0
 
 ### Core libraries
@@ -17,11 +22,6 @@
   error with an existing stack trace, instead of creating
   a new stack trace.
 
-#### `dart:indexed_db`
-
-- `IdbFactory.supportsDatabaseNames` has been deprecated. It will always return
-  `false`.
-
 #### `dart:io`
 
 - **Breaking Change** [#47653](https://github.com/dart-lang/sdk/issues/47653):
diff --git a/DEPS b/DEPS
index f89e94c..9951d90 100644
--- a/DEPS
+++ b/DEPS
@@ -112,7 +112,7 @@
   "dartdoc_rev" : "66ee9a81b3bab35adcda18274b7d69567c98c3c6",
   "devtools_rev" : "85932bb66aa782c4b2c528be7718960bf256ffb7",
   "ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
-  "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
+  "fixnum_rev": "848341f061359ef7ddc0cad472c2ecbb036b28ac",
   "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
   "glob_rev": "a62acf590598f458d3198d9f2930c1c9dd4b1379",
   "html_rev": "00cd3c22dac0e68e6ed9e7e4945101aedb1b3109",
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 9a4c5a3..2c3a578 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -307,14 +307,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 4)
-      ..assertLibrariesToImport(includes: [
-        'dart:math',
-      ], excludes: [
-        'dart:async',
-        'dart:core',
-        'package:test/test.dart',
-      ]);
+      ..hasReplacement(left: 4);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
@@ -338,10 +331,6 @@
     check(response)
       ..assertIncomplete()
       ..hasReplacement(left: 4)
-      ..assertLibrariesToImport(includes: [], excludes: [
-        'dart:core',
-        'dart:math',
-      ])
       ..suggestions.withElementClass.isEmpty;
   }
 
@@ -386,14 +375,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 2)
-      ..assertLibrariesToImport(includes: [
-        'package:aaa/f.dart',
-      ], excludes: [
-        'dart:core',
-        'package:bbb/f.dart',
-        'package:test/test.dart',
-      ]);
+      ..hasReplacement(left: 2);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
@@ -447,14 +429,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 2)
-      ..assertLibrariesToImport(includes: [
-        'package:aaa/f.dart',
-        'package:bbb/f.dart',
-      ], excludes: [
-        'dart:core',
-        'package:test/test.dart',
-      ]);
+      ..hasReplacement(left: 2);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
@@ -485,16 +460,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 2)
-      ..assertLibrariesToImport(includes: [
-        'package:test/a.dart',
-        'package:test/b.dart',
-      ], excludes: [
-        'dart:async',
-        'dart:core',
-        'dart:math',
-        'package:test/test.dart',
-      ]);
+      ..hasReplacement(left: 2);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
@@ -528,16 +494,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 2)
-      ..assertLibrariesToImport(includes: [
-        'package:test/b.dart',
-      ], excludes: [
-        'dart:async',
-        'dart:core',
-        'dart:math',
-        'package:test/a.dart',
-        'package:test/test.dart',
-      ]);
+      ..hasReplacement(left: 2);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
@@ -574,16 +531,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 2)
-      ..assertLibrariesToImport(includes: [
-        'package:test/a.dart',
-        'package:test/b.dart',
-      ], excludes: [
-        'dart:async',
-        'dart:core',
-        'dart:math',
-        'package:test/test.dart',
-      ]);
+      ..hasReplacement(left: 2);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
@@ -607,7 +555,7 @@
 class A01 {}
 ''');
 
-    var b = newFile('$testPackageTestPath/b.dart', content: '''
+    newFile('$testPackageTestPath/b.dart', content: '''
 class A02 {}
 ''');
 
@@ -621,14 +569,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 2)
-      ..assertLibrariesToImport(includes: [
-        'package:test/a.dart',
-      ], excludes: [
-        'dart:core',
-        'package:test/test.dart',
-        toUriStr(b.path),
-      ]);
+      ..hasReplacement(left: 2);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
@@ -660,14 +601,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 2)
-      ..assertLibrariesToImport(includes: [
-        'package:test/f.dart',
-        'package:test/src/f.dart',
-      ], excludes: [
-        'dart:core',
-        'package:test/test.dart',
-      ]);
+      ..hasReplacement(left: 2);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
@@ -707,14 +641,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 2)
-      ..assertLibrariesToImport(includes: [
-        'package:test/a.dart',
-        b_uriStr,
-      ], excludes: [
-        'dart:core',
-        toUriStr(test_path),
-      ]);
+      ..hasReplacement(left: 2);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
@@ -753,14 +680,7 @@
 
     check(response)
       ..assertComplete()
-      ..hasReplacement(left: 2)
-      ..assertLibrariesToImport(includes: [
-        'package:test/f.dart',
-        'package:test/src/f.dart',
-      ], excludes: [
-        'dart:core',
-        'package:test/test.dart',
-      ]);
+      ..hasReplacement(left: 2);
 
     check(response).suggestions.withElementClass.matches([
       (suggestion) => suggestion
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_check.dart b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
index f963f06..4196283 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_check.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer_utilities/check/check.dart';
-import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
 
 class CompletionResponseForTesting {
@@ -67,18 +66,6 @@
     );
   }
 
-  CheckTarget<List<String>> get librariesToImport {
-    return nest(
-      value.suggestions
-          .where((e) => e.isNotImported == true)
-          .map((e) => e.element?.libraryUri)
-          .whereNotNull()
-          .toSet()
-          .toList(),
-      (selected) => 'has librariesToImport ${valueStr(selected)}',
-    );
-  }
-
   CheckTarget<int> get replacementLength {
     return nest(
       value.replacementLength,
@@ -114,24 +101,6 @@
     isIncomplete.isTrue;
   }
 
-  void assertLibrariesToImport({
-    required List<String> includes,
-    List<String>? excludes,
-  }) {
-    librariesToImport.includesAll(
-      includes.map(
-        (e) => (v) => v.isEqualTo(e),
-      ),
-    );
-    if (excludes != null) {
-      librariesToImport.excludesAll(
-        excludes.map(
-          (e) => (v) => v.isEqualTo(e),
-        ),
-      );
-    }
-  }
-
   /// Check that the replacement offset is the completion request offset,
   /// and the length of the replacement is zero.
   void hasEmptyReplacement() {
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 66200d1..7c3972e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -82,7 +82,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 = 196;
+  static const int DATA_VERSION = 197;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
index 27fbe85..2e58795 100644
--- a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
@@ -73,6 +73,7 @@
   void writeEnumElement(EnumElementImpl element) {
     _write('enum ');
     _write(element.displayName);
+    _writeTypeParameters(element.typeParameters);
   }
 
   void writeExecutableElement(ExecutableElement element, String name) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 1b45e50..92517cf5 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -46,6 +46,7 @@
 
 /// A concrete implementation of a [ClassElement].
 abstract class AbstractClassElementImpl extends _ExistingElementImpl
+    with TypeParameterizedElementMixin
     implements ClassElement {
   /// The type defined by the class.
   InterfaceType? _thisType;
@@ -121,6 +122,13 @@
     return _thisType!;
   }
 
+  set typeParameters(List<TypeParameterElement> typeParameters) {
+    for (TypeParameterElement typeParameter in typeParameters) {
+      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
+    }
+    _typeParameterElements = typeParameters;
+  }
+
   @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitClassElement(this);
 
@@ -411,8 +419,7 @@
 }
 
 /// An [AbstractClassElementImpl] which is a class.
-class ClassElementImpl extends AbstractClassElementImpl
-    with TypeParameterizedElementMixin {
+class ClassElementImpl extends AbstractClassElementImpl {
   /// The superclass of the class, or `null` for [Object].
   InterfaceType? _supertype;
 
@@ -761,15 +768,6 @@
     return super.typeParameters;
   }
 
-  /// Set the type parameters defined for this class to the given
-  /// [typeParameters].
-  set typeParameters(List<TypeParameterElement> typeParameters) {
-    for (TypeParameterElement typeParameter in typeParameters) {
-      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
-    }
-    _typeParameterElements = typeParameters;
-  }
-
   @override
   ConstructorElement? get unnamedConstructor {
     for (ConstructorElement element in constructors) {
@@ -2766,8 +2764,10 @@
   }
 
   @override
-  List<TypeParameterElement> get typeParameters =>
-      const <TypeParameterElement>[];
+  List<TypeParameterElement> get typeParameters {
+    linkedData?.read(this);
+    return super.typeParameters;
+  }
 
   @override
   ConstructorElement? get unnamedConstructor => null;
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index ab6cf0e..418f064 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -277,6 +277,7 @@
     element.metadata = reader._readAnnotationList(
       unitElement: element.enclosingElement,
     );
+    _readTypeParameters(reader, element.typeParameters);
 
     var indexField = element.getField('index') as FieldElementImpl;
     indexField.type = typeProvider.intType;
@@ -606,6 +607,8 @@
     );
     element.setLinkedData(reference, linkedData);
 
+    element.typeParameters = _readTypeParameters();
+
     var accessors = <PropertyAccessorElement>[];
     var fields = <FieldElement>[];
 
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 240ec16..e27a303 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -174,19 +174,21 @@
     _sink._writeStringReference(element.name);
     _resolutionSink._writeAnnotationList(element.metadata);
 
-    var valuesField = element.getField('values') as ConstFieldElementImpl;
-    _resolutionSink._writeNode(valuesField.constantInitializer!);
+    _writeTypeParameters(element.typeParameters, () {
+      var valuesField = element.getField('values') as ConstFieldElementImpl;
+      _resolutionSink._writeNode(valuesField.constantInitializer!);
 
-    _writeList(
-      element.fields.where((e) => !e.isSynthetic).toList(),
-      _writeFieldElement,
-    );
-    _writeList(
-      element.accessors.where((e) => !e.isSynthetic).toList(),
-      _writePropertyAccessorElement,
-    );
-    _writeList(element.constructors, _writeConstructorElement);
-    // _writeList(element.methods, _writeMethodElement);
+      _writeList(
+        element.fields.where((e) => !e.isSynthetic).toList(),
+        _writeFieldElement,
+      );
+      _writeList(
+        element.accessors.where((e) => !e.isSynthetic).toList(),
+        _writePropertyAccessorElement,
+      );
+      _writeList(element.constructors, _writeConstructorElement);
+      // _writeList(element.methods, _writeMethodElement);
+    });
   }
 
   void _writeExportElement(ExportElement element) {
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index d74903b..ec3ff9a 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -34,6 +34,11 @@
         _breakSelfCycles(node.typeParameters);
         _breakRawTypeCycles(element, node.typeParameters);
         _computeBounds(element, node.typeParameters);
+      } else if (node is EnumDeclaration) {
+        var element = node.declaredElement!;
+        _breakSelfCycles(node.typeParameters);
+        _breakRawTypeCycles(element, node.typeParameters);
+        _computeBounds(element, node.typeParameters);
       } else if (node is FunctionTypeAlias) {
         var element = node.declaredElement!;
         _breakSelfCycles(node.typeParameters);
@@ -56,6 +61,8 @@
         _build(node.typeParameters);
       } else if (node is ClassTypeAlias) {
         _build(node.typeParameters);
+      } else if (node is EnumDeclaration) {
+        _build(node.typeParameters);
       } else if (node is FunctionTypeAlias) {
         _build(node.typeParameters);
       } else if (node is GenericTypeAlias) {
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
index 9675fd4..8518555 100644
--- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -16,61 +16,31 @@
   final LibraryElementImpl _libraryElement;
   final TypeSystemImpl _typeSystem;
 
-  late CompilationUnitElementImpl _unitElement;
-  ClassElement? _classElement;
-  late ExecutableElement _executableElement;
-  late Scope _scope;
-
   DefaultValueResolver(this._linker, this._libraryElement)
       : _typeSystem = _libraryElement.typeSystem;
 
   void resolve() {
-    for (var unit in _libraryElement.units) {
-      _unitElement = unit as CompilationUnitElementImpl;
-
-      for (var classElement in unit.classes) {
-        _class(classElement);
-      }
-
-      for (var extensionElement in unit.extensions) {
-        _extension(extensionElement);
-      }
-
-      for (var classElement in unit.mixins) {
-        _class(classElement);
-      }
-
-      for (var element in unit.functions) {
-        _function(element);
-      }
+    for (var unitElement in _libraryElement.units.impl) {
+      _UnitContext(unitElement)
+        ..forEach(unitElement.classes, _class)
+        ..forEach(unitElement.extensions, _extension)
+        ..forEach(unitElement.functions, _executable)
+        ..forEach(unitElement.mixins, _class);
     }
   }
 
-  void _class(ClassElement classElement) {
-    _classElement = classElement;
-
-    for (var element in classElement.constructors) {
-      _constructor(element as ConstructorElementImpl);
-    }
-
-    for (var element in classElement.methods) {
-      _setScopeFromElement(element);
-      _method(element as MethodElementImpl);
-    }
-
-    _classElement = null;
+  void _class(_UnitContext context, ClassElement element) {
+    _ClassContext(context, element)
+      ..forEach(element.constructors, _constructor)
+      ..forEach(element.methods, _executable);
   }
 
-  void _constructor(ConstructorElementImpl element) {
+  void _constructor(_ClassContext context, ConstructorElement element) {
     if (element.isSynthetic) return;
-
-    _executableElement = element;
-    _setScopeFromElement(element);
-
-    _parameters(element.parameters);
+    _executable(context, element);
   }
 
-  DefaultFormalParameter? _defaultParameter(ParameterElementImpl element) {
+  DefaultFormalParameter? _defaultParameter(ParameterElement element) {
     var node = _linker.getLinkingNode(element);
     if (node is DefaultFormalParameter && node.defaultValue != null) {
       return node;
@@ -79,32 +49,21 @@
     }
   }
 
-  void _extension(ExtensionElement extensionElement) {
-    for (var element in extensionElement.methods) {
-      _setScopeFromElement(element);
-      _method(element as MethodElementImpl);
-    }
+  void _executable(_Context context, ExecutableElement element) {
+    _ExecutableContext(
+      enclosingContext: context,
+      executableElement: element,
+      scope: _scopeFromElement(element),
+    ).forEach(element.parameters, _parameter);
   }
 
-  void _function(FunctionElement element) {
-    _executableElement = element;
-    _setScopeFromElement(element);
-
-    _parameters(element.parameters);
+  void _extension(_UnitContext context, ExtensionElement element) {
+    context.forEach(element.methods, _executable);
   }
 
-  void _method(MethodElementImpl element) {
-    _executableElement = element;
-    _setScopeFromElement(element);
-
-    _parameters(element.parameters);
-  }
-
-  void _parameter(ParameterElementImpl parameter) {
+  void _parameter(_ExecutableContext context, ParameterElement parameter) {
     // If a function typed parameter, process nested parameters.
-    for (var localParameter in parameter.parameters) {
-      _parameter(localParameter as ParameterElementImpl);
-    }
+    context.forEach(parameter.parameters, _parameter);
 
     var node = _defaultParameter(parameter);
     if (node == null) return;
@@ -112,21 +71,83 @@
     var contextType = _typeSystem.eliminateTypeVariables(parameter.type);
 
     var astResolver = AstResolver(
-        _linker, _unitElement, _scope, node.defaultValue!,
-        enclosingClassElement: _classElement,
-        enclosingExecutableElement: _executableElement);
+      _linker,
+      context.unitElement,
+      context.scope,
+      node.defaultValue!,
+      enclosingClassElement: context.classElement,
+      enclosingExecutableElement: context.executableElement,
+    );
     astResolver.resolveExpression(() => node.defaultValue!,
         contextType: contextType);
   }
 
-  void _parameters(List<ParameterElement> parameters) {
-    for (var parameter in parameters) {
-      _parameter(parameter as ParameterElementImpl);
-    }
-  }
-
-  void _setScopeFromElement(Element element) {
+  Scope _scopeFromElement(Element element) {
     var node = _linker.getLinkingNode(element)!;
-    _scope = LinkingNodeContext.get(node).scope;
+    return LinkingNodeContext.get(node).scope;
+  }
+}
+
+class _ClassContext extends _Context {
+  final _UnitContext unitContext;
+
+  @override
+  final ClassElement classElement;
+
+  _ClassContext(this.unitContext, this.classElement);
+
+  @override
+  CompilationUnitElementImpl get unitElement {
+    return unitContext.unitElement;
+  }
+}
+
+abstract class _Context {
+  ClassElement? get classElement => null;
+
+  CompilationUnitElementImpl get unitElement;
+}
+
+class _ExecutableContext extends _Context {
+  final _Context enclosingContext;
+  final ExecutableElement executableElement;
+  final Scope scope;
+
+  _ExecutableContext({
+    required this.enclosingContext,
+    required this.executableElement,
+    required this.scope,
+  });
+
+  @override
+  ClassElement? get classElement => enclosingContext.classElement;
+
+  @override
+  CompilationUnitElementImpl get unitElement {
+    return enclosingContext.unitElement;
+  }
+}
+
+class _UnitContext extends _Context {
+  @override
+  final CompilationUnitElementImpl unitElement;
+
+  _UnitContext(this.unitElement);
+}
+
+extension on List<CompilationUnitElement> {
+  List<CompilationUnitElementImpl> get impl {
+    return cast();
+  }
+}
+
+extension _ContextExtension<C extends _Context> on C {
+  void forEach<T>(
+    List<T> elements,
+    void Function(C context, T element) f,
+  ) {
+    for (var element in elements) {
+      f(this, element);
+    }
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index ea24e67..44a2eb3 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -213,6 +213,31 @@
 
     var reference = _enclosingContext.addEnum(name, element);
     _libraryBuilder.localScope.declare(name, reference);
+
+    var holder = _EnclosingContext(reference, element);
+    _withEnclosing(holder, () {
+      var typeParameters = node.typeParameters;
+      if (typeParameters != null) {
+        typeParameters.accept(this);
+        element.typeParameters = holder.typeParameters;
+      }
+    });
+
+    // TODO(scheglov) implement
+    // node.extendsClause?.accept(this);
+    // node.withClause?.accept(this);
+    // node.implementsClause?.accept(this);
+
+    // TODO(scheglov) don't create a duplicate
+    {
+      var holder2 = _buildClassMembers(element, node.members);
+      element.accessors = holder2.propertyAccessors;
+      element.fields = holder2.properties.whereType<FieldElement>().toList();
+      // TODO(scheglov) implement
+      // element.methods = holder2.methods;
+    }
+
+    // TODO(scheglov) resolve field formals
   }
 
   @override
@@ -942,7 +967,7 @@
   }
 
   _EnclosingContext _buildClassMembers(
-      ElementImpl element, NodeList<ClassMember> members) {
+      ElementImpl element, List<ClassMember> members) {
     var hasConstConstructor = members.any((e) {
       return e is ConstructorDeclaration && e.constKeyword != null;
     });
@@ -956,6 +981,7 @@
 
   void _buildClassOrMixin(ClassOrMixinDeclaration node) {
     var element = node.declaredElement as ClassElementImpl;
+    // TODO(scheglov) don't create a duplicate
     var holder = _buildClassMembers(element, node.members);
     element.accessors = holder.propertyAccessors;
     element.fields = holder.properties.whereType<FieldElement>().toList();
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index aa69ec9..1c3b927 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -280,6 +280,10 @@
     element.setCodeRange(info.codeOffset, info.codeLength);
     element.nameOffset = info.nameOffset;
     element.documentationComment = info.documentationComment;
+    _applyToTypeParameters(
+      element.typeParameters_unresolved,
+      info.typeParameters,
+    );
 
     forCorrespondingPairs<FieldElement, _InfoEnumConstantDeclaration>(
       element.constants_unresolved,
@@ -794,6 +798,7 @@
   final int codeLength;
   final int nameOffset;
   final String? documentationComment;
+  final List<_InfoTypeParameter> typeParameters;
   final List<_InfoEnumConstantDeclaration> constants;
   final Uint32List constantOffsets;
 
@@ -803,6 +808,9 @@
       codeLength: reader.readUInt30(),
       nameOffset: reader.readUInt30(),
       documentationComment: reader.readStringUtf8().nullIfEmpty,
+      typeParameters: reader.readTypedList(
+        () => _InfoTypeParameter(reader),
+      ),
       constants: reader.readTypedList(
         () => _InfoEnumConstantDeclaration(reader),
       ),
@@ -815,6 +823,7 @@
     required this.codeLength,
     required this.nameOffset,
     required this.documentationComment,
+    required this.typeParameters,
     required this.constants,
     required this.constantOffsets,
   });
@@ -1163,6 +1172,7 @@
       sink.writeUInt30(node.length);
       sink.writeUInt30(node.name.offset);
       _writeDocumentationComment(node);
+      _writeTypeParameters(node.typeParameters);
       sink.writeList2<EnumConstantDeclaration>(node.constants, (node) {
         sink.writeUInt30(node.offset);
         sink.writeUInt30(node.length);
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 4208e83..dd5b4cc 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -114,7 +114,27 @@
   }
 
   @override
-  void visitEnumDeclaration(EnumDeclaration node) {}
+  void visitEnumDeclaration(EnumDeclaration node) {
+    var outerScope = scope;
+
+    var element = node.declaredElement as EnumElementImpl;
+
+    scope = TypeParameterScope(scope, element.typeParameters);
+
+    node.typeParameters?.accept(this);
+    // TODO(scheglov) implement
+    // node.extendsClause?.accept(this);
+    // node.implementsClause?.accept(this);
+    // node.withClause?.accept(this);
+
+    scope = ClassScope(scope, element);
+    LinkingNodeContext(node, scope);
+
+    node.members.accept(this);
+    nodesToBuildType.addDeclaration(node);
+
+    scope = outerScope;
+  }
 
   @override
   void visitExpressionFunctionBody(ExpressionFunctionBody node) {}
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 53b27e3..795d229 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -167,6 +167,8 @@
       _classDeclaration(node);
     } else if (node is ClassTypeAlias) {
       _classTypeAlias(node);
+    } else if (node is EnumDeclaration) {
+      _enumDeclaration(node);
     } else if (node is ExtensionDeclaration) {
       _extensionDeclaration(node);
     } else if (node is FieldFormalParameter) {
@@ -220,6 +222,10 @@
     }
   }
 
+  void _enumDeclaration(EnumDeclaration node) {
+    // TODO(scheglov) implement
+  }
+
   void _extensionDeclaration(ExtensionDeclaration node) {
     var element = node.declaredElement as ExtensionElementImpl;
     element.extendedType = node.extendedType.typeOrThrow;
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index c9017ca..fad5a0e 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -39,6 +39,8 @@
             _typeParameters(node.typeParameters);
           } else if (node is ClassDeclaration) {
             _typeParameters(node.typeParameters);
+          } else if (node is EnumDeclaration) {
+            _typeParameters(node.typeParameters);
           } else if (node is FunctionTypeAlias) {
             _functionTypeAlias(node);
           } else if (node is GenericTypeAlias) {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 358fed5..503b88a 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -100,6 +100,7 @@
     sdkLanguageVersion: Version.parse('2.16.0'),
     flags: [
       EnableString.constructor_tearoffs,
+      EnableString.enhanced_enums,
       EnableString.super_parameters,
     ],
   );
@@ -17501,6 +17502,463 @@
 ''');
   }
 
+  test_enum_typeParameters() async {
+    var library = await checkLibrary('''
+enum E<T> {
+  v
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          covariant T @7
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          static const enumConstant v @14
+            type: E<T>
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 0 @0
+                      staticType: int
+                    SimpleStringLiteral
+                      literal: 'v' @0
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  staticElement: self::@enum::E::@constructor::_
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E<T>
+                staticType: E<T>
+          synthetic static const values @-1
+            type: List<E<T>>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E<T>
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<T>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get v @-1
+            returnType: E<T>
+          synthetic static get values @-1
+            returnType: List<E<T>>
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_typeParameters_bound() async {
+    var library = await checkLibrary('''
+enum E<T extends num, U extends T> {
+  v
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          covariant T @7
+            bound: num
+            defaultType: num
+          covariant U @22
+            bound: T
+            defaultType: num
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          static const enumConstant v @39
+            type: E<T, U>
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 0 @0
+                      staticType: int
+                    SimpleStringLiteral
+                      literal: 'v' @0
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  staticElement: self::@enum::E::@constructor::_
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E<T, U>
+                staticType: E<T, U>
+          synthetic static const values @-1
+            type: List<E<T, U>>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E<T, U>
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<T, U>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get v @-1
+            returnType: E<T, U>
+          synthetic static get values @-1
+            returnType: List<E<T, U>>
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_typeParameters_cycle_1of1() async {
+    var library = await checkLibrary('''
+enum E<T extends T> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          covariant T @7
+            bound: dynamic
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          synthetic static const values @-1
+            type: List<E<T>>
+            constantInitializer
+              ListLiteral
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<T>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get values @-1
+            returnType: List<E<T>>
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_typeParameters_cycle_2of3() async {
+    var library = await checkLibrary(r'''
+enum E<T extends V, U extends num, V extends T> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          covariant T @7
+            bound: dynamic
+            defaultType: dynamic
+          covariant U @20
+            bound: num
+            defaultType: num
+          covariant V @35
+            bound: dynamic
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          synthetic static const values @-1
+            type: List<E<T, U, V>>
+            constantInitializer
+              ListLiteral
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<T, U, V>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get values @-1
+            returnType: List<E<T, U, V>>
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_typeParameters_defaultType_cycle_genericFunctionType() async {
+    var library = await checkLibrary(r'''
+enum E<T extends void Function(E)> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          covariant T @7
+            bound: void Function(E<dynamic>)
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          synthetic static const values @-1
+            type: List<E<T>>
+            constantInitializer
+              ListLiteral
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<T>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get values @-1
+            returnType: List<E<T>>
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_typeParameters_variance_contravariant() async {
+    var library = await checkLibrary('''
+enum E<in T> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          contravariant T @10
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          synthetic static const values @-1
+            type: List<E<T>>
+            constantInitializer
+              ListLiteral
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<T>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get values @-1
+            returnType: List<E<T>>
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_typeParameters_variance_covariant() async {
+    var library = await checkLibrary('''
+enum E<out T> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          covariant T @11
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          synthetic static const values @-1
+            type: List<E<T>>
+            constantInitializer
+              ListLiteral
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<T>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get values @-1
+            returnType: List<E<T>>
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_typeParameters_variance_invariant() async {
+    var library = await checkLibrary('''
+enum E<inout T> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          invariant T @13
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          synthetic static const values @-1
+            type: List<E<T>>
+            constantInitializer
+              ListLiteral
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<T>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get values @-1
+            returnType: List<E<T>>
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_typeParameters_variance_multiple() async {
+    var library = await checkLibrary('''
+enum E<inout T, in U, out V> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          invariant T @13
+            defaultType: dynamic
+          contravariant U @19
+            defaultType: dynamic
+          covariant V @26
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          synthetic static const values @-1
+            type: List<E<T, U, V>>
+            constantInitializer
+              ListLiteral
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<T, U, V>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get values @-1
+            returnType: List<E<T, U, V>>
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
   test_enum_value_documented() async {
     var library = await checkLibrary('''
 enum E {
diff --git a/pkg/dds/lib/src/client.dart b/pkg/dds/lib/src/client.dart
index 7aaeafd..5b3abdc 100644
--- a/pkg/dds/lib/src/client.dart
+++ b/pkg/dds/lib/src/client.dart
@@ -97,7 +97,13 @@
   void _registerJsonRpcMethods() {
     _clientPeer.registerMethod('streamListen', (parameters) async {
       final streamId = parameters['streamId'].asString;
-      await dds.streamManager.streamListen(this, streamId);
+      final includePrivates =
+          parameters['_includePrivateMembers'].asBoolOr(false);
+      await dds.streamManager.streamListen(
+        this,
+        streamId,
+        includePrivates: includePrivates,
+      );
       return RPCResponses.success;
     });
 
diff --git a/pkg/dds/lib/src/stream_manager.dart b/pkg/dds/lib/src/stream_manager.dart
index ee0bc49..cde830a 100644
--- a/pkg/dds/lib/src/stream_manager.dart
+++ b/pkg/dds/lib/src/stream_manager.dart
@@ -170,16 +170,19 @@
   /// `streamListen` request for `stream` to the VM service.
   Future<void> streamListen(
     DartDevelopmentServiceClient? client,
-    String stream,
-  ) async {
+    String stream, {
+    bool? includePrivates,
+  }) async {
     await _streamSubscriptionMutex.runGuarded(
       () async {
         assert(stream.isNotEmpty);
+        bool streamNewlySubscribed = false;
         if (!streamListeners.containsKey(stream)) {
           // Initialize the list of clients for the new stream before we do
           // anything else to ensure multiple clients registering for the same
           // stream in quick succession doesn't result in multiple streamListen
           // requests being sent to the VM service.
+          streamNewlySubscribed = true;
           streamListeners[stream] = <DartDevelopmentServiceClient>[];
           if ((stream == kDebugStream && client == null) ||
               stream != kDebugStream) {
@@ -188,12 +191,28 @@
             final result =
                 await dds.vmServiceClient.sendRequest('streamListen', {
               'streamId': stream,
+              if (includePrivates != null)
+                '_includePrivateMembers': includePrivates,
             });
             assert(result['type'] == 'Success');
           }
         }
         if (streamListeners[stream]!.contains(client)) {
           throw kStreamAlreadySubscribedException;
+        } else if (!streamNewlySubscribed && includePrivates != null) {
+          try {
+            await dds.vmServiceClient.sendRequest(
+                '_setStreamIncludePrivateMembers',
+                {'streamId': stream, 'includePrivateMembers': includePrivates});
+          } on json_rpc.RpcException catch (e) {
+            // This private RPC might not be present. If it's not, we're communicating with an older
+            // VM that doesn't support filtering private members, so they will always be included in
+            // responses. Handle the method not found exception so the streamListen call doesn't
+            // fail for older VMs.
+            if (e.code != RpcErrorCodes.kMethodNotFound) {
+              rethrow;
+            }
+          }
         }
         if (client != null) {
           streamListeners[stream]!.add(client);
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.expect
index 6895041..54231c0 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.weak.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.expect
@@ -40,7 +40,7 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_sample.dart:
-- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:142:9)
 - _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
 - NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.modular.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.modular.expect
index 6895041..54231c0 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.modular.expect
@@ -40,7 +40,7 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_sample.dart:
-- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:142:9)
 - _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
 - NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
index 57cc30b..dc06840 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
@@ -40,9 +40,9 @@
   set y(core::double* #v) → void
     return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C12.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #v);
   get next() → ffi::Pointer<self::Coordinate*>*
-    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}));
+    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadAbiSpecificInt<ffi::IntPtr>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}));
   set next(ffi::Pointer<self::Coordinate*>* #v) → void
-    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #v.{ffi::Pointer::address}{core::int});
+    return ffi::_storeAbiSpecificInt<ffi::IntPtr>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #v.{ffi::Pointer::address}{core::int});
   @#C16
   static get /*isNonNullableByDefault*/ #sizeOf() → core::int*
     return #C19.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
@@ -74,7 +74,7 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_sample.dart:
-- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:142:9)
 - _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
 - NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
index 2e5c180..72d79b8 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
@@ -33,9 +33,9 @@
     set y(dart.core::double* #v) → void
       return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
     @#C16
     static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
       return #C19.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
index a82af2e..6d9d90c 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
@@ -33,9 +33,9 @@
     set y(dart.core::double* #v) → void
       return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
     @#C16
     static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
       return #C19.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
index 68633a6..eb79aaf 100644
--- a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
@@ -33,9 +33,9 @@
     set y(dart.core::double* #v) → void
       return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
     @#C16
     static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
       return #C19.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
index e925f93..beb059f 100644
--- a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
@@ -12,17 +12,17 @@
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     get a1() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set a1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get a2() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set a2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get a3() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set a3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get blah() → a::NestedStruct
       return new a::NestedStruct::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
@@ -43,17 +43,17 @@
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     get n1() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set n1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get n2() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set n2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get n3() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set n3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     @#C19
     static get #sizeOf() → dart.core::int*
       return #C17.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
index e925f93..beb059f 100644
--- a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
@@ -12,17 +12,17 @@
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     get a1() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set a1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get a2() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set a2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get a3() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set a3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get blah() → a::NestedStruct
       return new a::NestedStruct::#fromTypedDataBase( block {
         dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
@@ -43,17 +43,17 @@
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     get n1() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set n1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get n2() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set n2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get n3() → dart.ffi::Pointer<dart.ffi::Void>
-      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set n3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     @#C19
     static get #sizeOf() → dart.core::int*
       return #C17.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
index 2e5c180..72d79b8 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
@@ -33,9 +33,9 @@
     set y(dart.core::double* #v) → void
       return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
     @#C16
     static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
       return #C19.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
index 9d91273..d4ce18c 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
@@ -33,9 +33,9 @@
     set y(dart.core::double* #v) → void
       return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
     @#C16
     static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
       return #C19.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
index afef6e0..4bfcd2e 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
@@ -34,9 +34,9 @@
     set y(dart.core::double* #v) → void
       return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #v.{dart.ffi::Pointer::address}{dart.core::int});
     @#C16
     static get /*isNonNullableByDefault*/ #sizeOf() → dart.core::int*
       return #C19.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
index ffb841a..3c26667 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
@@ -76,8 +76,6 @@
   ffi::Int8Array,
   ffi::Int8Pointer,
   ffi::IntPtr,
-  ffi::IntPtrArray,
-  ffi::IntPtrPointer,
   ffi::NativeApi,
   ffi::NativeFunction,
   ffi::NativeFunctionPointer,
@@ -154,8 +152,6 @@
   ffi::Int8Array,
   ffi::Int8Pointer,
   ffi::IntPtr,
-  ffi::IntPtrArray,
-  ffi::IntPtrPointer,
   ffi::NativeApi,
   ffi::NativeFunction,
   ffi::NativeFunctionPointer,
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
index 40804c4..7c86d77 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
@@ -76,8 +76,6 @@
   ffi::Int8Array,
   ffi::Int8Pointer,
   ffi::IntPtr,
-  ffi::IntPtrArray,
-  ffi::IntPtrPointer,
   ffi::NativeApi,
   ffi::NativeFunction,
   ffi::NativeFunctionPointer,
@@ -154,8 +152,6 @@
   ffi::Int8Array,
   ffi::Int8Pointer,
   ffi::IntPtr,
-  ffi::IntPtrArray,
-  ffi::IntPtrPointer,
   ffi::NativeApi,
   ffi::NativeFunction,
   ffi::NativeFunctionPointer,
diff --git a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
index 9cb7f28..1cb94e2 100644
--- a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
@@ -12,11 +12,11 @@
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     get lpVtbl() → dart.ffi::Pointer<dart.ffi::IntPtr>
-      return dart.ffi::_fromAddress<dart.ffi::IntPtr>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::IntPtr>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set lpVtbl(dart.ffi::Pointer<dart.ffi::IntPtr> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get vtable() → dart.ffi::Pointer<dart.ffi::IntPtr>
-      return dart.ffi::Pointer::fromAddress<dart.ffi::IntPtr>(dart.ffi::IntPtrPointer|get#value(this.{lib::COMObject::lpVtbl}{dart.ffi::Pointer<dart.ffi::IntPtr>}));
+      return dart.ffi::Pointer::fromAddress<dart.ffi::IntPtr>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{lib::COMObject::lpVtbl}{dart.ffi::Pointer<dart.ffi::IntPtr>}, #C7));
     @#C10
     static get #sizeOf() → dart.core::int*
       return #C13.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
index 9cb7f28..1cb94e2 100644
--- a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
@@ -12,11 +12,11 @@
       : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     get lpVtbl() → dart.ffi::Pointer<dart.ffi::IntPtr>
-      return dart.ffi::_fromAddress<dart.ffi::IntPtr>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+      return dart.ffi::_fromAddress<dart.ffi::IntPtr>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
     set lpVtbl(dart.ffi::Pointer<dart.ffi::IntPtr> #externalFieldValue) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
     get vtable() → dart.ffi::Pointer<dart.ffi::IntPtr>
-      return dart.ffi::Pointer::fromAddress<dart.ffi::IntPtr>(dart.ffi::IntPtrPointer|get#value(this.{lib::COMObject::lpVtbl}{dart.ffi::Pointer<dart.ffi::IntPtr>}));
+      return dart.ffi::Pointer::fromAddress<dart.ffi::IntPtr>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{lib::COMObject::lpVtbl}{dart.ffi::Pointer<dart.ffi::IntPtr>}, #C7));
     @#C10
     static get #sizeOf() → dart.core::int*
       return #C13.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.expect
index 8fae114..f21662b 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.expect
@@ -34,7 +34,7 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_sample.dart:
-- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:142:9)
 - _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
 - NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
index 6b19c1d..5082fb7 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
@@ -24,9 +24,9 @@
   set y(core::double #externalFieldValue) → void
     return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C12.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue);
   get next() → ffi::Pointer<self::Coordinate>
-    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}));
+    return ffi::_fromAddress<self::Coordinate>(ffi::_loadAbiSpecificInt<ffi::IntPtr>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}));
   set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void
-    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue.{ffi::Pointer::address}{core::int});
+    return ffi::_storeAbiSpecificInt<ffi::IntPtr>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue.{ffi::Pointer::address}{core::int});
   static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
     return let final self::Coordinate #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate>(self::Coordinate::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::Coordinate>}!) in block {
       #t1.{self::Coordinate::x} = x;
@@ -65,7 +65,7 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_sample.dart:
-- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:142:9)
 - _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
 - NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.expect
index 8fae114..f21662b 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.expect
@@ -34,7 +34,7 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_sample.dart:
-- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:142:9)
 - _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
 - NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.modular.expect
index 8fae114..f21662b 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.modular.expect
@@ -34,7 +34,7 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_sample.dart:
-- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:142:9)
 - _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
 - NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
index 6b19c1d..5082fb7 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
@@ -24,9 +24,9 @@
   set y(core::double #externalFieldValue) → void
     return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C12.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue);
   get next() → ffi::Pointer<self::Coordinate>
-    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}));
+    return ffi::_fromAddress<self::Coordinate>(ffi::_loadAbiSpecificInt<ffi::IntPtr>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}));
   set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void
-    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue.{ffi::Pointer::address}{core::int});
+    return ffi::_storeAbiSpecificInt<ffi::IntPtr>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue.{ffi::Pointer::address}{core::int});
   static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
     return let final self::Coordinate #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate>(self::Coordinate::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::Coordinate>}!) in block {
       #t1.{self::Coordinate::x} = x;
@@ -65,7 +65,7 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_sample.dart:
-- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:142:9)
 - _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
 - NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/vm/lib/transformations/ffi/common.dart b/pkg/vm/lib/transformations/ffi/common.dart
index b50d0a2..1152655 100644
--- a/pkg/vm/lib/transformations/ffi/common.dart
+++ b/pkg/vm/lib/transformations/ffi/common.dart
@@ -35,7 +35,6 @@
   kUint16,
   kUint32,
   kUint64,
-  kIntptr,
   kFloat,
   kDouble,
   kVoid,
@@ -56,11 +55,6 @@
   NativeType.kUint64,
 };
 
-const Set<NativeType> nativeIntTypes = <NativeType>{
-  ...nativeIntTypesFixedSize,
-  NativeType.kIntptr,
-};
-
 /// The [NativeType] class names.
 const Map<NativeType, String> nativeTypeClassNames = <NativeType, String>{
   NativeType.kNativeType: 'NativeType',
@@ -76,7 +70,6 @@
   NativeType.kUint16: 'Uint16',
   NativeType.kUint32: 'Uint32',
   NativeType.kUint64: 'Uint64',
-  NativeType.kIntptr: 'IntPtr',
   NativeType.kFloat: 'Float',
   NativeType.kDouble: 'Double',
   NativeType.kVoid: 'Void',
@@ -104,7 +97,6 @@
   NativeType.kUint16: 2,
   NativeType.kUint32: 4,
   NativeType.kUint64: 8,
-  NativeType.kIntptr: WORD_SIZE,
   NativeType.kFloat: 4,
   NativeType.kDouble: 8,
   NativeType.kVoid: UNKNOWN,
@@ -125,7 +117,6 @@
   NativeType.kUint16,
   NativeType.kUint32,
   NativeType.kUint64,
-  NativeType.kIntptr,
   NativeType.kFloat,
   NativeType.kDouble,
   NativeType.kPointer,
@@ -249,6 +240,8 @@
   final Procedure storeAbiSpecificIntAtIndexMethod;
   final Procedure abiCurrentMethod;
   final Map<Constant, Abi> constantAbis;
+  final Class intptrClass;
+  late AbiSpecificNativeTypeCfe intptrNativeTypeCfe;
   final Procedure memCopy;
   final Procedure allocationTearoff;
   final Procedure asFunctionTearoff;
@@ -461,6 +454,7 @@
                     as ConstantExpression)
                 .constant,
             abi)),
+        intptrClass = index.getClass('dart:ffi', 'IntPtr'),
         memCopy = index.getTopLevelProcedure('dart:ffi', '_memCopy'),
         allocationTearoff = index.getProcedure(
             'dart:ffi', 'AllocatorAlloc', LibraryIndex.tearoffPrefix + 'call'),
@@ -482,6 +476,9 @@
         .getThisType(coreTypes, Nullability.nonNullable);
     pointerVoidType =
         InterfaceType(pointerClass, Nullability.nonNullable, [voidType]);
+    intptrNativeTypeCfe =
+        NativeTypeCfe(this, InterfaceType(intptrClass, Nullability.nonNullable))
+            as AbiSpecificNativeTypeCfe;
   }
 
   @override
@@ -548,7 +545,7 @@
     if (nativeType_ == NativeType.kPointer) {
       return nativeType;
     }
-    if (nativeIntTypes.contains(nativeType_)) {
+    if (nativeIntTypesFixedSize.contains(nativeType_)) {
       return InterfaceType(intClass, Nullability.legacy);
     }
     if (nativeType_ == NativeType.kFloat || nativeType_ == NativeType.kDouble) {
diff --git a/pkg/vm/lib/transformations/ffi/native_type_cfe.dart b/pkg/vm/lib/transformations/ffi/native_type_cfe.dart
index ebbfe3b..4a19480 100644
--- a/pkg/vm/lib/transformations/ffi/native_type_cfe.dart
+++ b/pkg/vm/lib/transformations/ffi/native_type_cfe.dart
@@ -285,7 +285,7 @@
   /// Sample output for `Pointer<Int8> get x =>`:
   ///
   /// ```
-  /// _fromAddress<Int8>(_loadIntPtr(_typedDataBase, offset));
+  /// _fromAddress<Int8>(_loadAbiSpecificInt<IntPtr>(_typedDataBase, offset));
   /// ```
   @override
   ReturnStatement generateGetterStatement(
@@ -297,14 +297,13 @@
       ReturnStatement(StaticInvocation(
           transformer.fromAddressInternal,
           Arguments([
-            StaticInvocation(
-                transformer.loadMethods[NativeType.kIntptr]!,
-                Arguments([
-                  transformer.getCompoundTypedDataBaseField(
-                      ThisExpression(), fileOffset),
-                  transformer.runtimeBranchOnLayout(offsets)
-                ]))
-              ..fileOffset = fileOffset
+            transformer.abiSpecificLoadOrStoreExpression(
+              transformer.intptrNativeTypeCfe,
+              typedDataBase: transformer.getCompoundTypedDataBaseField(
+                  ThisExpression(), fileOffset),
+              offsetInBytes: transformer.runtimeBranchOnLayout(offsets),
+              fileOffset: fileOffset,
+            ),
           ], types: [
             (dartType as InterfaceType).typeArguments.single
           ]))
@@ -313,7 +312,11 @@
   /// Sample output for `set x(Pointer<Int8> #v) =>`:
   ///
   /// ```
-  /// _storeIntPtr(_typedDataBase, offset, (#v as Pointer<Int8>).address);
+  /// _storeAbiSpecificInt<IntPtr>(
+  ///   _typedDataBase,
+  ///   offset,
+  ///   (#v as Pointer<Int8>).address,
+  /// );
   /// ```
   @override
   ReturnStatement generateSetterStatement(
@@ -323,19 +326,22 @@
           bool unalignedAccess,
           VariableDeclaration argument,
           FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          transformer.storeMethods[NativeType.kIntptr]!,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets),
-            InstanceGet(InstanceAccessKind.Instance, VariableGet(argument),
-                transformer.addressGetter.name,
-                interfaceTarget: transformer.addressGetter,
-                resultType: transformer.addressGetter.getterType)
-              ..fileOffset = fileOffset
-          ]))
-        ..fileOffset = fileOffset);
+      ReturnStatement(
+        transformer.abiSpecificLoadOrStoreExpression(
+          transformer.intptrNativeTypeCfe,
+          typedDataBase: transformer.getCompoundTypedDataBaseField(
+              ThisExpression(), fileOffset),
+          offsetInBytes: transformer.runtimeBranchOnLayout(offsets),
+          value: InstanceGet(
+            InstanceAccessKind.Instance,
+            VariableGet(argument),
+            transformer.addressGetter.name,
+            interfaceTarget: transformer.addressGetter,
+            resultType: transformer.addressGetter.getterType,
+          )..fileOffset = fileOffset,
+          fileOffset: fileOffset,
+        ),
+      );
 }
 
 /// The layout of a `Struct` or `Union` in one [Abi].
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index e096691..dde0929 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 8.2.0-dev
+- Update to version `3.56` of the spec.
+- Added optional `line` and `column` properties to `SourceLocation`.
+
 ## 8.1.0
 - Update to version `3.55` of the spec.
 - Added `streamCpuSamplesWithUserTag` RPC.
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index e465dc5..1c8ad22 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.55
+version=3.56
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 968a41f..7fda5c7 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -26,7 +26,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.55.0';
+const String vmServiceVersion = '3.56.0';
 
 /// @optional
 const String optional = 'optional';
@@ -7417,10 +7417,22 @@
   @optional
   int? endTokenPos;
 
+  /// The line associated with this location. Only provided for non-synthetic
+  /// token positions.
+  @optional
+  int? line;
+
+  /// The column associated with this location. Only provided for non-synthetic
+  /// token positions.
+  @optional
+  int? column;
+
   SourceLocation({
     required this.script,
     required this.tokenPos,
     this.endTokenPos,
+    this.line,
+    this.column,
   });
 
   SourceLocation._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
@@ -7428,6 +7440,8 @@
         createServiceObject(json['script'], const ['ScriptRef']) as ScriptRef?;
     tokenPos = json['tokenPos'] ?? -1;
     endTokenPos = json['endTokenPos'];
+    line = json['line'];
+    column = json['column'];
   }
 
   @override
@@ -7442,6 +7456,8 @@
       'tokenPos': tokenPos,
     });
     _setIfNotNull(json, 'endTokenPos', endTokenPos);
+    _setIfNotNull(json, 'line', line);
+    _setIfNotNull(json, 'column', column);
     return json;
   }
 
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index a01b273..99c5e18 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -3,7 +3,7 @@
   A library to communicate with a service implementing the Dart VM
   service protocol.
 
-version: 8.1.0
+version: 8.2.0-dev
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart b/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart
index bead75c..0fa939b 100644
--- a/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart
+++ b/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart
@@ -71,13 +71,17 @@
     expect(futureBpt1.resolved, isTrue);
     expect(script.getLineNumberFromTokenPos(futureBpt1.location!.tokenPos!),
         LINE_A);
+    expect(futureBpt1.location!.line, LINE_A);
     expect(
         script.getColumnNumberFromTokenPos(futureBpt1.location!.tokenPos!), 12);
+    expect(futureBpt1.location!.column, 12);
     expect(futureBpt2.resolved, isTrue);
     expect(script.getLineNumberFromTokenPos(futureBpt2.location!.tokenPos!),
         LINE_A);
+    expect(futureBpt2.location!.line, LINE_A);
     expect(
         script.getColumnNumberFromTokenPos(futureBpt2.location!.tokenPos!), 3);
+    expect(futureBpt2.location!.column, 3);
 
     // The first breakpoint hits before value is modified.
     InstanceRef result =
@@ -121,13 +125,19 @@
       print('$LINE_A:${col} -> ${resolvedLine}:${resolvedCol}');
       if (col <= 12) {
         expect(resolvedLine, LINE_A);
+        expect(bpt.location!.line, LINE_A);
         expect(resolvedCol, 3);
+        expect(bpt.location!.column, 3);
       } else if (col <= 36) {
         expect(resolvedLine, LINE_A);
+        expect(bpt.location!.line, LINE_A);
         expect(resolvedCol, 12);
+        expect(bpt.location!.column, 12);
       } else {
         expect(resolvedLine, LINE_B);
+        expect(bpt.location!.line, LINE_B);
         expect(resolvedCol, 12);
+        expect(bpt.location!.column, 12);
       }
       expect(
           (await service.removeBreakpoint(isolateId, bpt.id!)).type, 'Success');
diff --git a/pkg/vm_service/test/breakpoint_async_break_test.dart b/pkg/vm_service/test/breakpoint_async_break_test.dart
index d0c2443..b83e6ad 100644
--- a/pkg/vm_service/test/breakpoint_async_break_test.dart
+++ b/pkg/vm_service/test/breakpoint_async_break_test.dart
@@ -9,7 +9,8 @@
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
-const int LINE = 18;
+const int LINE = 19;
+const int COL = 7;
 
 // Issue: https://github.com/dart-lang/sdk/issues/36622
 Future<void> testMain() async {
@@ -62,7 +63,10 @@
     expect(futureBpt.resolved, isTrue);
     expect(
         script.getLineNumberFromTokenPos(futureBpt.location!.tokenPos), LINE);
-    expect(script.getColumnNumberFromTokenPos(futureBpt.location!.tokenPos), 7);
+    expect(futureBpt.location!.line, LINE);
+    expect(
+        script.getColumnNumberFromTokenPos(futureBpt.location!.tokenPos), COL);
+    expect(futureBpt.location!.column, COL);
 
     // Remove the breakpoints.
     expect((await service.removeBreakpoint(isolateId, futureBpt.id!)).type,
diff --git a/pkg/vm_service/test/debugging_test.dart b/pkg/vm_service/test/debugging_test.dart
index 1ddee02..cf56e3e 100644
--- a/pkg/vm_service/test/debugging_test.dart
+++ b/pkg/vm_service/test/debugging_test.dart
@@ -91,6 +91,7 @@
     final SourceLocation location = bpt.location;
     expect(location.script!.id, script.id);
     expect(script.getLineNumberFromTokenPos(location.tokenPos!), 16);
+    expect(location.line, 16);
 
     isolate = await service.getIsolate(isolateId);
     expect(isolate.breakpoints!.length, 1);
@@ -103,13 +104,12 @@
     final isolateId = isolateRef.id!;
     final stack = await service.getStack(isolateId);
     expect(stack.frames!.length, greaterThanOrEqualTo(1));
-
-    Script script = (await service.getObject(
-        isolateId, stack.frames![0].location!.script!.id!)) as Script;
+    final location = stack.frames![0].location!;
+    Script script =
+        (await service.getObject(isolateId, location.script!.id!)) as Script;
     expect(script.uri, endsWith('debugging_test.dart'));
-    expect(
-        script.getLineNumberFromTokenPos(stack.frames![0].location!.tokenPos!),
-        16);
+    expect(script.getLineNumberFromTokenPos(location.tokenPos!), 16);
+    expect(location.line, 16);
   },
 
 // Stepping
@@ -136,13 +136,12 @@
     final isolateId = isolateRef.id!;
     final stack = await service.getStack(isolateId);
     expect(stack.frames!.length, greaterThanOrEqualTo(1));
-
-    final Script script = (await service.getObject(
-        isolateId, stack.frames![0].location!.script!.id!)) as Script;
+    final location = stack.frames![0].location!;
+    final Script script =
+        (await service.getObject(isolateId, location.script!.id!)) as Script;
     expect(script.uri, endsWith('debugging_test.dart'));
-    expect(
-        script.getLineNumberFromTokenPos(stack.frames![0].location!.tokenPos!),
-        17);
+    expect(script.getLineNumberFromTokenPos(location.tokenPos!), 17);
+    expect(location.line, 17);
   },
 // Remove breakpoint
   (VmService service, IsolateRef isolateRef) async {
@@ -214,6 +213,7 @@
         (await service.getObject(isolateId, bpt.location.script.id)) as Script;
     expect(script.uri, endsWith('debugging_test.dart'));
     expect(script.getLineNumberFromTokenPos(bpt.location.tokenPos), 14);
+    expect(bpt.location.line, 14);
 
     // Refresh isolate state.
     isolate = await service.getIsolate(isolateId);
@@ -226,13 +226,12 @@
     final isolateId = isolateRef.id!;
     final stack = await service.getStack(isolateId);
     expect(stack.frames!.length, greaterThanOrEqualTo(1));
-
-    final Script script = (await service.getObject(
-        isolateId, stack.frames![0].location!.script!.id!)) as Script;
+    final location = stack.frames![0].location!;
+    final Script script =
+        (await service.getObject(isolateId, location.script!.id!)) as Script;
     expect(script.uri, endsWith('debugging_test.dart'));
-    expect(
-        script.getLineNumberFromTokenPos(stack.frames![0].location!.tokenPos!),
-        14);
+    expect(script.getLineNumberFromTokenPos(location.tokenPos!), 14);
+    expect(location.line, 14);
   },
 ];
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 1eccda2..0ac05bf 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -706,13 +706,6 @@
                                                char** error);
 
 /**
- * An isolate unhandled exception callback function.
- *
- * This callback has been DEPRECATED.
- */
-typedef void (*Dart_IsolateUnhandledExceptionCallback)(Dart_Handle error);
-
-/**
  * An isolate shutdown callback function.
  *
  * This callback, provided by the embedder, is called before the vm
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index 2c54160..e1a6b24 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -44,7 +44,7 @@
 
 #define DEFINE_NATIVE_ENTRY_LOAD(type)                                         \
   DEFINE_NATIVE_ENTRY(Ffi_load##type, 0, 2) { UNREACHABLE(); }
-CLASS_LIST_FFI_NUMERIC(DEFINE_NATIVE_ENTRY_LOAD)
+CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(DEFINE_NATIVE_ENTRY_LOAD)
 #undef DEFINE_NATIVE_ENTRY_LOAD
 
 DEFINE_NATIVE_ENTRY(Ffi_loadPointer, 1, 2) {
@@ -57,7 +57,7 @@
 
 #define DEFINE_NATIVE_ENTRY_STORE(type)                                        \
   DEFINE_NATIVE_ENTRY(Ffi_store##type, 0, 3) { UNREACHABLE(); }
-CLASS_LIST_FFI_NUMERIC(DEFINE_NATIVE_ENTRY_STORE)
+CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(DEFINE_NATIVE_ENTRY_STORE)
 #undef DEFINE_NATIVE_ENTRY_STORE
 
 DEFINE_NATIVE_ENTRY(Ffi_storePointer, 0, 3) {
diff --git a/runtime/lib/vmservice.cc b/runtime/lib/vmservice.cc
index b99a955..16725ec 100644
--- a/runtime/lib/vmservice.cc
+++ b/runtime/lib/vmservice.cc
@@ -129,10 +129,13 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(VMService_ListenStream, 0, 1) {
+DEFINE_NATIVE_ENTRY(VMService_ListenStream, 0, 2) {
 #ifndef PRODUCT
   GET_NON_NULL_NATIVE_ARGUMENT(String, stream_id, arguments->NativeArgAt(0));
-  bool result = Service::ListenStream(stream_id.ToCString());
+  GET_NON_NULL_NATIVE_ARGUMENT(Bool, include_privates,
+                               arguments->NativeArgAt(1));
+  bool result =
+      Service::ListenStream(stream_id.ToCString(), include_privates.value());
   return Bool::Get(result).ptr();
 #else
   return Object::null();
diff --git a/runtime/observatory/lib/service_common.dart b/runtime/observatory/lib/service_common.dart
index 236343c..5c62c48 100644
--- a/runtime/observatory/lib/service_common.dart
+++ b/runtime/observatory/lib/service_common.dart
@@ -149,7 +149,11 @@
       return new Future.error(exception);
     }
     String serial = (_requestSerial++).toString();
-    var request = new _WebSocketRequest(method, params);
+    var request = new _WebSocketRequest(method, <String, dynamic>{
+      ...params,
+      // Include internal response data.
+      '_includePrivateMembers': true,
+    });
     if ((_webSocket != null) && _webSocket!.isOpen) {
       // Already connected, send request immediately.
       _sendRequest(serial, request);
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 048b1e4..d9e8b70 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     final result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], 'Version');
     expect(result['major'], 3);
-    expect(result['minor'], 55);
+    expect(result['minor'], 56);
     expect(result['_privateMajor'], 0);
     expect(result['_privateMinor'], 0);
   },
diff --git a/runtime/observatory_2/lib/service_common.dart b/runtime/observatory_2/lib/service_common.dart
index b61f4a0..d6eba9b 100644
--- a/runtime/observatory_2/lib/service_common.dart
+++ b/runtime/observatory_2/lib/service_common.dart
@@ -149,7 +149,11 @@
       return new Future.error(exception);
     }
     String serial = (_requestSerial++).toString();
-    var request = new _WebSocketRequest(method, params);
+    var request = new _WebSocketRequest(method, <String, dynamic>{
+      ...params,
+      // Include internal response data.
+      '_includePrivateMembers': true,
+    });
     if ((_webSocket != null) && _webSocket.isOpen) {
       // Already connected, send request immediately.
       _sendRequest(serial, request);
diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
index a3c7061..4e398bd 100644
--- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     final result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(55));
+    expect(result['minor'], equals(56));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index ca3d03c..69ed79e 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -361,7 +361,7 @@
   V(VMService_OnStart, 0)                                                      \
   V(VMService_OnExit, 0)                                                       \
   V(VMService_OnServerAddressChange, 1)                                        \
-  V(VMService_ListenStream, 1)                                                 \
+  V(VMService_ListenStream, 2)                                                 \
   V(VMService_CancelStream, 1)                                                 \
   V(VMService_RequestAssets, 0)                                                \
   V(VMService_DecodeAssets, 1)                                                 \
@@ -375,7 +375,6 @@
   V(Ffi_loadUint16, 2)                                                         \
   V(Ffi_loadUint32, 2)                                                         \
   V(Ffi_loadUint64, 2)                                                         \
-  V(Ffi_loadIntPtr, 2)                                                         \
   V(Ffi_loadFloat, 2)                                                          \
   V(Ffi_loadDouble, 2)                                                         \
   V(Ffi_loadPointer, 2)                                                        \
@@ -388,7 +387,6 @@
   V(Ffi_storeUint16, 3)                                                        \
   V(Ffi_storeUint32, 3)                                                        \
   V(Ffi_storeUint64, 3)                                                        \
-  V(Ffi_storeIntPtr, 3)                                                        \
   V(Ffi_storeFloat, 3)                                                         \
   V(Ffi_storeDouble, 3)                                                        \
   V(Ffi_storePointer, 3)                                                       \
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index 9b647b3..6edd6b9 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -152,12 +152,8 @@
   V(Float)                                                                     \
   V(Double)
 
-#define CLASS_LIST_FFI_NUMERIC(V)                                              \
-  CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(V)                                         \
-  V(IntPtr)
-
 #define CLASS_LIST_FFI_TYPE_MARKER(V)                                          \
-  CLASS_LIST_FFI_NUMERIC(V)                                                    \
+  CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(V)                                         \
   V(Void)                                                                      \
   V(Handle)                                                                    \
   V(Bool)
diff --git a/runtime/vm/compiler/ffi/native_type.cc b/runtime/vm/compiler/ffi/native_type.cc
index ac49f39..8902c9b 100644
--- a/runtime/vm/compiler/ffi/native_type.cc
+++ b/runtime/vm/compiler/ffi/native_type.cc
@@ -368,8 +368,6 @@
     case kFfiInt64Cid:
     case kFfiUint64Cid:
       return kInt64;
-    case kFfiIntPtrCid:
-      return compiler::target::kWordSize == 4 ? kInt32 : kInt64;
     case kFfiFloatCid:
       return kFloat;
     case kFfiDoubleCid:
diff --git a/runtime/vm/compiler/ffi/recognized_method.cc b/runtime/vm/compiler/ffi/recognized_method.cc
index 323fcc8..a0a6594 100644
--- a/runtime/vm/compiler/ffi/recognized_method.cc
+++ b/runtime/vm/compiler/ffi/recognized_method.cc
@@ -30,9 +30,6 @@
       return kTypedDataInt64ArrayCid;
     case kFfiUint64Cid:
       return kTypedDataUint64ArrayCid;
-    case kFfiIntPtrCid:
-      return target::kWordSize == 4 ? kTypedDataInt32ArrayCid
-                                    : kTypedDataInt64ArrayCid;
     case kPointerCid:
       return target::kWordSize == 4 ? kTypedDataUint32ArrayCid
                                     : kTypedDataUint64ArrayCid;
@@ -78,7 +75,7 @@
   case MethodRecognizer::kFfiLoad##type:                                       \
   case MethodRecognizer::kFfiStore##type:                                      \
     return kFfi##type##Cid;
-    CLASS_LIST_FFI_NUMERIC(LOAD_STORE)
+    CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(LOAD_STORE)
 #undef LOAD_STORE
     case MethodRecognizer::kFfiLoadFloatUnaligned:
     case MethodRecognizer::kFfiStoreFloatUnaligned:
@@ -105,7 +102,7 @@
   case MethodRecognizer::kFfiLoad##type:                                       \
   case MethodRecognizer::kFfiStore##type:                                      \
     return kAlignedAccess;
-    CLASS_LIST_FFI_NUMERIC(LOAD_STORE)
+    CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(LOAD_STORE)
     LOAD_STORE(Pointer)
 #undef LOAD_STORE
     case MethodRecognizer::kFfiLoadFloatUnaligned:
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index dba179a..44a85cb 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -833,7 +833,6 @@
     case MethodRecognizer::kFfiLoadUint16:
     case MethodRecognizer::kFfiLoadUint32:
     case MethodRecognizer::kFfiLoadUint64:
-    case MethodRecognizer::kFfiLoadIntPtr:
     case MethodRecognizer::kFfiLoadFloat:
     case MethodRecognizer::kFfiLoadFloatUnaligned:
     case MethodRecognizer::kFfiLoadDouble:
@@ -847,7 +846,6 @@
     case MethodRecognizer::kFfiStoreUint16:
     case MethodRecognizer::kFfiStoreUint32:
     case MethodRecognizer::kFfiStoreUint64:
-    case MethodRecognizer::kFfiStoreIntPtr:
     case MethodRecognizer::kFfiStoreFloat:
     case MethodRecognizer::kFfiStoreFloatUnaligned:
     case MethodRecognizer::kFfiStoreDouble:
@@ -1352,7 +1350,6 @@
     case MethodRecognizer::kFfiLoadUint16:
     case MethodRecognizer::kFfiLoadUint32:
     case MethodRecognizer::kFfiLoadUint64:
-    case MethodRecognizer::kFfiLoadIntPtr:
     case MethodRecognizer::kFfiLoadFloat:
     case MethodRecognizer::kFfiLoadFloatUnaligned:
     case MethodRecognizer::kFfiLoadDouble:
@@ -1431,7 +1428,6 @@
     case MethodRecognizer::kFfiStoreUint16:
     case MethodRecognizer::kFfiStoreUint32:
     case MethodRecognizer::kFfiStoreUint64:
-    case MethodRecognizer::kFfiStoreIntPtr:
     case MethodRecognizer::kFfiStoreFloat:
     case MethodRecognizer::kFfiStoreFloatUnaligned:
     case MethodRecognizer::kFfiStoreDouble:
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 5cb46fc..eb93990 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -201,7 +201,6 @@
   V(::, _loadUint16, FfiLoadUint16, 0x0cd660ab)                                \
   V(::, _loadUint32, FfiLoadUint32, 0xf66e9416)                                \
   V(::, _loadUint64, FfiLoadUint64, 0x0506018d)                                \
-  V(::, _loadIntPtr, FfiLoadIntPtr, 0xebd9b43e)                                \
   V(::, _loadFloat, FfiLoadFloat, 0xf8d9845d)                                  \
   V(::, _loadFloatUnaligned, FfiLoadFloatUnaligned, 0xc8c8dfff)                \
   V(::, _loadDouble, FfiLoadDouble, 0xf70cc619)                                \
@@ -217,7 +216,6 @@
   V(::, _storeUint16, FfiStoreUint16, 0xe2fdae9f)                              \
   V(::, _storeUint32, FfiStoreUint32, 0xe5d7ec86)                              \
   V(::, _storeUint64, FfiStoreUint64, 0xe2d935fa)                              \
-  V(::, _storeIntPtr, FfiStoreIntPtr, 0x080266a8)                              \
   V(::, _storeFloat, FfiStoreFloat, 0x6484f07e)                                \
   V(::, _storeFloatUnaligned, FfiStoreFloatUnaligned, 0x600a9203)              \
   V(::, _storeDouble, FfiStoreDouble, 0x42998c64)                              \
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index dfac508..1d6e8ac 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -37,7 +37,9 @@
       param_values_(NULL),
       num_params_(0),
       offset_(0),
-      count_(-1) {
+      count_(-1),
+      include_private_members_(true),
+      ignore_object_depth_(0) {
   ObjectIdRing* ring = NULL;
   Isolate* isolate = Isolate::Current();
   if (isolate != NULL) {
@@ -90,6 +92,10 @@
                  "request %s\n",
                  Dart::UptimeMillis(), main_port, isolate_name, method_);
   }
+  const char* kIncludePrivateMembersKey = "_includePrivateMembers";
+  if (HasParam(kIncludePrivateMembersKey)) {
+    include_private_members_ = ParamIs(kIncludePrivateMembersKey, "true");
+  }
   buffer()->Printf("{\"jsonrpc\":\"2.0\", \"result\":");
 }
 
@@ -368,49 +374,61 @@
   PrintProperty("id", id_zone_->GetServiceId(o));
 }
 
+#define PRIVATE_NAME_CHECK()                                                   \
+  if (!IsAllowableKey(name) || ignore_object_depth_ > 0) return
+
 void JSONStream::PrintProperty(const char* name, const ServiceEvent* event) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValue(event);
 }
 
 void JSONStream::PrintProperty(const char* name, Breakpoint* bpt) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValue(bpt);
 }
 
 void JSONStream::PrintProperty(const char* name, TokenPosition tp) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValue(tp);
 }
 
 void JSONStream::PrintProperty(const char* name, Metric* metric) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValue(metric);
 }
 
 void JSONStream::PrintProperty(const char* name, MessageQueue* queue) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValue(queue);
 }
 
 void JSONStream::PrintProperty(const char* name, Isolate* isolate) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValue(isolate);
 }
 
 void JSONStream::PrintProperty(const char* name,
                                const TimelineEvent* timeline_event) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValue(timeline_event);
 }
 
 void JSONStream::PrintProperty(const char* name,
                                const TimelineEventBlock* timeline_event_block) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValue(timeline_event_block);
 }
 
 void JSONStream::PrintfProperty(const char* name, const char* format, ...) {
+  PRIVATE_NAME_CHECK();
   va_list args;
   va_start(args, format);
   writer_.VPrintfProperty(name, format, args);
@@ -462,11 +480,13 @@
 }
 
 void JSONStream::PrintProperty(const char* name, const Object& o, bool ref) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValue(o, ref);
 }
 
 void JSONStream::PrintPropertyVM(const char* name, bool ref) {
+  PRIVATE_NAME_CHECK();
   PrintPropertyName(name);
   PrintValueVM(ref);
 }
@@ -503,6 +523,13 @@
   if (end_token_pos.IsReal()) {
     location.AddProperty("endTokenPos", end_token_pos);
   }
+  intptr_t line = -1;
+  intptr_t column = -1;
+  // Add line and column information if token_pos is real.
+  if (script.GetTokenLocation(token_pos, &line, &column)) {
+    location.AddProperty("line", line);
+    location.AddProperty("column", column);
+  }
 }
 
 void JSONObject::AddLocation(const BreakpointLocation* bpt_loc) const {
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index a00f266..5b37379 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -9,6 +9,7 @@
 #include "platform/allocation.h"
 #include "platform/text_buffer.h"
 #include "vm/json_writer.h"
+#include "vm/os.h"
 #include "vm/service.h"
 #include "vm/token_position.h"
 
@@ -102,6 +103,18 @@
 
   void set_reply_port(Dart_Port port);
 
+  bool include_private_members() const { return include_private_members_; }
+  void set_include_private_members(bool include_private_members) {
+    include_private_members_ = include_private_members;
+  }
+
+  bool IsAllowableKey(const char* key) {
+    if (include_private_members_) {
+      return true;
+    }
+    return *key != '_';
+  }
+
   void SetParams(const char** param_keys,
                  const char** param_values,
                  intptr_t num_params);
@@ -167,15 +180,41 @@
   void PostNullReply(Dart_Port port);
 
   void OpenObject(const char* property_name = NULL) {
+    if (ignore_object_depth_ > 0 ||
+        (property_name != nullptr && !IsAllowableKey(property_name))) {
+      ignore_object_depth_++;
+      return;
+    }
     writer_.OpenObject(property_name);
   }
-  void CloseObject() { writer_.CloseObject(); }
-  void UncloseObject() { writer_.UncloseObject(); }
+  void CloseObject() {
+    if (ignore_object_depth_ > 0) {
+      ignore_object_depth_--;
+      return;
+    }
+    writer_.CloseObject();
+  }
+  void UncloseObject() {
+    // This should be updated to handle unclosing a private object if we need
+    // to handle that case, which we don't currently.
+    writer_.UncloseObject();
+  }
 
   void OpenArray(const char* property_name = NULL) {
+    if (ignore_object_depth_ > 0 ||
+        (property_name != nullptr && !IsAllowableKey(property_name))) {
+      ignore_object_depth_++;
+      return;
+    }
     writer_.OpenArray(property_name);
   }
-  void CloseArray() { writer_.CloseArray(); }
+  void CloseArray() {
+    if (ignore_object_depth_ > 0) {
+      ignore_object_depth_--;
+      return;
+    }
+    writer_.CloseArray();
+  }
 
   void PrintValueNull() { writer_.PrintValueNull(); }
   void PrintValueBool(bool b) { writer_.PrintValueBool(b); }
@@ -211,46 +250,67 @@
 
   void PrintServiceId(const Object& o);
 
+#define PRIVATE_NAME_CHECK()                                                   \
+  if (!IsAllowableKey(name) || ignore_object_depth_ > 0) {                     \
+    return;                                                                    \
+  }
+
   void PrintPropertyBool(const char* name, bool b) {
+    PRIVATE_NAME_CHECK();
     writer_.PrintPropertyBool(name, b);
   }
   void PrintProperty(const char* name, intptr_t i) {
+    PRIVATE_NAME_CHECK();
     writer_.PrintProperty(name, i);
   }
   void PrintProperty64(const char* name, int64_t i) {
+    PRIVATE_NAME_CHECK();
     writer_.PrintProperty64(name, i);
   }
   void PrintPropertyTimeMillis(const char* name, int64_t millis) {
+    PRIVATE_NAME_CHECK();
     writer_.PrintProperty64(name, millis);
   }
   void PrintPropertyTimeMicros(const char* name, int64_t micros) {
+    PRIVATE_NAME_CHECK();
     writer_.PrintProperty64(name, micros);
   }
   void PrintProperty(const char* name, double d) {
+    PRIVATE_NAME_CHECK();
     writer_.PrintProperty(name, d);
   }
   void PrintPropertyBase64(const char* name,
                            const uint8_t* bytes,
                            intptr_t length) {
+    PRIVATE_NAME_CHECK();
     writer_.PrintPropertyBase64(name, bytes, length);
   }
   void PrintProperty(const char* name, const char* s) {
+    PRIVATE_NAME_CHECK();
     writer_.PrintProperty(name, s);
   }
   bool PrintPropertyStr(const char* name,
                         const String& s,
                         intptr_t offset,
                         intptr_t count) {
+    if (!IsAllowableKey(name)) {
+      return false;
+    }
     return writer_.PrintPropertyStr(name, s, offset, count);
   }
   void PrintPropertyNoEscape(const char* name, const char* s) {
+    PRIVATE_NAME_CHECK();
     writer_.PrintPropertyNoEscape(name, s);
   }
   void PrintfProperty(const char* name, const char* format, ...)
       PRINTF_ATTRIBUTE(3, 4);
   void VPrintfProperty(const char* name, const char* format, va_list args) {
+    PRIVATE_NAME_CHECK();
     writer_.VPrintfProperty(name, format, args);
   }
+
+#undef PRIVATE_NAME_CHECK
+
   void PrintProperty(const char* name, const Object& o, bool ref = true);
 
   void PrintProperty(const char* name, const ServiceEvent* event);
@@ -285,7 +345,8 @@
   intptr_t offset_;
   intptr_t count_;
   int64_t setup_time_micros_;
-
+  bool include_private_members_;
+  intptr_t ignore_object_depth_;
   friend class JSONObject;
   friend class JSONArray;
   friend class TimelineEvent;
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index ed619c2..672369c 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -182,7 +182,8 @@
       "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"Null\",\"location\":{"
       "\"type\":\"SourceLocation\",\"script\":{\"type\":\"@Script\","
       "\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core\\/null.dart\",\"_"
-      "kind\":\"kernel\"},\"tokenPos\":925,\"endTokenPos\":1165},\"library\":{"
+      "kind\":\"kernel\"},\"tokenPos\":925,\"endTokenPos\":1165,\"line\":23,"
+      "\"column\":1},\"library\":{"
       "\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\",\"name\":\"dart."
       "core\",\"uri\":\"dart:core\"}},\"kind\":\"Null\",\"fixedId\":true,"
       "\"id\":\"\",\"valueAsString\":\"null\"},{\"object_key\":{\"type\":\"@"
@@ -190,7 +191,8 @@
       "\"fixedId\":true,\"id\":\"\",\"name\":\"Null\",\"location\":{\"type\":"
       "\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
       "\"id\":\"\",\"uri\":\"dart:core\\/null.dart\",\"_kind\":\"kernel\"},"
-      "\"tokenPos\":925,\"endTokenPos\":1165},\"library\":{\"type\":\"@"
+      "\"tokenPos\":925,\"endTokenPos\":1165,\"line\":23,\"column\":1},"
+      "\"library\":{\"type\":\"@"
       "Library\",\"fixedId\":true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":"
       "\"dart:core\"}},\"kind\":\"Null\",\"fixedId\":true,\"id\":\"\","
       "\"valueAsString\":\"null\"}}]",
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 3cb390d..fa5e68f 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -417,7 +417,8 @@
     &Service::timeline_stream, &Service::profiler_stream,
 };
 
-bool Service::ListenStream(const char* stream_id) {
+bool Service::ListenStream(const char* stream_id,
+                           bool include_private_members) {
   if (FLAG_trace_service) {
     OS::PrintErr("vm-service: starting stream '%s'\n", stream_id);
   }
@@ -425,6 +426,7 @@
   for (intptr_t i = 0; i < num_streams; i++) {
     if (strcmp(stream_id, streams_[i]->id()) == 0) {
       streams_[i]->set_enabled(true);
+      streams_[i]->set_include_private_members(include_private_members);
       return true;
     }
   }
@@ -1215,7 +1217,7 @@
 }
 
 void Service::HandleEvent(ServiceEvent* event, bool enter_safepoint) {
-  if (event->stream_info() != NULL && !event->stream_info()->enabled()) {
+  if (event->stream_info() != nullptr && !event->stream_info()->enabled()) {
     if (FLAG_warn_on_pause_with_no_debugger && event->IsPause()) {
       // If we are about to pause a running program which has no
       // debugger connected, tell the user about it.
@@ -1223,7 +1225,7 @@
     }
     // Ignore events when no one is listening to the event stream.
     return;
-  } else if (event->stream_info() != NULL &&
+  } else if (event->stream_info() != nullptr &&
              FLAG_warn_on_pause_with_no_debugger && event->IsPause()) {
     ReportPauseOnConsole(event);
   }
@@ -1231,8 +1233,12 @@
     return;
   }
   JSONStream js;
+  if (event->stream_info() != nullptr) {
+    js.set_include_private_members(
+        event->stream_info()->include_private_members());
+  }
   const char* stream_id = event->stream_id();
-  ASSERT(stream_id != NULL);
+  ASSERT(stream_id != nullptr);
   {
     JSONObject jsobj(&js);
     jsobj.AddProperty("jsonrpc", "2.0");
@@ -1548,6 +1554,31 @@
   }
 }
 
+static const MethodParameter* const
+    set_stream_include_private_members_params[] = {
+        NO_ISOLATE_PARAMETER,
+        new BoolParameter("includePrivateMembers", true),
+        nullptr,
+};
+
+static void SetStreamIncludePrivateMembers(Thread* thread, JSONStream* js) {
+  const char* stream_id = js->LookupParam("streamId");
+  if (stream_id == nullptr) {
+    PrintMissingParamError(js, "streamId");
+    return;
+  }
+  bool include_private_members =
+      BoolParameter::Parse(js->LookupParam("includePrivateMembers"), false);
+  intptr_t num_streams = sizeof(streams_) / sizeof(streams_[0]);
+  for (intptr_t i = 0; i < num_streams; i++) {
+    if (strcmp(stream_id, streams_[i]->id()) == 0) {
+      streams_[i]->set_include_private_members(include_private_members);
+      break;
+    }
+  }
+  PrintSuccess(js);
+}
+
 static void ActOnIsolateGroup(JSONStream* js,
                               std::function<void(IsolateGroup*)> visitor) {
   const String& prefix =
@@ -5679,6 +5710,8 @@
     set_library_debuggable_params },
   { "setName", SetName,
     set_name_params },
+  { "_setStreamIncludePrivateMembers", SetStreamIncludePrivateMembers,
+    set_stream_include_private_members_params },
   { "setTraceClassAllocation", SetTraceClassAllocation,
     set_trace_class_allocation_params },
   { "setVMName", SetVMName,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 97baa4b..6bf1e40 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 55
+#define SERVICE_PROTOCOL_MINOR_VERSION 56
 
 class Array;
 class EmbedderServiceHandler;
@@ -68,16 +68,23 @@
 
 class StreamInfo {
  public:
-  explicit StreamInfo(const char* id) : id_(id), enabled_(false) {}
+  explicit StreamInfo(const char* id)
+      : id_(id), enabled_(false), include_private_members_(false) {}
 
   const char* id() const { return id_; }
 
   void set_enabled(bool value) { enabled_ = value; }
   bool enabled() const { return enabled_; }
 
+  void set_include_private_members(bool value) {
+    include_private_members_ = value;
+  }
+  bool include_private_members() const { return include_private_members_; }
+
  private:
   const char* id_;
   bool enabled_;
+  bool include_private_members_;
 };
 
 class Service : public AllStatic {
@@ -174,7 +181,7 @@
   static StreamInfo timeline_stream;
   static StreamInfo profiler_stream;
 
-  static bool ListenStream(const char* stream_id);
+  static bool ListenStream(const char* stream_id, bool include_privates);
   static void CancelStream(const char* stream_id);
 
   static ObjectPtr RequestAssets();
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 2c22e5f..64125ef 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.55
+# Dart VM Service Protocol 3.56
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.55_ of the Dart VM Service Protocol. This
+This document describes of _version 3.56_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -3878,6 +3878,14 @@
 
   // The last token of the location if this is a range.
   int endTokenPos [optional];
+
+  // The line associated with this location. Only provided for non-synthetic
+  // token positions.
+  int line [optional];
+
+  // The column associated with this location. Only provided for non-synthetic
+  // token positions.
+  int column [optional];
 }
 ```
 
@@ -4319,5 +4327,6 @@
 3.53 | Added `setIsolatePauseMode` RPC.
 3.54 | Added `CpuSamplesEvent`, updated `cpuSamples` property on `Event` to have type `CpuSamplesEvent`.
 3.55 | Added `streamCpuSamplesWithUserTag` RPC.
+3.56 | Added optional `line` and `column` properties to `SourceLocation`.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/source_report_test.cc b/runtime/vm/source_report_test.cc
index 2670ac6..b1af934 100644
--- a/runtime/vm/source_report_test.cc
+++ b/runtime/vm/source_report_test.cc
@@ -541,7 +541,8 @@
       "\"_intrinsic\":false,\"_native\":false,\"location\":{\"type\":"
       "\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
       "\"id\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"},"
-      "\"tokenPos\":0,\"endTokenPos\":11}},\"count\":1}]}]}],"
+      "\"tokenPos\":0,\"endTokenPos\":11,\"line\":1,\"column\":1}},\"count\":1}"
+      "]}]}],"
 
       // One script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
@@ -602,7 +603,8 @@
       "\"script\":{\"type\":\"@Script\","
       "\"fixedId\":true,\"id\":\"\","
       "\"uri\":\"file:\\/\\/\\/test-lib\","
-      "\"_kind\":\"kernel\"},\"tokenPos\":0,\"endTokenPos\":27},"
+      "\"_kind\":\"kernel\"},\"tokenPos\":0,\"endTokenPos\":27,\"line\":1,"
+      "\"column\":1},"
       "\"library\":{\"type\":\"@Library\",\"fixedId\":true,"
       "\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"}},"
 
@@ -614,7 +616,8 @@
       "\"script\":{\"type\":\"@Script\","
       "\"fixedId\":true,\"id\":\"\","
       "\"uri\":\"file:\\/\\/\\/test-lib\","
-      "\"_kind\":\"kernel\"},\"tokenPos\":0,\"endTokenPos\":27},"
+      "\"_kind\":\"kernel\"},\"tokenPos\":0,\"endTokenPos\":27,\"line\":1,"
+      "\"column\":1},"
       "\"library\":{\"type\":\"@Library\",\"fixedId\":true,"
       "\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"}"
       "},\"_kind\":\"RegularFunction\","
@@ -624,7 +627,8 @@
       "\"location\":{\"type\":\"SourceLocation\","
       "\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
       "\"id\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\","
-      "\"_kind\":\"kernel\"},\"tokenPos\":17,\"endTokenPos\":25}},"
+      "\"_kind\":\"kernel\"},\"tokenPos\":17,\"endTokenPos\":25,\"line\":2,"
+      "\"column\":3}},"
 
       "\"count\":2},"
 
@@ -635,7 +639,8 @@
       "\"script\":{\"type\":\"@Script\","
       "\"fixedId\":true,\"id\":\"\","
       "\"uri\":\"file:\\/\\/\\/test-lib\","
-      "\"_kind\":\"kernel\"},\"tokenPos\":29,\"endTokenPos\":58},"
+      "\"_kind\":\"kernel\"},\"tokenPos\":29,\"endTokenPos\":58,\"line\":4,"
+      "\"column\":1},"
       "\"library\":{\"type\":\"@Library\",\"fixedId\":true,"
       "\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"}},"
 
@@ -647,7 +652,8 @@
       "\"script\":{\"type\":\"@Script\","
       "\"fixedId\":true,\"id\":\"\","
       "\"uri\":\"file:\\/\\/\\/test-lib\","
-      "\"_kind\":\"kernel\"},\"tokenPos\":29,\"endTokenPos\":58},"
+      "\"_kind\":\"kernel\"},\"tokenPos\":29,\"endTokenPos\":58,\"line\":4,"
+      "\"column\":1},"
       "\"library\":{\"type\":\"@Library\",\"fixedId\":true,"
       "\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"}"
       "},\"_kind\":\"RegularFunction\","
@@ -657,7 +663,8 @@
       "\"location\":{\"type\":\"SourceLocation\","
       "\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
       "\"id\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\","
-      "\"_kind\":\"kernel\"},\"tokenPos\":48,\"endTokenPos\":56}},"
+      "\"_kind\":\"kernel\"},\"tokenPos\":48,\"endTokenPos\":56,\"line\":5,"
+      "\"column\":3}},"
 
       "\"count\":1}]}]}],"
 
@@ -713,7 +720,8 @@
       "intrinsic\":false,\"_native\":false,\"location\":{\"type\":"
       "\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
       "\"id\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"},"
-      "\"tokenPos\":0,\"endTokenPos\":11}},\"count\":1}]}],\"coverage\":{"
+      "\"tokenPos\":0,\"endTokenPos\":11,\"line\":1,\"column\":1}},\"count\":1}"
+      "]}],\"coverage\":{"
       "\"hits\":[26,37],\"misses\":[]}}],"
 
       // One script in the script table.
diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart
index 73d08b7..cec0bfe 100644
--- a/sdk/lib/_internal/vm/lib/ffi_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart
@@ -334,10 +334,6 @@
 external int _loadUint64(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-@pragma("vm:external-name", "Ffi_loadIntPtr")
-external int _loadIntPtr(Object typedDataBase, int offsetInBytes);
-
-@pragma("vm:recognized", "other")
 external int _loadAbiSpecificInt<T extends AbiSpecificInteger>(
     Object typedDataBase, int offsetInBytes);
 
@@ -407,10 +403,6 @@
 external void _storeUint64(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-@pragma("vm:external-name", "Ffi_storeIntPtr")
-external void _storeIntPtr(Object typedDataBase, int offsetInBytes, int value);
-
-@pragma("vm:recognized", "other")
 external int _storeAbiSpecificInt<T extends AbiSpecificInteger>(
     Object typedDataBase, int offsetInBytes, int value);
 
@@ -476,9 +468,6 @@
 Pointer<Uint64> _elementAtUint64(Pointer<Uint64> pointer, int index) =>
     Pointer.fromAddress(pointer.address + 8 * index);
 
-Pointer<IntPtr> _elementAtIntPtr(Pointer<IntPtr> pointer, int index) =>
-    Pointer.fromAddress(pointer.address + _intPtrSize * index);
-
 Pointer<Float> _elementAtFloat(Pointer<Float> pointer, int index) =>
     Pointer.fromAddress(pointer.address + 4 * index);
 
@@ -696,21 +685,6 @@
   }
 }
 
-extension IntPtrPointer on Pointer<IntPtr> {
-  @patch
-  int get value => _loadIntPtr(this, 0);
-
-  @patch
-  set value(int value) => _storeIntPtr(this, 0, value);
-
-  @patch
-  int operator [](int index) => _loadIntPtr(this, _intPtrSize * index);
-
-  @patch
-  operator []=(int index, int value) =>
-      _storeIntPtr(this, _intPtrSize * index, value);
-}
-
 extension FloatPointer on Pointer<Float> {
   @patch
   double get value => _loadFloat(this, 0);
@@ -883,20 +857,6 @@
   }
 }
 
-extension IntPtrArray on Array<IntPtr> {
-  @patch
-  int operator [](int index) {
-    _checkIndex(index);
-    return _loadIntPtr(_typedDataBase, _intPtrSize * index);
-  }
-
-  @patch
-  operator []=(int index, int value) {
-    _checkIndex(index);
-    return _storeIntPtr(_typedDataBase, _intPtrSize * index, value);
-  }
-}
-
 extension FloatArray on Array<Float> {
   @patch
   double operator [](int index) {
diff --git a/sdk/lib/collection/maps.dart b/sdk/lib/collection/maps.dart
index b8673b1..e4a9357 100644
--- a/sdk/lib/collection/maps.dart
+++ b/sdk/lib/collection/maps.dart
@@ -125,9 +125,9 @@
   }
 
   void addAll(Map<K, V> other) {
-    for (K key in other.keys) {
-      this[key] = other[key] as V;
-    }
+    other.forEach((K key, V value) {
+      this[key] = value;
+    });
   }
 
   bool containsValue(Object? value) {
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index eba4ea8..a94f104 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -448,50 +448,6 @@
   external Uint64List asTypedList(int length);
 }
 
-/// Extension on [Pointer] specialized for the type argument [IntPtr].
-extension IntPtrPointer on Pointer<IntPtr> {
-  /// The 32 or 64-bit two's complement integer at [address].
-  ///
-  /// On 32-bit platforms this is a 32-bit integer, and on 64-bit platforms
-  /// this is a 64-bit integer.
-  ///
-  /// On 32-bit platforms a Dart integer is truncated to 32 bits (as if by
-  /// `.toSigned(32)`) before being stored, and the 32-bit value is
-  /// sign-extended when it is loaded.
-  ///
-  /// On 32-bit platforms the [address] must be 4-byte aligned, and on 64-bit
-  /// platforms the [address] must be 8-byte aligned.
-  external int get value;
-
-  external void set value(int value);
-
-  /// The 32 or 64-bit two's complement integer at `address + (4 or 8) * index`.
-  ///
-  /// On 32-bit platforms this is a 32-bit integer, and on 64-bit platforms
-  /// this is a 64-bit integer.
-  ///
-  /// On 32-bit platforms a Dart integer is truncated to 32 bits (as if by
-  /// `.toSigned(32)`) before being stored, and the 32-bit value is
-  /// sign-extended when it is loaded.
-  ///
-  /// On 32-bit platforms the [address] must be 4-byte aligned, and on 64-bit
-  /// platforms the [address] must be 8-byte aligned.
-  external int operator [](int index);
-
-  /// The 32 or 64-bit two's complement integer at `address + (4 or 8) * index`.
-  ///
-  /// On 32-bit platforms this is a 32-bit integer, and on 64-bit platforms
-  /// this is a 64-bit integer.
-  ///
-  /// On 32-bit platforms a Dart integer is truncated to 32 bits (as if by
-  /// `.toSigned(32)`) before being stored, and the 32-bit value is
-  /// sign-extended when it is loaded.
-  ///
-  /// On 32-bit platforms the [address] must be 4-byte aligned, and on 64-bit
-  /// platforms the [address] must be 8-byte aligned.
-  external void operator []=(int index, int value);
-}
-
 /// Extension on [Pointer] specialized for the type argument [Float].
 extension FloatPointer on Pointer<Float> {
   /// The float at [address].
@@ -633,13 +589,6 @@
   external void operator []=(int index, int value);
 }
 
-/// Bounds checking indexing methods on [Array]s of [IntPtr].
-extension IntPtrArray on Array<IntPtr> {
-  external int operator [](int index);
-
-  external void operator []=(int index, int value);
-}
-
 /// Bounds checking indexing methods on [Array]s of [Float].
 extension FloatArray on Array<Float> {
   external double operator [](int index);
diff --git a/sdk/lib/ffi/native_type.dart b/sdk/lib/ffi/native_type.dart
index 217a68a..01a68475 100644
--- a/sdk/lib/ffi/native_type.dart
+++ b/sdk/lib/ffi/native_type.dart
@@ -102,7 +102,27 @@
 ///
 /// [IntPtr] is not constructible in the Dart code and serves purely as marker
 /// in type signatures.
-class IntPtr extends _NativeInteger {
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Int32(),
+  Abi.androidArm64: Int64(),
+  Abi.androidIA32: Int32(),
+  Abi.androidX64: Int64(),
+  Abi.fuchsiaArm64: Int64(),
+  Abi.fuchsiaX64: Int64(),
+  Abi.iosArm: Int32(),
+  Abi.iosArm64: Int64(),
+  Abi.iosX64: Int64(),
+  Abi.linuxArm: Int32(),
+  Abi.linuxArm64: Int64(),
+  Abi.linuxIA32: Int32(),
+  Abi.linuxX64: Int64(),
+  Abi.macosArm64: Int64(),
+  Abi.macosX64: Int64(),
+  Abi.windowsArm64: Int64(),
+  Abi.windowsIA32: Int32(),
+  Abi.windowsX64: Int64(),
+})
+class IntPtr extends AbiSpecificInteger {
   const IntPtr();
 }
 
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index 5af3cfd..ae16c86 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -549,7 +549,9 @@
       return encodeRpcError(message, kStreamAlreadySubscribed);
     }
     if (!_isAnyClientSubscribed(streamId)) {
-      if (!serviceStreams.contains(streamId) && !_vmListenStream(streamId)) {
+      final includePrivates = message.params['_includePrivateMembers'] == true;
+      if (!serviceStreams.contains(streamId) &&
+          !_vmListenStream(streamId, includePrivates)) {
         return encodeRpcError(message, kInvalidParams,
             details: "streamListen: invalid 'streamId' parameter: ${streamId}");
       }
@@ -831,7 +833,7 @@
 
 /// Subscribe to a service stream.
 @pragma("vm:external-name", "VMService_ListenStream")
-external bool _vmListenStream(String streamId);
+external bool _vmListenStream(String streamId, bool include_privates);
 
 /// Cancel a subscription to a service stream.
 @pragma("vm:external-name", "VMService_CancelStream")
diff --git a/tools/VERSION b/tools/VERSION
index 7e3b57f..df09db5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 3
+PRERELEASE 4
 PRERELEASE_PATCH 0
\ No newline at end of file