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