Version 2.16.0-13.0.dev
Merge commit 'c4a07a88f9c0a233e40f37fb919c183921c05e96' into 'dev'
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 4bc6cdc..80eebe3 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1045,20 +1045,16 @@
var callerType = InferenceContext.getContext(node);
NodeList<Expression> arguments = node.arguments;
if (callerType is FunctionType) {
- Map<String, DartType> namedParameterTypes =
- callerType.namedParameterTypes;
- List<DartType> normalParameterTypes = callerType.normalParameterTypes;
- List<DartType> optionalParameterTypes = callerType.optionalParameterTypes;
- int normalCount = normalParameterTypes.length;
- int optionalCount = optionalParameterTypes.length;
+ var parameters = callerType.parameters;
- Iterable<Expression> positional =
- arguments.takeWhile((l) => l is! NamedExpression);
- Iterable<Expression> required = positional.take(normalCount);
- Iterable<Expression> optional =
- positional.skip(normalCount).take(optionalCount);
- Iterable<Expression> named =
- arguments.skipWhile((l) => l is! NamedExpression);
+ var namedParameters = <String, ParameterElement>{};
+ for (var i = 0; i < parameters.length; i++) {
+ var parameter = parameters[i];
+ if (parameter.isNamed) {
+ namedParameters[parameter.name] = parameter;
+ }
+ }
+
var parent = node.parent;
DartType? targetType;
Element? methodElement;
@@ -1072,28 +1068,29 @@
//TODO(leafp): Consider using the parameter elements here instead.
//TODO(leafp): Make sure that the parameter elements are getting
// setup correctly with inference.
- int index = 0;
- for (Expression argument in required) {
- var parameterType = normalParameterTypes[index++];
- if (targetType != null) {
- InferenceContext.setType(
- argument,
- typeSystem.refineNumericInvocationContext(
- targetType, methodElement, invocationContext, parameterType));
- } else {
- InferenceContext.setType(argument, parameterType);
- }
- }
- index = 0;
- for (Expression argument in optional) {
- InferenceContext.setType(argument, optionalParameterTypes[index++]);
- }
-
- for (Expression argument in named) {
+ var positionalParameterIndex = 0;
+ for (var i = 0; i < arguments.length; i++) {
+ var argument = arguments[i];
+ ParameterElement? parameter;
if (argument is NamedExpression) {
- var type = namedParameterTypes[argument.name.label.name];
- if (type != null) {
- InferenceContext.setType(argument, type);
+ parameter = namedParameters[argument.name.label.name];
+ } else {
+ while (positionalParameterIndex < parameters.length) {
+ parameter = parameters[positionalParameterIndex++];
+ if (!parameter.isNamed) {
+ break;
+ }
+ }
+ }
+ if (parameter != null) {
+ var parameterType = parameter.type;
+ if (targetType != null) {
+ InferenceContext.setType(
+ argument,
+ typeSystem.refineNumericInvocationContext(targetType,
+ methodElement, invocationContext, parameterType));
+ } else {
+ InferenceContext.setType(argument, parameterType);
}
}
}
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index feac804..5175800 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -305,42 +305,48 @@
test_namedArgument_anywhere() async {
await assertNoErrorsInCode('''
-class A {
- A(int a, double b, {bool? c, bool? d});
+class A {}
+class B {}
+class C {}
+class D {}
+
+class X {
+ X(A a, B b, {C? c, D? d});
}
+T g1<T>() => throw 0;
+T g2<T>() => throw 0;
+T g3<T>() => throw 0;
+T g4<T>() => throw 0;
+
void f() {
- A(0, c: true, 1.2, d: true);
+ X(g1(), c: g3(), g2(), d: g4());
}
''');
assertInstanceCreation(
- findNode.instanceCreation('A(0'),
- findElement.class_('A'),
- 'A',
+ findNode.instanceCreation('X(g'),
+ findElement.class_('X'),
+ 'X',
);
- assertParameterElement(
- findNode.integerLiteral('0'),
- findElement.parameter('a'),
- );
+ var g1 = findNode.methodInvocation('g1()');
+ assertType(g1, 'A');
+ assertParameterElement(g1, findElement.parameter('a'));
- assertParameterElement(
- findNode.doubleLiteral('1.2'),
- findElement.parameter('b'),
- );
+ var g2 = findNode.methodInvocation('g2()');
+ assertType(g2, 'B');
+ assertParameterElement(g2, findElement.parameter('b'));
- assertParameterElement(
- findNode.namedExpression('c: true'),
- findElement.parameter('c'),
- );
- assertNamedParameterRef('c: true', 'c');
+ var named_g3 = findNode.namedExpression('c: g3()');
+ assertType(named_g3.expression, 'C?');
+ assertParameterElement(named_g3, findElement.parameter('c'));
+ assertNamedParameterRef('c:', 'c');
- assertParameterElement(
- findNode.namedExpression('d: true'),
- findElement.parameter('d'),
- );
- assertNamedParameterRef('d: true', 'd');
+ var named_g4 = findNode.namedExpression('d: g4()');
+ assertType(named_g4.expression, 'D?');
+ assertParameterElement(named_g4, findElement.parameter('d'));
+ assertNamedParameterRef('d:', 'd');
}
test_typeAlias_generic_class_generic_named_infer_all() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index 32d8c5d..c564c0c 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -2865,40 +2865,46 @@
test_namedArgument_anywhere() async {
await assertNoErrorsInCode('''
-void foo(int a, double b, {bool? c, bool? d}) {}
+class A {}
+class B {}
+class C {}
+class D {}
+
+void foo(A a, B b, {C? c, D? d}) {}
+
+T g1<T>() => throw 0;
+T g2<T>() => throw 0;
+T g3<T>() => throw 0;
+T g4<T>() => throw 0;
void f() {
- foo(0, c: true, 1.2, d: true);
+ foo(g1(), c: g3(), g2(), d: g4());
}
''');
assertMethodInvocation(
- findNode.methodInvocation('foo(0'),
+ findNode.methodInvocation('foo(g'),
findElement.topFunction('foo'),
- 'void Function(int, double, {bool? c, bool? d})',
+ 'void Function(A, B, {C? c, D? d})',
);
- assertParameterElement(
- findNode.integerLiteral('0'),
- findElement.parameter('a'),
- );
+ var g1 = findNode.methodInvocation('g1()');
+ assertType(g1, 'A');
+ assertParameterElement(g1, findElement.parameter('a'));
- assertParameterElement(
- findNode.doubleLiteral('1.2'),
- findElement.parameter('b'),
- );
+ var g2 = findNode.methodInvocation('g2()');
+ assertType(g2, 'B');
+ assertParameterElement(g2, findElement.parameter('b'));
- assertParameterElement(
- findNode.namedExpression('c: true'),
- findElement.parameter('c'),
- );
- assertNamedParameterRef('c: true', 'c');
+ var named_g3 = findNode.namedExpression('c: g3()');
+ assertType(named_g3.expression, 'C?');
+ assertParameterElement(named_g3, findElement.parameter('c'));
+ assertNamedParameterRef('c:', 'c');
- assertParameterElement(
- findNode.namedExpression('d: true'),
- findElement.parameter('d'),
- );
- assertNamedParameterRef('d: true', 'd');
+ var named_g4 = findNode.namedExpression('d: g4()');
+ assertType(named_g4.expression, 'D?');
+ assertParameterElement(named_g4, findElement.parameter('d'));
+ assertNamedParameterRef('d:', 'd');
}
test_nullShorting_cascade_firstMethodInvocation() async {
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index f3bb2bd..f57a6c4 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -108,7 +108,7 @@
const Dart_Port destination_port_id = port.Id();
const bool can_send_any_object = isolate->origin_id() == port.origin_id();
- // We have to check whether the reciever has the same isolate group (e.g.
+ // We have to check whether the receiver has the same isolate group (e.g.
// native message handlers such as an IOService handler does not but does
// share the same origin port).
const bool same_group = PortMap::IsReceiverInThisIsolateGroup(
@@ -717,7 +717,11 @@
}
state_->set_isolate(child);
- child->set_origin_id(state_->origin_id());
+ if (state_->origin_id() != ILLEGAL_PORT) {
+ // origin_id is set to parent isolate main port id when spawning via
+ // spawnFunction.
+ child->set_origin_id(state_->origin_id());
+ }
bool success = true;
{
diff --git a/runtime/tests/vm/dart/isolates/send_object_to_spawn_uri_isolate_test.dart b/runtime/tests/vm/dart/isolates/send_object_to_spawn_uri_isolate_test.dart
new file mode 100644
index 0000000..37eb717
--- /dev/null
+++ b/runtime/tests/vm/dart/isolates/send_object_to_spawn_uri_isolate_test.dart
@@ -0,0 +1,52 @@
+// 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.
+//
+// This test ensures that one can't send user dart objects to
+// an isolate spawned via spawnUri.
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'package:expect/expect.dart';
+import "package:test/test.dart";
+
+class Foo {
+ var bar = 123;
+}
+
+Future<void> main(args, message) async {
+ if (message == null) {
+ final receivePort = ReceivePort();
+ final isolate = await Isolate.spawnUri(
+ Platform.script, <String>[], <SendPort>[receivePort.sendPort],
+ errorsAreFatal: true);
+ final result = await receivePort.first;
+ Expect.equals("done", result);
+ return;
+ }
+
+ if (args.length > 0) {
+ Expect.equals("worker", args[0]);
+ final SendPort sendPort = message[0] as SendPort;
+ Expect.throws(() => sendPort.send(Foo()));
+ sendPort.send("done");
+ } else {
+ final SendPort sendPort = message[0] as SendPort;
+
+ final receivePort = ReceivePort();
+ try {
+ final isolate = await Isolate.spawnUri(
+ Platform.script, <String>["worker"], <SendPort>[receivePort.sendPort],
+ errorsAreFatal: true);
+ final result = await receivePort.first;
+ Expect.equals("done", result);
+ sendPort.send("done");
+ } catch (_) {
+ sendPort.send("fail");
+ }
+
+ sendPort.send("done");
+ }
+}
diff --git a/runtime/tests/vm/dart_2/isolates/send_object_to_spawn_uri_isolate_test.dart b/runtime/tests/vm/dart_2/isolates/send_object_to_spawn_uri_isolate_test.dart
new file mode 100644
index 0000000..8793ace
--- /dev/null
+++ b/runtime/tests/vm/dart_2/isolates/send_object_to_spawn_uri_isolate_test.dart
@@ -0,0 +1,54 @@
+// 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.
+//
+// @dart = 2.9
+//
+// This test ensures that one can't send user dart objects to
+// an isolate spawned via spawnUri.
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'package:expect/expect.dart';
+import "package:test/test.dart";
+
+class Foo {
+ var bar = 123;
+}
+
+Future<void> main(args, message) async {
+ if (message == null) {
+ final receivePort = ReceivePort();
+ final isolate = await Isolate.spawnUri(
+ Platform.script, <String>[], <SendPort>[receivePort.sendPort],
+ errorsAreFatal: true);
+ final result = await receivePort.first;
+ Expect.equals("done", result);
+ return;
+ }
+
+ if (args.length > 0) {
+ Expect.equals("worker", args[0]);
+ final SendPort sendPort = message[0] as SendPort;
+ Expect.throws(() => sendPort.send(Foo()));
+ sendPort.send("done");
+ } else {
+ final SendPort sendPort = message[0] as SendPort;
+
+ final receivePort = ReceivePort();
+ try {
+ final isolate = await Isolate.spawnUri(
+ Platform.script, <String>["worker"], <SendPort>[receivePort.sendPort],
+ errorsAreFatal: true);
+ final result = await receivePort.first;
+ Expect.equals("done", result);
+ sendPort.send("done");
+ } catch (_) {
+ sendPort.send("fail");
+ }
+
+ sendPort.send("done");
+ }
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 8de67b8..9f7c51c 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -421,8 +421,10 @@
# These Isolate tests that use spawnURI are hence skipped on purpose.
[ $runtime == dart_precompiled || $runtime == vm && ($arch == simarm || $arch == simarm64 || $arch == simarm64c) ]
dart/data_uri_spawn_test: SkipByDesign # Isolate.spawnUri
+dart/isolates/send_object_to_spawn_uri_isolate_test: SkipByDesign # uses spawnUri
dart/issue32950_test: SkipByDesign # uses spawnUri.
dart_2/data_uri_spawn_test: SkipByDesign # Isolate.spawnUri
+dart_2/isolates/send_object_to_spawn_uri_isolate_test: SkipByDesign # uses spawnUri
dart_2/issue32950_test: SkipByDesign # uses spawnUri.
[ $runtime != dart_precompiled || $system == android ]
diff --git a/tools/VERSION b/tools/VERSION
index 72690ae..25961f5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 16
PATCH 0
-PRERELEASE 12
+PRERELEASE 13
PRERELEASE_PATCH 0
\ No newline at end of file