Version 2.13.0-67.0.dev

Merge commit 'c7422d5277fcc58ddc41dc8598fcbaf4571322da' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index a11211b..d3231e9 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-02-22T20:16:11.942470",
+  "generated": "2021-02-23T10:05:38.675159",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -446,7 +446,7 @@
       "name": "native_stack_traces",
       "rootUri": "../pkg/native_stack_traces",
       "packageUri": "lib/",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     },
     {
       "name": "nnbd_migration",
diff --git a/benchmarks/FfiMemory/dart/FfiMemory.dart b/benchmarks/FfiMemory/dart/FfiMemory.dart
index b776aa8..1b822fb 100644
--- a/benchmarks/FfiMemory/dart/FfiMemory.dart
+++ b/benchmarks/FfiMemory/dart/FfiMemory.dart
@@ -10,6 +10,7 @@
 // Dart with a specific marshalling and unmarshalling of data.
 
 import 'dart:ffi';
+import 'dart:typed_data';
 
 import 'package:ffi/ffi.dart';
 import 'package:benchmark_harness/benchmark_harness.dart';
@@ -24,6 +25,12 @@
   }
 }
 
+void doStoreInt8TypedData(Int8List typedData, int length) {
+  for (int i = 0; i < length; i++) {
+    typedData[i] = 1;
+  }
+}
+
 void doStoreUint8(Pointer<Uint8> pointer, int length) {
   for (int i = 0; i < length; i++) {
     pointer[i] = 1;
@@ -103,6 +110,14 @@
   return x;
 }
 
+int doLoadInt8TypedData(Int8List typedData, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += typedData[i];
+  }
+  return x;
+}
+
 int doLoadUint8(Pointer<Uint8> pointer, int length) {
   int x = 0;
   for (int i = 0; i < length; i++) {
@@ -224,6 +239,62 @@
   }
 }
 
