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