Version 2.10.0-26.0.dev

Merge commit '813d25bd8e111f084eba29e63d67b7d1c830564e' into 'dev'
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index e6cd991..b1dc776 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -8415,10 +8415,11 @@
       SimpleIdentifier identifier = prefixed.identifier;
       assertSimpleIdentifier(
         identifier,
-        element: elementMatcher(
+        readElement: elementMatcher(
           objectHashCode,
           isLegacy: isNullSafetySdkAndLegacyLibrary,
         ),
+        writeElement: null,
         type: 'int',
       );
     }
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index 629a69a..2761663 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -67,9 +67,12 @@
     );
     assertType(assignment, 'num'); // num + int = num
 
-    SimpleIdentifier left = assignment.leftHandSide;
-    assertElement(left, findElement.localVar('v'));
-    assertType(left, 'num');
+    assertSimpleIdentifier(
+      assignment.leftHandSide,
+      readElement: findElement.localVar('v'),
+      writeElement: findElement.localVar('v'),
+      type: 'num',
+    );
 
     Expression right = assignment.rightHandSide;
     assertType(right, 'int');
@@ -376,9 +379,12 @@
     assertElementNull(assignment);
     assertType(assignment, 'int');
 
-    SimpleIdentifier left = assignment.leftHandSide;
-    assertElement(left, findElement.localVar('v'));
-    assertType(left, 'num');
+    assertSimpleIdentifier(
+      assignment.leftHandSide,
+      readElement: null,
+      writeElement: findElement.localVar('v'),
+      type: 'num',
+    );
 
     Expression right = assignment.rightHandSide;
     assertType(right, 'int');
@@ -550,9 +556,12 @@
     assertElementNull(assignment);
     assertType(assignment, 'int');
 
-    SimpleIdentifier left = assignment.leftHandSide;
-    assertElement(left, findElement.setter('f'));
-    assertType(left, 'num');
+    assertSimpleIdentifier(
+      assignment.leftHandSide,
+      readElement: null,
+      writeElement: findElement.setter('f'),
+      type: 'num',
+    );
 
     var right = assignment.rightHandSide;
     assertType(right, 'int');
@@ -569,9 +578,12 @@
     assertElementNull(assignment);
     assertType(assignment, 'int');
 
-    SimpleIdentifier left = assignment.leftHandSide;
-    assertElement(left, findElement.topSet('v'));
-    assertType(left, 'num');
+    assertSimpleIdentifier(
+      assignment.leftHandSide,
+      readElement: null,
+      writeElement: findElement.topSet('v'),
+      type: 'num',
+    );
 
     var right = assignment.rightHandSide;
     assertType(right, 'int');
diff --git a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
index 74fe485..dfd1530 100644
--- a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
@@ -64,7 +64,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('x++'),
-      element: findElement.topSet('x'),
+      readElement: findElement.topGet('x'),
+      writeElement: findElement.topSet('x'),
       type: 'num',
     );
 
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 1bf149e..163de13 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -164,7 +164,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo?'),
-      element: findElement.topGet('foo'),
+      readElement: findElement.topGet('foo'),
+      writeElement: null,
       type: 'A?',
     );
 
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index f9dc242..e6f5143 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -594,11 +594,30 @@
 
   void assertSimpleIdentifier(
     SimpleIdentifier node, {
-    @required Object element,
+    @required Object readElement,
+    @required Object writeElement,
     @required String type,
   }) {
-    assertElement(node.staticElement, element);
-    assertType(node, type);
+    var isRead = node.inGetterContext();
+    var isWrite = node.inSetterContext();
+    if (isRead && isWrite) {
+      // TODO(scheglov) enable this
+//      assertElement(node.auxiliaryElements?.staticElement, readElement);
+      assertElement(node.staticElement, writeElement);
+    } else if (isRead) {
+      assertElement(node.staticElement, readElement);
+    } else {
+      expect(isWrite, isTrue);
+      assertElement(node.staticElement, writeElement);
+    }
+
+    if (isRead) {
+      assertType(node, type);
+    } else {
+      // TODO(scheglov) enforce this
+//      expect(type, isNull);
+//      assertTypeNull(node);
+    }
   }
 
   void assertSubstitution(
diff --git a/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
index 76881d5..1214c58 100644
--- a/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
@@ -27,7 +27,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('dynamic;'),
-      element: dynamicElement,
+      readElement: dynamicElement,
+      writeElement: null,
       type: 'Type',
     );
   }
@@ -45,7 +46,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('dynamic;'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'dynamic',
     );
   }