+class PointerInt8TypedDataNew extends BenchmarkBase {
+  Pointer<Int8> pointer = nullptr;
+  PointerInt8TypedDataNew() : super('FfiMemory.PointerInt8TypedDataNew');
+
+  @override
+  void setup() {
+    pointer = calloc(N);
+  }
+
+  @override
+  void teardown() {
+    calloc.free(pointer);
+    pointer = nullptr;
+  }
+
+  @override
+  void run() {
+    final typedData = pointer.asTypedList(N);
+    doStoreInt8TypedData(typedData, N);
+    final int x = doLoadInt8TypedData(typedData, N);
+    if (x != N) {
+      throw Exception('$name: Unexpected result: $x, expected $N');
+    }
+  }
+}
+
+final emptyTypedData = Int8List(0);
+
+class PointerInt8TypedDataReuse extends BenchmarkBase {
+  Pointer<Int8> pointer = nullptr;
+  Int8List typedData = emptyTypedData;
+  PointerInt8TypedDataReuse() : super('FfiMemory.PointerInt8TypedDataReuse');
+
+  @override
+  void setup() {
+    pointer = calloc(N);
+    typedData = pointer.asTypedList(N);
+  }
+
+  @override
+  void teardown() {
+    calloc.free(pointer);
+    pointer = nullptr;
+    typedData = emptyTypedData;
+  }
+
+  @override
+  void run() {
+    doStoreInt8TypedData(typedData, N);
+    final int x = doLoadInt8TypedData(typedData, N);
+    if (x != N) {
+      throw Exception('$name: Unexpected result: $x, expected $N');
+    }
+  }
+}
+
 class PointerUint8 extends BenchmarkBase {
   Pointer<Uint8> pointer = nullptr;
   PointerUint8() : super('FfiMemory.PointerUint8');
@@ -449,6 +520,8 @@
 void main() {
   final benchmarks = [
     () => PointerInt8(),
+    () => PointerInt8TypedDataNew(),
+    () => PointerInt8TypedDataReuse(),
     () => PointerUint8(),
     () => PointerInt16(),
     () => PointerUint16(),
diff --git a/benchmarks/FfiMemory/dart2/FfiMemory.dart b/benchmarks/FfiMemory/dart2/FfiMemory.dart
index 5beff0a..f788959 100644
--- a/benchmarks/FfiMemory/dart2/FfiMemory.dart
+++ b/benchmarks/FfiMemory/dart2/FfiMemory.dart
@@ -12,6 +12,7 @@
 // @dart=2.9
 
 import 'dart:ffi';
+import 'dart:typed_data';
 
 import 'package:ffi/ffi.dart';
 import 'package:benchmark_harness/benchmark_harness.dart';
@@ -26,6 +27,12 @@
   }
 }
 
+void doStoreInt8TypedData(Int8List typedData, int length) {
+  for (int i = 0; i < length; i++) {
+    typedData[i] = 1;
+  }
+}
+
 void doStoreUint8(Pointer<Uint8> pointer, int length) {
   for (int i = 0; i < length; i++) {
     pointer[i] = 1;
@@ -105,6 +112,14 @@
   return x;
 }
 
+int doLoadInt8TypedData(Int8List typedData, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += typedData[i];
+  }
+  return x;
+}
+
 int doLoadUint8(Pointer<Uint8> pointer, int length) {
   int x = 0;
   for (int i = 0; i < length; i++) {
@@ -226,6 +241,60 @@
   }
 }
 
+class PointerInt8TypedDataNew extends BenchmarkBase {
+  Pointer<Int8> pointer;
+  PointerInt8TypedDataNew() : super('FfiMemory.PointerInt8TypedDataNew');
+
+  @override
+  void setup() {
+    pointer = calloc(N);
+  }
+
+  @override
+  void teardown() {
+    calloc.free(pointer);
+    pointer = null;
+  }
+
+  @override
+  void run() {
+    final typedData = pointer.asTypedList(N);
+    doStoreInt8TypedData(typedData, N);
+    final int x = doLoadInt8TypedData(typedData, N);
+    if (x != N) {
+      throw Exception('$name: Unexpected result: $x, expected $N');
+    }
+  }
+}
+
+class PointerInt8TypedDataReuse extends BenchmarkBase {
+  Pointer<Int8> pointer;
+  Int8List typedData;
+  PointerInt8TypedDataReuse() : super('FfiMemory.PointerInt8TypedDataReuse');
+
+  @override
+  void setup() {
+    pointer = calloc(N);
+    typedData = pointer.asTypedList(N);
+  }
+
+  @override
+  void teardown() {
+    calloc.free(pointer);
+    pointer = null;
+    typedData = null;
+  }
+
+  @override
+  void run() {
+    doStoreInt8TypedData(typedData, N);
+    final int x = doLoadInt8TypedData(typedData, N);
+    if (x != N) {
+      throw Exception('$name: Unexpected result: $x, expected $N');
+    }
+  }
+}
+
 class PointerUint8 extends BenchmarkBase {
   Pointer<Uint8> pointer;
   PointerUint8() : super('FfiMemory.PointerUint8');
@@ -451,6 +520,8 @@
 void main() {
   final benchmarks = [
     () => PointerInt8(),
+    () => PointerInt8TypedDataNew(),
+    () => PointerInt8TypedDataReuse(),
     () => PointerUint8(),
     () => PointerInt16(),
     () => PointerUint16(),
diff --git a/pkg/native_stack_traces/CHANGELOG.md b/pkg/native_stack_traces/CHANGELOG.md
index 71ca8ba..9b16d1c 100644
--- a/pkg/native_stack_traces/CHANGELOG.md
+++ b/pkg/native_stack_traces/CHANGELOG.md
@@ -1,5 +1,13 @@
 # Changelog
 
+## 0.4.0
+
+- Stable null safe version of package.
+
+## 0.4.0-nullsafety
+
+- Unstable null safe version of package.
+
 ## 0.3.8
 
 - Support columns when present in line number programs.
diff --git a/pkg/native_stack_traces/lib/src/elf.dart b/pkg/native_stack_traces/lib/src/elf.dart
index e92fecd..548b5ac 100644
--- a/pkg/native_stack_traces/lib/src/elf.dart
+++ b/pkg/native_stack_traces/lib/src/elf.dart
@@ -863,7 +863,6 @@
     if (header == null) return null;
     // At this point, the endianness and wordSize should have been set
     // during ElfHeader.fromReader.
-    assert(reader.endian != null && reader.wordSize != null);
     final programHeader = ProgramHeader.fromReader(reader, header);
     final sectionHeader = SectionHeader.fromReader(reader, header);
     final sections = <SectionHeaderEntry, Section>{};
diff --git a/pkg/native_stack_traces/pubspec.yaml b/pkg/native_stack_traces/pubspec.yaml
index f831df6..df71c5a 100644
--- a/pkg/native_stack_traces/pubspec.yaml
+++ b/pkg/native_stack_traces/pubspec.yaml
@@ -1,19 +1,18 @@
 name: native_stack_traces
 description: Utilities for working with non-symbolic stack traces.
-version: 0.4.0-nullsafety
+version: 0.4.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/native_stack_traces
 
 environment:
-  # This must remain a tight constraint until nnbd is stable
-  sdk: '>=2.10.0-0 <2.10.0'
+  sdk: '>=2.12.0-0 <3.0.0'
 
 executables:
   decode:
 
 dependencies:
-  args: ^1.6.0
-  path: ^1.8.0-nullsafety
+  args: ^2.0.0
+  path: ^1.8.0
 
 dev_dependencies:
-  pedantic: ^1.9.2
+  pedantic: ^1.10.0
diff --git a/tools/VERSION b/tools/VERSION
index fa1d5b6..b6f82ae 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 66
+PRERELEASE 67
 PRERELEASE_PATCH 0
\ No newline at end of file