Version 2.10.5

* Cherry-pick 3bef6cf639610ea542d7eb64b37d84289ab2899e to stable
* Cherry-pick df8c80954c316f4d332d85653aa6358188e8a2f0 to stable
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 16585cd..2b2d6ea 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 2.10.5 - 2020-01-21
+
+This is a patch release that fixes a crash in the Dart VM. (issue [#44563][]).
+
+[#44563]: https://github.com/dart-lang/sdk/issues/44563
+
 ## 2.10.4 - 2020-11-12
 
 This is a patch release that fixes a crash in the Dart VM (issues [#43941][],
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 71e556b..e48f809 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -309,13 +309,6 @@
     if (_typeFlowAnalysis.isMemberUsed(member)) {
       if (member is Field) {
         _setInferredType(member, _typeFlowAnalysis.fieldType(member));
-
-        final unboxingInfoMetadata =
-            _unboxingInfo.getUnboxingInfoOfMember(member);
-        if (unboxingInfoMetadata != null &&
-            !unboxingInfoMetadata.isFullyBoxed) {
-          _unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
-        }
       } else {
         Args<Type> argTypes = _typeFlowAnalysis.argumentTypes(member);
         final uncheckedParameters =
@@ -346,36 +339,41 @@
               skipCheck: uncheckedParameters.contains(param));
         }
 
-        final unboxingInfoMetadata =
-            _unboxingInfo.getUnboxingInfoOfMember(member);
-        if (unboxingInfoMetadata != null &&
-            !unboxingInfoMetadata.isFullyBoxed) {
-          _unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
-        }
-
         // TODO(alexmarkov): figure out how to pass receiver type.
       }
-    } else if (!member.isAbstract &&
-        !fieldMorpher.isExtraMemberWithReachableBody(member)) {
-      _setUnreachable(member);
-    } else if (member is! Field) {
+
       final unboxingInfoMetadata =
           _unboxingInfo.getUnboxingInfoOfMember(member);
-      if (unboxingInfoMetadata != null) {
-        // Check for partitions that only have abstract methods should be marked as boxed.
-        if (unboxingInfoMetadata.returnInfo ==
-            UnboxingInfoMetadata.kUnboxingCandidate) {
-          unboxingInfoMetadata.returnInfo = UnboxingInfoMetadata.kBoxed;
-        }
-        for (int i = 0; i < unboxingInfoMetadata.unboxedArgsInfo.length; i++) {
-          if (unboxingInfoMetadata.unboxedArgsInfo[i] ==
+      if (unboxingInfoMetadata != null && !unboxingInfoMetadata.isFullyBoxed) {
+        _unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
+      }
+    } else {
+      if (!member.isAbstract &&
+          !fieldMorpher.isExtraMemberWithReachableBody(member)) {
+        _setUnreachable(member);
+      }
+
+      if (member is! Field) {
+        final unboxingInfoMetadata =
+            _unboxingInfo.getUnboxingInfoOfMember(member);
+        if (unboxingInfoMetadata != null) {
+          // Check for partitions that only have abstract methods should be marked as boxed.
+          if (unboxingInfoMetadata.returnInfo ==
               UnboxingInfoMetadata.kUnboxingCandidate) {
-            unboxingInfoMetadata.unboxedArgsInfo[i] =
-                UnboxingInfoMetadata.kBoxed;
+            unboxingInfoMetadata.returnInfo = UnboxingInfoMetadata.kBoxed;
           }
-        }
-        if (!unboxingInfoMetadata.isFullyBoxed) {
-          _unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
+          for (int i = 0;
+              i < unboxingInfoMetadata.unboxedArgsInfo.length;
+              i++) {
+            if (unboxingInfoMetadata.unboxedArgsInfo[i] ==
+                UnboxingInfoMetadata.kUnboxingCandidate) {
+              unboxingInfoMetadata.unboxedArgsInfo[i] =
+                  UnboxingInfoMetadata.kBoxed;
+            }
+          }
+          if (!unboxingInfoMetadata.isFullyBoxed) {
+            _unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
+          }
         }
       }
     }
diff --git a/runtime/tests/vm/dart/regress_44563_test.dart b/runtime/tests/vm/dart/regress_44563_test.dart
new file mode 100644
index 0000000..6b1baa6
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_44563_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2021, 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.
+
+// Verifies that unboxing info is attached to a member with unreachable body,
+// which is still used as an interface target.
+// Regression test for https://github.com/dart-lang/sdk/issues/44563.
+
+import 'package:expect/expect.dart';
+
+class BaseClass {
+  int get value => 0;
+}
+
+class Class1 extends BaseClass {
+  @pragma('vm:never-inline')
+  int get value => 1;
+}
+
+class Class2 extends BaseClass {
+  @pragma('vm:never-inline')
+  int get value => 2;
+}
+
+bool nonConstantCondition = int.parse("1") == 1;
+
+void main() {
+  BaseClass obj = BaseClass();
+  obj = nonConstantCondition ? Class1() : Class2();
+  Expect.equals(1, obj.value);
+}
diff --git a/runtime/tests/vm/dart_2/regress_44563_test.dart b/runtime/tests/vm/dart_2/regress_44563_test.dart
new file mode 100644
index 0000000..6b1baa6
--- /dev/null
+++ b/runtime/tests/vm/dart_2/regress_44563_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2021, 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.
+
+// Verifies that unboxing info is attached to a member with unreachable body,
+// which is still used as an interface target.
+// Regression test for https://github.com/dart-lang/sdk/issues/44563.
+
+import 'package:expect/expect.dart';
+
+class BaseClass {
+  int get value => 0;
+}
+
+class Class1 extends BaseClass {
+  @pragma('vm:never-inline')
+  int get value => 1;
+}
+
+class Class2 extends BaseClass {
+  @pragma('vm:never-inline')
+  int get value => 2;
+}
+
+bool nonConstantCondition = int.parse("1") == 1;
+
+void main() {
+  BaseClass obj = BaseClass();
+  obj = nonConstantCondition ? Class1() : Class2();
+  Expect.equals(1, obj.value);
+}
diff --git a/tools/VERSION b/tools/VERSION
index 16def66..c9dea19 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -26,6 +26,6 @@
 CHANNEL stable
 MAJOR 2
 MINOR 10
-PATCH 4
+PATCH 5
 PRERELEASE 0
 PRERELEASE_PATCH 0