@@ -59,7 +61,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('dynamic;'),
-      element: dynamicElement,
+      readElement: dynamicElement,
+      writeElement: null,
       type: 'Type',
     );
   }
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index 0cfcca7..440c7a7 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -386,7 +386,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'Never',
     );
   }
@@ -400,7 +401,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('hashCode'),
-      element: objectElement.getGetter('hashCode'),
+      readElement: objectElement.getGetter('hashCode'),
+      writeElement: null,
       type: 'Never',
     );
   }
@@ -416,7 +418,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'Never',
     );
 
@@ -436,7 +439,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('toString'),
-      element: objectElement.getMethod('toString'),
+      readElement: objectElement.getMethod('toString'),
+      writeElement: null,
       type: 'Never',
     );
   }
@@ -452,7 +456,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'Never',
     );
 
@@ -474,7 +479,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'dynamic',
     );
   }
@@ -488,7 +494,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('hashCode'),
-      element: objectElement.getGetter('hashCode'),
+      readElement: objectElement.getGetter('hashCode'),
+      writeElement: null,
       type: 'int',
     );
   }
@@ -502,7 +509,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('toString'),
-      element: objectElement.getMethod('toString'),
+      readElement: objectElement.getMethod('toString'),
+      writeElement: null,
       type: 'String Function()',
     );
   }
@@ -571,10 +579,11 @@
 
     assertSimpleIdentifier(
       findNode.simple('toString'),
-      element: elementMatcher(
+      readElement: elementMatcher(
         objectElement.getMethod('toString'),
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
+      writeElement: null,
       type: 'String Function()',
     );
   }
@@ -588,10 +597,11 @@
 
     assertSimpleIdentifier(
       findNode.simple('hashCode'),
-      element: elementMatcher(
+      readElement: elementMatcher(
         objectElement.getGetter('hashCode'),
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
+      writeElement: null,
       type: 'int',
     );
   }
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 6e71b13..e59a967 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -764,7 +764,8 @@
     ]);
     assertSimpleIdentifier(
       findNode.simple('isEven'),
-      element: intElement.getGetter('isEven'),
+      readElement: intElement.getGetter('isEven'),
+      writeElement: null,
       type: 'bool',
     );
   }
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index d4685fe..f9e0859 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -228,7 +228,13 @@
         : args.sublist(pathIndex + 1);
     try {
       path = Uri.parse(path).toFilePath();
-    } catch (_) {}
+    } catch (_) {
+      // Input path will either be a valid path or a file uri
+      // (e.g /directory/file.dart or file:///directory/file.dart). We will try
+      // parsing it as a Uri, but if parsing failed for any reason (likely
+      // because path is not a file Uri), `path` will be passed without
+      // modification to the VM.
+    }
     VmInteropHandler.run(path, runArgs);
     return 0;
   }
diff --git a/pkg/dartdev/test/smoke/smoke.dart b/pkg/dartdev/test/smoke/smoke.dart
index a6a5181..003118f 100644
--- a/pkg/dartdev/test/smoke/smoke.dart
+++ b/pkg/dartdev/test/smoke/smoke.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.10
+
 void main() {
   print('Smoke test!');
 }
diff --git a/pkg/dartdev/test/smoke/smoke_test.dart b/pkg/dartdev/test/smoke/smoke_test.dart
index 336db24..5f9c604 100644
--- a/pkg/dartdev/test/smoke/smoke_test.dart
+++ b/pkg/dartdev/test/smoke/smoke_test.dart
@@ -50,6 +50,23 @@
           expect(result.stderr, isEmpty);
         }
       });
+
+      test(
+          'dart --sound-null-safety --enable-experiment=non-nullable run smoke.dart',
+          () async {
+        final result = await Process.run(
+          Platform.executable,
+          [
+            '--sound-null-safety',
+            '--enable-experiment=non-nullable',
+            'run',
+            script,
+          ],
+        );
+        expect(result.exitCode, 0);
+        expect(result.stdout, contains('Smoke test!'));
+        expect(result.stderr, isEmpty);
+      });
     },
     timeout: Timeout.none,
   );
diff --git a/runtime/bin/dartdev_isolate.cc b/runtime/bin/dartdev_isolate.cc
index bf3a311..b85f8c3 100644
--- a/runtime/bin/dartdev_isolate.cc
+++ b/runtime/bin/dartdev_isolate.cc
@@ -75,8 +75,6 @@
     return Utils::CreateCStringUniquePtr(snapshot_path);
   }
   free(snapshot_path);
