diff --git a/CHANGELOG.md b/CHANGELOG.md
index 75ddaaa..afa88f5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 2.13.0
+
+### Language
+
+### Core libraries
+
+### Dart VM
+
+### Tools
+
+#### Dartanalyzer
+
+
 ## 2.12.0
 
 ### Language
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 125f605..7eb93df 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -289,10 +289,8 @@
   void readStringTable(List<String> table) {
     // Read the table of end offsets.
     int length = readUInt30();
-    List<int> endOffsets = new List<int>.filled(length, null);
-    for (int i = 0; i < length; ++i) {
-      endOffsets[i] = readUInt30();
-    }
+    List<int> endOffsets =
+        new List<int>.generate(length, (_) => readUInt30(), growable: false);
     // Read the WTF-8 encoded strings.
     table.length = length;
     int startOffset = 0;
@@ -376,12 +374,11 @@
     final DartType valueType = readDartType();
     final int length = readUInt30();
     final List<ConstantMapEntry> entries =
-        new List<ConstantMapEntry>.filled(length, null, growable: true);
-    for (int i = 0; i < length; i++) {
+        new List<ConstantMapEntry>.generate(length, (_) {
       final Constant key = readConstantReference();
       final Constant value = readConstantReference();
-      entries[i] = new ConstantMapEntry(key, value);
-    }
+      return new ConstantMapEntry(key, value);
+    }, growable: true);
     return new MapConstant(keyType, valueType, entries);
   }
 