-
-  Syslog::PrintErr("Could not find DartDev snapshot.\n");
   return Utils::CreateCStringUniquePtr(nullptr);
 }
 
@@ -171,14 +169,6 @@
   MonitorLocker locker_(DartDevRunner::monitor_);
   DartDevRunner* runner = reinterpret_cast<DartDevRunner*>(args);
 
-  // TODO(bkonyi): bring up DartDev from kernel instead of a app-jit snapshot.
-  // See https://github.com/dart-lang/sdk/issues/42804
-  auto dartdev_path = DartDevIsolate::TryResolveDartDevSnapshotPath();
-  if (dartdev_path == nullptr) {
-    ProcessError("Failed to find DartDev snapshot.", kErrorExitCode);
-    return;
-  }
-
   // Hardcode flags to match those used to generate the DartDev snapshot.
   Dart_IsolateFlags flags;
   Dart_IsolateFlagsInitialize(&flags);
@@ -189,11 +179,13 @@
 
   char* error;
   Dart_Isolate dartdev_isolate = runner->create_isolate_(
-      dartdev_path.get(), "dartdev", nullptr, runner->packages_file_, &flags,
-      NULL /* callback_data */, const_cast<char**>(&error));
+      DART_DEV_ISOLATE_NAME, DART_DEV_ISOLATE_NAME, nullptr,
+      runner->packages_file_, &flags, /* callback_data */ nullptr,
+      const_cast<char**>(&error));
 
   if (dartdev_isolate == nullptr) {
     ProcessError(error, kErrorExitCode);
+    free(error);
     return;
   }
 
@@ -216,7 +208,8 @@
   }
 
   // Create a SendPort that DartDev can use to communicate its results over.
-  send_port_id = Dart_NewNativePort("dartdev", DartDevResultCallback, false);
+  send_port_id =
+      Dart_NewNativePort(DART_DEV_ISOLATE_NAME, DartDevResultCallback, false);
   ASSERT(send_port_id != ILLEGAL_PORT);
   Dart_Handle send_port = Dart_NewSendPort(send_port_id);
   CHECK_RESULT(send_port);