@@ -441,12 +438,8 @@
 
   List<Constant> _readConstantReferenceList() {
     final int length = readUInt30();
-    final List<Constant> list =
-        new List<Constant>.filled(length, null, growable: true);
-    for (int i = 0; i < length; i++) {
-      list[i] = readConstantReference();
-    }
-    return list;
+    return new List<Constant>.generate(length, (_) => readConstantReference(),
+        growable: true);
   }
 
   Uri readUriReference() {
@@ -459,11 +452,8 @@
 
   List<String> readStringReferenceList() {
     int length = readUInt30();
-    List<String> result = new List<String>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readStringReference();
-    }
-    return result;
+    return new List<String>.generate(length, (_) => readStringReference(),
+        growable: true);
   }
 
   String readStringOrNullIfEmpty() {
@@ -485,12 +475,9 @@
   List<Expression> readAnnotationList(TreeNode parent) {
     int length = readUInt30();
     if (length == 0) return const <Expression>[];
-    List<Expression> list =
-        new List<Expression>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      list[i] = readExpression()..parent = parent;
-    }
-    return list;
+    return new List<Expression>.generate(
+        length, (_) => readExpression()..parent = parent,
+        growable: true);
   }
 
   void _fillTreeNodeList(
@@ -528,7 +515,11 @@
 
   void readLinkTable(CanonicalName linkRoot) {
     int length = readUInt30();
-    _linkTable = new List<CanonicalName>.filled(length, null);
+    _linkTable = new List<CanonicalName>.filled(
+        length,
+        // Use [linkRoot] as a dummy default value.
+        linkRoot,
+        growable: false);
     for (int i = 0; i < length; ++i) {
       int biasedParentIndex = readUInt30();
       String name = readStringReference();
@@ -739,7 +730,11 @@
     result.libraryCount = readUint32();
     // Library offsets are used for start and end offsets, so there is one extra
     // element that this the end offset of the last library
-    result.libraryOffsets = new List<int>.filled(result.libraryCount + 1, null);
+    result.libraryOffsets = new List<int>.filled(
+        result.libraryCount + 1,
+        // Use `-1` as a dummy default value.
+        -1,
+        growable: false);
     result.componentFileSizeInBytes = readUint32();
     if (result.componentFileSizeInBytes != componentFileSize) {
       throw "Malformed binary: This component file's component index indicates "
@@ -851,16 +846,16 @@
     SubComponentView result;
     if (createView) {
       result = new SubComponentView(
-          new List<Library>.filled(numberOfLibraries, null),
+          new List<Library>.generate(numberOfLibraries, (int i) {
+            _byteOffset = index.libraryOffsets[i];
+            return readLibrary(component, index.libraryOffsets[i + 1]);
+          }, growable: false),
           _componentStartOffset,
           componentFileSize);
-    }
-
-    for (int i = 0; i < numberOfLibraries; ++i) {
-      _byteOffset = index.libraryOffsets[i];
-      Library library = readLibrary(component, index.libraryOffsets[i + 1]);
-      if (createView) {
-        result.libraries[i] = library;
+    } else {
+      for (int i = 0; i < numberOfLibraries; ++i) {
+        _byteOffset = index.libraryOffsets[i];
+        readLibrary(component, index.libraryOffsets[i + 1]);
       }
     }
 
@@ -879,13 +874,8 @@
   List<String> readListOfStrings() {
     int length = readUInt30();
     if (length == 0) return null;
-    List<String> strings =
-        new List<String>.filled(length, null, growable: true);
-    for (int i = 0; i < length; i++) {
-      String s = readString();
-      strings[i] = s;
-    }
-    return strings;
+    return new List<String>.generate(length, (_) => readString(),
+        growable: true);
   }
 
   /// Read the uri-to-source part of the binary.
@@ -907,7 +897,11 @@
       _sourceUriTable[i] = uri;
       Uint8List sourceCode = readByteList();
       int lineCount = readUInt30();
-      List<int> lineStarts = new List<int>.filled(lineCount, null);
+      List<int> lineStarts = new List<int>.filled(
+          lineCount,
+          // Use `-1` as a dummy default value.
+          -1,
+          growable: false);
       int previousLineStart = 0;
       for (int j = 0; j < lineCount; ++j) {
         int lineStart = readUInt30() + previousLineStart;
@@ -1067,7 +1061,11 @@
     // There is a field for the procedure count.
     _byteOffset = endOffset - (1) * 4;
     int procedureCount = readUint32();
-    List<int> procedureOffsets = new List<int>.filled(procedureCount + 1, null);
+    List<int> procedureOffsets = new List<int>.filled(
+        procedureCount + 1,
+        // Use `-1` as a dummy default value.
+        -1,
+        growable: false);
 
     // There is a field for the procedure count, that number + 1 (for the end)
     // offsets, and then the class count (i.e. procedure count + 3 fields).
@@ -1076,7 +1074,11 @@
     for (int i = 0; i < procedureCount + 1; i++) {
       procedureOffsets[i] = _componentStartOffset + readUint32();
     }
-    List<int> classOffsets = new List<int>.filled(classCount + 1, null);
+    List<int> classOffsets = new List<int>.filled(
+        classCount + 1,
+        // Use `-1` as a dummy default value.
+        -1,
+        growable: false);
 
     // There is a field for the procedure count, that number + 1 (for the end)
     // offsets, then the class count and that number + 1 (for the end) offsets.
@@ -1200,12 +1202,8 @@
 
   List<Combinator> readCombinatorList() {
     int length = readUInt30();
-    List<Combinator> result =
-        new List<Combinator>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readCombinator();
-    }
-    return result;
+    return new List<Combinator>.generate(length, (_) => readCombinator(),
+        growable: true);
   }
 
   void _readLibraryParts(Library library) {
@@ -1263,13 +1261,12 @@
     // There is a field for the procedure count.
     _byteOffset = endOffset - (1) * 4;
     int procedureCount = readUint32();
-    List<int> procedureOffsets = new List<int>.filled(procedureCount + 1, null);
     // There is a field for the procedure count, that number + 1 (for the end)
     // offsets (i.e. procedure count + 2 fields).
     _byteOffset = endOffset - (procedureCount + 2) * 4;
-    for (int i = 0; i < procedureCount + 1; i++) {
-      procedureOffsets[i] = _componentStartOffset + readUint32();
-    }
+    List<int> procedureOffsets = new List<int>.generate(
+        procedureCount + 1, (_) => _componentStartOffset + readUint32(),
+        growable: false);
     _byteOffset = savedByteOffset;
 
     CanonicalName canonicalName = readCanonicalNameReference();
@@ -1786,12 +1783,8 @@
 
   List<Expression> readExpressionList() {
     int length = readUInt30();
-    List<Expression> result =
-        new List<Expression>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readExpression();
-    }
-    return result;
+    return new List<Expression>.generate(length, (_) => readExpression(),
+        growable: true);
   }
 
   Expression readExpressionOption() {
@@ -2253,11 +2246,9 @@
       fieldValues[fieldRef] = value;
     }
     int assertCount = readUInt30();
-    List<AssertStatement> asserts =
-        new List<AssertStatement>.filled(assertCount, null);
-    for (int i = 0; i < assertCount; i++) {
-      asserts[i] = readStatement();
-    }
+    List<AssertStatement> asserts = new List<AssertStatement>.generate(
+        assertCount, (_) => readStatement(),
+        growable: false);
     List<Expression> unusedArguments = readExpressionList();
     return new InstanceCreation(
         classReference, typeArguments, fieldValues, asserts, unusedArguments)
@@ -2438,12 +2429,8 @@
 
   List<MapEntry> readMapEntryList() {
     int length = readUInt30();
-    List<MapEntry> result =
-        new List<MapEntry>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readMapEntry();
-    }
-    return result;
+    return new List<MapEntry>.generate(length, (_) => readMapEntry(),
+        growable: true);
   }
 
   MapEntry readMapEntry() {
@@ -2452,12 +2439,8 @@
 
   List<Statement> readStatementList() {
     int length = readUInt30();
-    List<Statement> result =
-        new List<Statement>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readStatement();
-    }
-    return result;
+    return new List<Statement>.generate(length, (_) => readStatement(),
+        growable: true);
   }
 
   Statement readStatementOrNullIfEmpty() {
@@ -2594,11 +2577,9 @@
     int offset = readOffset();
     Expression expression = readExpression();
     int count = readUInt30();
-    List<SwitchCase> cases =
-        new List<SwitchCase>.filled(count, null, growable: true);
-    for (int i = 0; i < count; ++i) {
-      cases[i] = new SwitchCase.empty();
-    }
+    List<SwitchCase> cases = new List<SwitchCase>.generate(
+        count, (_) => new SwitchCase.empty(),
+        growable: true);
     switchCaseStack.addAll(cases);
     for (int i = 0; i < cases.length; ++i) {
       readSwitchCaseInto(cases[i]);
@@ -2674,11 +2655,7 @@
 
   List<Catch> readCatchList() {
     int length = readUInt30();
-    List<Catch> result = new List<Catch>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readCatch();
-    }
-    return result;
+    return new List<Catch>.generate(length, (_) => readCatch(), growable: true);
   }
 
   Catch readCatch() {
@@ -2727,32 +2704,20 @@
 
   List<Supertype> readSupertypeList() {
     int length = readUInt30();
-    List<Supertype> result =
-        new List<Supertype>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readSupertype();
-    }
-    return result;
+    return new List<Supertype>.generate(length, (_) => readSupertype(),
+        growable: true);
   }
 
   List<DartType> readDartTypeList() {
     int length = readUInt30();
-    List<DartType> result =
-        new List<DartType>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readDartType();
-    }
-    return result;
+    return new List<DartType>.generate(length, (_) => readDartType(),
+        growable: true);
   }
 
   List<NamedType> readNamedTypeList() {
     int length = readUInt30();
-    List<NamedType> result =
-        new List<NamedType>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readNamedType();
-    }
-    return result;
+    return new List<NamedType>.generate(length, (_) => readNamedType(),
+        growable: true);
   }
 
   NamedType readNamedType() {
@@ -2897,10 +2862,9 @@
     int length = readUInt30();
     if (length == 0) return list ?? <TypeParameter>[];
     if (list == null) {
-      list = new List<TypeParameter>.filled(length, null, growable: true);
-      for (int i = 0; i < length; ++i) {
-        list[i] = new TypeParameter(null, null)..parent = parent;
-      }
+      list = new List<TypeParameter>.generate(
+          length, (_) => new TypeParameter(null, null)..parent = parent,
+          growable: true);
     } else if (list.length != length) {
       list.length = length;
       for (int i = 0; i < length; ++i) {
@@ -2939,12 +2903,9 @@
 
   List<NamedExpression> readNamedExpressionList() {
     int length = readUInt30();
-    List<NamedExpression> result =
-        new List<NamedExpression>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readNamedExpression();
-    }
-    return result;
+    return new List<NamedExpression>.generate(
+        length, (_) => readNamedExpression(),
+        growable: true);
   }
 
   NamedExpression readNamedExpression() {
@@ -2953,12 +2914,9 @@
 
   List<VariableDeclaration> readAndPushVariableDeclarationList() {
     int length = readUInt30();
-    List<VariableDeclaration> result =
-        new List<VariableDeclaration>.filled(length, null, growable: true);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readAndPushVariableDeclaration();
-    }
-    return result;
+    return new List<VariableDeclaration>.generate(
+        length, (_) => readAndPushVariableDeclaration(),
+        growable: true);
   }
 
   VariableDeclaration readAndPushVariableDeclarationOption() {
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 348954f..74ebc7c 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -166,30 +166,30 @@
   V(::, _abi, FfiAbi, 0x7c4ab775)                                              \
   V(::, _asFunctionInternal, FfiAsFunctionInternal, 0xbbcb235a)                \
   V(::, _nativeCallbackFunction, FfiNativeCallbackFunction, 0x3ff5ae9c)        \
-  V(::, _loadInt8, FfiLoadInt8, 0xa54bed8c)                                    \
-  V(::, _loadInt16, FfiLoadInt16, 0x828b3ee3)                                  \
-  V(::, _loadInt32, FfiLoadInt32, 0x84694d79)                                  \
-  V(::, _loadInt64, FfiLoadInt64, 0x7536cd59)                                  \
-  V(::, _loadUint8, FfiLoadUint8, 0x77952a87)                                  \
-  V(::, _loadUint16, FfiLoadUint16, 0xa31d6aa0)                                \
-  V(::, _loadUint32, FfiLoadUint32, 0x8cb59e0b)                                \
-  V(::, _loadUint64, FfiLoadUint64, 0x9b4d0b82)                                \
-  V(::, _loadIntPtr, FfiLoadIntPtr, 0x8220c1f4)                                \
-  V(::, _loadFloat, FfiLoadFloat, 0x8f209213)                                  \
-  V(::, _loadDouble, FfiLoadDouble, 0x8d53d3cf)                                \
-  V(::, _loadPointer, FfiLoadPointer, 0xc50e1486)                              \
-  V(::, _storeInt8, FfiStoreInt8, 0x000b2742)                                  \
-  V(::, _storeInt16, FfiStoreInt16, 0xf9086b68)                                \
-  V(::, _storeInt32, FfiStoreInt32, 0x1ca0a493)                                \
-  V(::, _storeInt64, FfiStoreInt64, 0x128e85b0)                                \
-  V(::, _storeUint8, FfiStoreUint8, 0x26284b2c)                                \
-  V(::, _storeUint16, FfiStoreUint16, 0x03b82314)                              \
-  V(::, _storeUint32, FfiStoreUint32, 0x069260fb)                              \
-  V(::, _storeUint64, FfiStoreUint64, 0x0393aa6f)                              \
-  V(::, _storeIntPtr, FfiStoreIntPtr, 0x28bcdede)                              \
-  V(::, _storeFloat, FfiStoreFloat, 0x853f68b4)                                \
-  V(::, _storeDouble, FfiStoreDouble, 0x6354049a)                              \
-  V(::, _storePointer, FfiStorePointer, 0x0cfd005b)                            \
+  V(::, _loadInt8, FfiLoadInt8, 0x0f04dfd6)                                    \
+  V(::, _loadInt16, FfiLoadInt16, 0xec44312d)                                  \
+  V(::, _loadInt32, FfiLoadInt32, 0xee223fc3)                                  \
+  V(::, _loadInt64, FfiLoadInt64, 0xdeefbfa3)                                  \
+  V(::, _loadUint8, FfiLoadUint8, 0xe14e1cd1)                                  \
+  V(::, _loadUint16, FfiLoadUint16, 0x0cd65cea)                                \
+  V(::, _loadUint32, FfiLoadUint32, 0xf66e9055)                                \
+  V(::, _loadUint64, FfiLoadUint64, 0x0505fdcc)                                \
+  V(::, _loadIntPtr, FfiLoadIntPtr, 0xebd9b43e)                                \
+  V(::, _loadFloat, FfiLoadFloat, 0xf8d9845d)                                  \
+  V(::, _loadDouble, FfiLoadDouble, 0xf70cc619)                                \
+  V(::, _loadPointer, FfiLoadPointer, 0x4e79d0fc)                              \
+  V(::, _storeInt8, FfiStoreInt8, 0xdf50af0c)                                  \
+  V(::, _storeInt16, FfiStoreInt16, 0xd84df332)                                \
+  V(::, _storeInt32, FfiStoreInt32, 0xfbe62c5d)                                \
+  V(::, _storeInt64, FfiStoreInt64, 0xf1d40d7a)                                \
+  V(::, _storeUint8, FfiStoreUint8, 0x056dd2f6)                                \
+  V(::, _storeUint16, FfiStoreUint16, 0xe2fdaade)                              \
+  V(::, _storeUint32, FfiStoreUint32, 0xe5d7e8c5)                              \
+  V(::, _storeUint64, FfiStoreUint64, 0xe2d93239)                              \
+  V(::, _storeIntPtr, FfiStoreIntPtr, 0x080266a8)                              \
+  V(::, _storeFloat, FfiStoreFloat, 0x6484f07e)                                \
+  V(::, _storeDouble, FfiStoreDouble, 0x42998c64)                              \
+  V(::, _storePointer, FfiStorePointer, 0xea6b7751)                            \
   V(::, _fromAddress, FfiFromAddress, 0xfd8cb1cc)                              \
   V(Pointer, get:address, FfiGetAddress, 0x7cde87be)                           \
   V(::, reachabilityFence, ReachabilityFence, 0x619235c1)                      \
diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart
index 3a43c2b..4c69e41 100644
--- a/sdk/lib/_internal/vm/lib/ffi_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart
@@ -168,89 +168,95 @@
 // and GCing new spaces takes a lot of the benchmark time. The next speedup is
 // getting rid of these allocations by inlining these functions.
 @pragma("vm:recognized", "other")
-int _loadInt8(Pointer pointer, int offsetInBytes) native "Ffi_loadInt8";
+int _loadInt8(Object typedDataBase, int offsetInBytes) native "Ffi_loadInt8";
 
 @pragma("vm:recognized", "other")
-int _loadInt16(Pointer pointer, int offsetInBytes) native "Ffi_loadInt16";
+int _loadInt16(Object typedDataBase, int offsetInBytes) native "Ffi_loadInt16";
 
 @pragma("vm:recognized", "other")
-int _loadInt32(Pointer pointer, int offsetInBytes) native "Ffi_loadInt32";
+int _loadInt32(Object typedDataBase, int offsetInBytes) native "Ffi_loadInt32";
 
 @pragma("vm:recognized", "other")
-int _loadInt64(Pointer pointer, int offsetInBytes) native "Ffi_loadInt64";
+int _loadInt64(Object typedDataBase, int offsetInBytes) native "Ffi_loadInt64";
 
 @pragma("vm:recognized", "other")
-int _loadUint8(Pointer pointer, int offsetInBytes) native "Ffi_loadUint8";
+int _loadUint8(Object typedDataBase, int offsetInBytes) native "Ffi_loadUint8";
 
 @pragma("vm:recognized", "other")
-int _loadUint16(Pointer pointer, int offsetInBytes) native "Ffi_loadUint16";
+int _loadUint16(Object typedDataBase, int offsetInBytes)
+    native "Ffi_loadUint16";
 
 @pragma("vm:recognized", "other")
-int _loadUint32(Pointer pointer, int offsetInBytes) native "Ffi_loadUint32";
+int _loadUint32(Object typedDataBase, int offsetInBytes)
+    native "Ffi_loadUint32";
 
 @pragma("vm:recognized", "other")
-int _loadUint64(Pointer pointer, int offsetInBytes) native "Ffi_loadUint64";
+int _loadUint64(Object typedDataBase, int offsetInBytes)
+    native "Ffi_loadUint64";
 
 @pragma("vm:recognized", "other")
-int _loadIntPtr(Pointer pointer, int offsetInBytes) native "Ffi_loadIntPtr";
+int _loadIntPtr(Object typedDataBase, int offsetInBytes)
+    native "Ffi_loadIntPtr";
 
 @pragma("vm:recognized", "other")
-double _loadFloat(Pointer pointer, int offsetInBytes) native "Ffi_loadFloat";
+double _loadFloat(Object typedDataBase, int offsetInBytes)
+    native "Ffi_loadFloat";
 
 @pragma("vm:recognized", "other")
-double _loadDouble(Pointer pointer, int offsetInBytes) native "Ffi_loadDouble";
+double _loadDouble(Object typedDataBase, int offsetInBytes)
+    native "Ffi_loadDouble";
 
 @pragma("vm:recognized", "other")
 Pointer<S> _loadPointer<S extends NativeType>(
-    Pointer pointer, int offsetInBytes) native "Ffi_loadPointer";
+    Object typedDataBase, int offsetInBytes) native "Ffi_loadPointer";
 
 @pragma("vm:recognized", "other")
-void _storeInt8(Pointer pointer, int offsetInBytes, int value)
+void _storeInt8(Object typedDataBase, int offsetInBytes, int value)
     native "Ffi_storeInt8";
 
 @pragma("vm:recognized", "other")
-void _storeInt16(Pointer pointer, int offsetInBytes, int value)
+void _storeInt16(Object typedDataBase, int offsetInBytes, int value)
     native "Ffi_storeInt16";
 
 @pragma("vm:recognized", "other")
-void _storeInt32(Pointer pointer, int offsetInBytes, int value)
+void _storeInt32(Object typedDataBase, int offsetInBytes, int value)
     native "Ffi_storeInt32";
 
 @pragma("vm:recognized", "other")
-void _storeInt64(Pointer pointer, int offsetInBytes, int value)
+void _storeInt64(Object typedDataBase, int offsetInBytes, int value)
     native "Ffi_storeInt64";
 
 @pragma("vm:recognized", "other")
-void _storeUint8(Pointer pointer, int offsetInBytes, int value)
+void _storeUint8(Object typedDataBase, int offsetInBytes, int value)
     native "Ffi_storeUint8";
 
 @pragma("vm:recognized", "other")
-void _storeUint16(Pointer pointer, int offsetInBytes, int value)
+void _storeUint16(Object typedDataBase, int offsetInBytes, int value)
     native "Ffi_storeUint16";
 
 @pragma("vm:recognized", "other")
-void _storeUint32(Pointer pointer, int offsetInBytes, int value)
+void _storeUint32(Object typedDataBase, int offsetInBytes, int value)
     native "Ffi_storeUint32";
 
 @pragma("vm:recognized", "other")
-void _storeUint64(Pointer pointer, int offsetInBytes, int value)
+void _storeUint64(Object typedDataBase, int offsetInBytes, int value)
     native "Ffi_storeUint64";
 
 @pragma("vm:recognized", "other")
-void _storeIntPtr(Pointer pointer, int offsetInBytes, int value)
+void _storeIntPtr(Object typedDataBase, int offsetInBytes, int value)
     native "Ffi_storeIntPtr";
 
 @pragma("vm:recognized", "other")
-void _storeFloat(Pointer pointer, int offsetInBytes, double value)
+void _storeFloat(Object typedDataBase, int offsetInBytes, double value)
     native "Ffi_storeFloat";
 
 @pragma("vm:recognized", "other")
-void _storeDouble(Pointer pointer, int offsetInBytes, double value)
+void _storeDouble(Object typedDataBase, int offsetInBytes, double value)
     native "Ffi_storeDouble";
 
 @pragma("vm:recognized", "other")
-void _storePointer<S extends NativeType>(Pointer pointer, int offsetInBytes,
-    Pointer<S> value) native "Ffi_storePointer";
+void _storePointer<S extends NativeType>(Object typedDataBase,
+    int offsetInBytes, Pointer<S> value) native "Ffi_storePointer";
 
 Pointer<Int8> _elementAtInt8(Pointer<Int8> pointer, int index) =>
     Pointer.fromAddress(pointer.address + 1 * index);
diff --git a/tools/VERSION b/tools/VERSION
index ffe0133..75028e0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 19
+PRERELEASE 20
 PRERELEASE_PATCH 0
\ No newline at end of file