@@ -247,7 +240,7 @@
 
 void DartDevIsolate::DartDevRunner::ProcessError(const char* msg,
                                                  int32_t exit_code) {
-  Syslog::PrintErr("%s\n", msg);
+  Syslog::PrintErr("%s.\n", msg);
   Process::SetGlobalExitCode(exit_code);
   result_ = DartDevIsolate::DartDev_Result_Exit;
   DartDevRunner::monitor_->Notify();
diff --git a/runtime/bin/dartdev_isolate.h b/runtime/bin/dartdev_isolate.h
index ef6c780..7145c9b 100644
--- a/runtime/bin/dartdev_isolate.h
+++ b/runtime/bin/dartdev_isolate.h
@@ -15,6 +15,8 @@
 #include "platform/globals.h"
 #include "platform/utils.h"
 
+#define DART_DEV_ISOLATE_NAME "dartdev"
+
 namespace dart {
 namespace bin {
 
@@ -39,6 +41,10 @@
 
   static bool should_run_dart_dev() { return should_run_dart_dev_; }
 
+  // Attempts to find the DartDev snapshot. If the snapshot cannot be found,
+  // the VM will shutdown.
+  static Utils::CStringUniquePtr TryResolveDartDevSnapshotPath();
+
   // Starts a DartDev instance in a new isolate and runs it to completion.
   //
   // Returns true if the VM should run the result in `script`, in which case
@@ -82,10 +88,6 @@
   };
 
  private:
-  // Attempts to find the DartDev snapshot. If the snapshot cannot be found,
-  // the VM will shutdown.
-  static Utils::CStringUniquePtr TryResolveDartDevSnapshotPath();
-
   static DartDevRunner runner_;
   static bool should_run_dart_dev_;
 
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 69d82b0..9457dcd 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -382,10 +382,12 @@
   const char* isolate_name = nullptr;
   result = Dart_StringToCString(Dart_DebugName(), &isolate_name);
   CHECK_RESULT(result);
-  if (strstr(isolate_name, "dartdev") != nullptr) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (strstr(isolate_name, DART_DEV_ISOLATE_NAME) != nullptr) {
     Dart_SetShouldPauseOnStart(false);
     Dart_SetShouldPauseOnExit(false);
   }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   // Make the isolate runnable so that it is ready to handle messages.
   Dart_ExitScope();
@@ -565,6 +567,59 @@
 #endif  // !defined(PRODUCT)
 }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+static Dart_Isolate CreateAndSetupDartDevIsolate(const char* script_uri,
+                                                 const char* packages_config,
+                                                 Dart_IsolateFlags* flags,
+                                                 char** error,
+                                                 int* exit_code) {
+  int64_t start = Dart_TimelineGetMicros();
+
+  auto dartdev_path = DartDevIsolate::TryResolveDartDevSnapshotPath();
+  if (dartdev_path == nullptr) {
+    *error = Utils::StrDup("Unable to find DartDev snapshot");
+    return nullptr;
+  }
+
+  const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data;
+  const uint8_t* isolate_snapshot_instructions =
+      core_isolate_snapshot_instructions;
+
+  auto isolate_group_data =
+      new IsolateGroupData(DART_DEV_ISOLATE_NAME, packages_config, nullptr,
+                           /*isolate_run_app_snapshot*/ false);
+  uint8_t* application_kernel_buffer = NULL;
+  intptr_t application_kernel_buffer_size = 0;
+  dfe.ReadScript(dartdev_path.get(), &application_kernel_buffer,
+                 &application_kernel_buffer_size);
+  isolate_group_data->SetKernelBufferNewlyOwned(application_kernel_buffer,
+                                                application_kernel_buffer_size);
+
+  auto isolate_data = new IsolateData(isolate_group_data);
+  Dart_Isolate isolate = nullptr;
+  isolate = Dart_CreateIsolateGroup(
+      DART_DEV_ISOLATE_NAME, DART_DEV_ISOLATE_NAME, isolate_snapshot_data,
+      isolate_snapshot_instructions, flags, isolate_group_data, isolate_data,
+      error);
+
+  Dart_Isolate created_isolate = nullptr;
+  if (isolate == nullptr) {
+    delete isolate_data;
+    delete isolate_group_data;
+  } else {
+    created_isolate = IsolateSetupHelper(
+        isolate, false, DART_DEV_ISOLATE_NAME, packages_config,
+        /*isolate_run_app_snapshot*/ false, flags, error, exit_code);
+  }
+  int64_t end = Dart_TimelineGetMicros();
+  Dart_TimelineEvent("CreateAndSetupDartDevIsolate", start, end,
+                     Dart_Timeline_Event_Duration, 0, NULL, NULL);
+  return created_isolate;
+}
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
 // Returns newly created Isolate on success, NULL on failure.
 static Dart_Isolate CreateIsolateGroupAndSetupHelper(
     bool is_main_isolate,
@@ -722,10 +777,19 @@
                                        &exit_code);
   }
 #endif  // !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (strcmp(script_uri, DART_DEV_ISOLATE_NAME) == 0) {
+    return CreateAndSetupDartDevIsolate(script_uri, package_config, flags,
+                                        error, &exit_code);
+  }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
   if (strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0) {
     return CreateAndSetupServiceIsolate(script_uri, package_config, flags,
                                         error, &exit_code);
   }
+
   bool is_main_isolate = false;
   return CreateIsolateGroupAndSetupHelper(is_main_isolate, script_uri, main,
                                           package_config, flags, callback_data,
@@ -832,14 +896,13 @@
   // Call CreateIsolateGroupAndSetup which creates an isolate and loads up
   // the specified application script.
   char* error = NULL;
-  bool is_main_isolate = true;
   int exit_code = 0;
   Dart_IsolateFlags flags;
   Dart_IsolateFlagsInitialize(&flags);
 
   Dart_Isolate isolate = CreateIsolateGroupAndSetupHelper(
-      is_main_isolate, script_name, "main", Options::packages_file(), &flags,
-      NULL /* callback_data */, &error, &exit_code);
+      /* is_main_isolate */ true, script_name, "main", Options::packages_file(),
+      &flags, NULL /* callback_data */, &error, &exit_code);
 
   if (isolate == NULL) {
     Syslog::PrintErr("%s\n", error);
diff --git a/runtime/bin/socket_base.cc b/runtime/bin/socket_base.cc
index 4e61ce4..e90b138 100644
--- a/runtime/bin/socket_base.cc
+++ b/runtime/bin/socket_base.cc
@@ -254,14 +254,10 @@
   AddressList<SocketAddress>* addresses =
       SocketBase::LookupAddress(address, type, &os_error);
   if (addresses != NULL) {
-    Dart_Handle list = Dart_NewList(addresses->count());
-    for (intptr_t i = 0; i < addresses->count(); i++) {
-      SocketAddress* addr = addresses->GetAt(i);
-      Dart_ListSetAt(
-          list, i, Dart_NewInteger(SocketAddress::GetAddrScope(addr->addr())));
-    }
+    SocketAddress* addr = addresses->GetAt(0);
+    Dart_SetReturnValue(
+        args, Dart_NewInteger(SocketAddress::GetAddrScope(addr->addr())));
     delete addresses;
-    Dart_SetReturnValue(args, list);
   } else {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError(os_error));
     delete os_error;
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index a4cd2f2..abd886f 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -235,24 +235,25 @@
       }
       var inAddr = _parse(address);
       if (inAddr == null) {
-        throw ArgumentError.value("Invalid internet address $address");
+        throw ArgumentError('Invalid internet address $address');
       }
       InternetAddressType type = inAddr.length == _IPv4AddrLength
           ? InternetAddressType.IPv4
           : InternetAddressType.IPv6;
       if (scopeID != null && scopeID.length > 0) {
         if (type != InternetAddressType.IPv6) {
-          throw ArgumentError.value("IPv4 addresses cannot have a scope id");
+          throw ArgumentError.value(
+              address, 'address', 'IPv4 addresses cannot have a scope ID');
         }
-        // This is an IPv6 address with scope id.
-        var list = _parseScopedLinkLocalAddress(originalAddress);
 
-        if (list is! OSError && (list as List).isNotEmpty) {
-          return _InternetAddress(InternetAddressType.IPv6, originalAddress,
-              null, inAddr, list.first);
+        final scopeID = _parseScopedLinkLocalAddress(originalAddress);
+
+        if (scopeID is int) {
+          return _InternetAddress(
+              InternetAddressType.IPv6, originalAddress, null, inAddr, scopeID);
         } else {
           throw ArgumentError.value(
-              "Invalid IPv6 address $address with scope ID");
+              address, 'address', 'Invalid IPv6 address with scope ID');
         }
       }
       return _InternetAddress(type, originalAddress, null, inAddr, 0);
@@ -286,7 +287,7 @@
     checkNotNullable(address, "address");
     try {
       return _InternetAddress.fromString(address);
-    } catch (e) {
+    } on ArgumentError catch (_) {
       return null;
     }
   }
@@ -352,8 +353,8 @@
 
   static String _rawAddrToString(Uint8List address)
       native "InternetAddress_RawAddrToString";
-  static List _parseScopedLinkLocalAddress(String address)
-      native "InternetAddress_ParseScopedLinkLocalAddress";
+  static dynamic /* int | OSError */ _parseScopedLinkLocalAddress(
+      String address) native "InternetAddress_ParseScopedLinkLocalAddress";
   static Uint8List? _parse(String address) native "InternetAddress_Parse";
 }
 
diff --git a/tests/standalone/io/internet_address_test.dart b/tests/standalone/io/internet_address_test.dart
index d4d6a06..6671b92 100644
--- a/tests/standalone/io/internet_address_test.dart
+++ b/tests/standalone/io/internet_address_test.dart
@@ -209,6 +209,12 @@
   Expect.equals(InternetAddressType.unix, address.type);
 }
 
+void testInvalidScopedId() {
+  Expect.throws<ArgumentError>(() => InternetAddress('::1%invalid'), (error) {
+    return error.toString().contains('scope ID');
+  });
+}
+
 void main() {
   testDefaultAddresses();
   testConstructor();
@@ -219,4 +225,5 @@
   testRawAddress();
   testRawAddressIPv6();
   testRawPath();
+  testInvalidScopedId();
 }
diff --git a/tests/standalone_2/io/internet_address_test.dart b/tests/standalone_2/io/internet_address_test.dart
index 6d2dd54..47fc491 100644
--- a/tests/standalone_2/io/internet_address_test.dart
+++ b/tests/standalone_2/io/internet_address_test.dart
@@ -208,6 +208,12 @@
   Expect.equals(InternetAddressType.unix, address.type);
 }
 
+void testInvalidScopedId() {
+  Expect.throws<ArgumentError>(() => InternetAddress('::1%invalid'), (error) {
+    return error.toString().contains('scope ID');
+  });
+}
+
 void main() {
   testDefaultAddresses();
   testConstructor();
@@ -218,4 +224,5 @@
   testRawAddress();
   testRawAddressIPv6();
   testRawPath();
+  testInvalidScopedId();
 }
diff --git a/tools/VERSION b/tools/VERSION
index 93f5efb..03dfa4a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 25
+PRERELEASE 26
 PRERELEASE_PATCH 0
\ No newline at end of file