Version 2.10.0-15.0.dev
Merge commit '274b4d3ecb4b093b42a3386be9ac216187ee8523' into 'dev'
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart
index 1e39e30..baaf538 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart
@@ -2,9 +2,9 @@
// 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.
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
+import '../../../../src/utilities/mock_packages.dart';
import 'completion_relevance.dart';
void main() {
@@ -20,13 +20,10 @@
void setUp() {
super.setUp();
- var metaPath = '/.pub-cache/meta';
- PackagesContent.addMetaPackageFiles(
- getFolder(metaPath),
- );
+ var metaLibFolder = MockPackages.instance.addMeta(resourceProvider);
newFile('$projectPath/.packages', content: '''
-meta:${toUri('$metaPath/lib')}
+meta:${metaLibFolder.toUri()}
project:${toUri('$projectPath/lib')}
''');
}
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 6c61866..04f5609 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -433,6 +433,7 @@
CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION,
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE,
CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_POSITION,
diff --git a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
index 5285ca7..59e5543 100644
--- a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
@@ -371,17 +371,21 @@
) {
var element = node.staticElement;
var typeParameters = element.typeParameters;
- if (typeParameters.isEmpty) {
- return const <DartType>[];
- }
-
var typeArguments = node.typeArguments;
+
if (typeArguments != null) {
var arguments = typeArguments.arguments;
if (arguments.length == typeParameters.length) {
+ if (typeParameters.isEmpty) {
+ return const <DartType>[];
+ }
return arguments.map((a) => a.type).toList();
} else {
- // TODO(scheglov) Report an error.
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION,
+ typeArguments,
+ [element.name, typeParameters.length, arguments.length],
+ );
return _listOfDynamic(typeParameters);
}
} else {
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index abe9434..6b27004 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -10175,6 +10175,19 @@
correction: "Try moving type arguments to after the type name.");
/**
+ * Parameters:
+ * 0: the name of the extension being referenced
+ * 1: the number of type parameters that were declared
+ * 2: the number of type arguments provided
+ */
+ static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION =
+ CompileTimeErrorCode(
+ 'WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION',
+ "The extension '{0}' is declared with {1} type parameters, "
+ "but {2} type arguments were given.",
+ correction: "Try adjusting the number of type arguments.");
+
+ /**
* It will be a static type warning if <i>m</i> is not a generic method with
* exactly <i>n</i> type parameters.
*
diff --git a/pkg/analyzer/lib/src/test_utilities/package_mixin.dart b/pkg/analyzer/lib/src/test_utilities/mock_packages.dart
similarity index 98%
rename from pkg/analyzer/lib/src/test_utilities/package_mixin.dart
rename to pkg/analyzer/lib/src/test_utilities/mock_packages.dart
index 9294d4e..28eeeae 100644
--- a/pkg/analyzer/lib/src/test_utilities/package_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_packages.dart
@@ -5,7 +5,7 @@
import 'package:analyzer/file_system/file_system.dart';
/// Helper for creating mock packages.
-class PackagesContent {
+class MockPackages {
/// Create a fake 'js' package that can be used by tests.
static void addJsPackageFiles(Folder rootFolder) {
var libFolder = rootFolder.getChildAssumingFolder('lib');
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index b64b7ee..6022962 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -14,8 +14,8 @@
import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
+import 'package:analyzer/src/test_utilities/mock_packages.dart';
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer/src/workspace/basic.dart';
import 'package:analyzer/src/workspace/bazel.dart';
@@ -293,7 +293,7 @@
bool meta = false,
}) {
var metaPath = '/packages/meta';
- PackagesContent.addMetaPackageFiles(
+ MockPackages.addMetaPackageFiles(
getFolder(metaPath),
);
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 5aa6ff0..f9dc242 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -295,6 +295,17 @@
assertErrorsInResolvedUnit(result, expectedErrors);
}
+ void assertExtensionOverride(
+ ExtensionOverride node, {
+ @required Object element,
+ @required String extendedType,
+ @required List<String> typeArgumentTypes,
+ }) {
+ assertElement(node, element);
+ assertType(node.extendedType, extendedType);
+ assertElementTypeStrings(node.typeArgumentTypes, typeArgumentTypes);
+ }
+
void assertFunctionExpressionInvocation(
FunctionExpressionInvocation node, {
@required ExecutableElement element,
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
index 75a5b52..cf8638c 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
@@ -165,7 +165,7 @@
}
test_override_downward_hasTypeArguments_wrongNumber() async {
- await assertNoErrorsInCode('''
+ await assertErrorsInCode('''
extension E<T> on Set<T> {
void foo() {}
}
@@ -173,7 +173,10 @@
main() {
E<int, bool>({}).foo();
}
-''');
+''', [
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION, 58,
+ 11),
+ ]);
var literal = findNode.setOrMapLiteral('{}).');
assertType(literal, 'Set<dynamic>');
}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
index d894e7d..561b4ca 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:analyzer/src/test_utilities/mock_packages.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../generated/test_support.dart';
@@ -23,7 +23,7 @@
super.setUp();
var metaPath = '/packages/meta';
- PackagesContent.addMetaPackageFiles(
+ MockPackages.addMetaPackageFiles(
getFolder(metaPath),
);
diff --git a/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
index 551fbb3..1ad8808 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
@@ -4,7 +4,7 @@
import 'package:analyzer/src/dart/error/hint_codes.dart';
import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:analyzer/src/test_utilities/mock_packages.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -22,7 +22,7 @@
super.setUp();
var path = '/packages/js';
- PackagesContent.addJsPackageFiles(
+ MockPackages.addJsPackageFiles(
getFolder(path),
);
writeTestPackageConfig({'js': path});
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 1f0b6d6..5a35fa8 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -619,6 +619,8 @@
as wrong_number_of_parameters_for_operator;
import 'wrong_number_of_parameters_for_setter_test.dart'
as wrong_number_of_parameters_for_setter;
+import 'wrong_number_of_type_arguments_extension_test.dart'
+ as wrong_number_of_type_arguments_extension;
import 'wrong_number_of_type_arguments_test.dart'
as wrong_number_of_type_arguments;
import 'wrong_type_parameter_variance_in_superinterface_test.dart'
@@ -1046,6 +1048,7 @@
void_with_type_arguments_test.main();
wrong_number_of_parameters_for_operator.main();
wrong_number_of_parameters_for_setter.main();
+ wrong_number_of_type_arguments_extension.main();
wrong_number_of_type_arguments.main();
wrong_type_parameter_variance_in_superinterface.main();
yield_each_in_non_generator.main();
diff --git a/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_extension_test.dart b/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_extension_test.dart
new file mode 100644
index 0000000..e916159
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_extension_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2020, 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.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(WrongNumberOfTypeArgumentsExtensionTest);
+ });
+}
+
+@reflectiveTest
+class WrongNumberOfTypeArgumentsExtensionTest extends PubPackageResolutionTest {
+ test_notGeneric() async {
+ await assertErrorsInCode(r'''
+extension E on int {
+ void foo() {}
+}
+
+void f() {
+ E<int>(0).foo();
+}
+''', [
+ error(
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION, 54, 5),
+ ]);
+
+ assertExtensionOverride(
+ findNode.extensionOverride('E<int>'),
+ element: findElement.extension_('E'),
+ extendedType: 'int',
+ typeArgumentTypes: [],
+ );
+ }
+
+ test_tooFew() async {
+ await assertErrorsInCode(r'''
+extension E<S, T> on int {
+ void foo() {}
+}
+
+void f() {
+ E<bool>(0).foo();
+}
+''', [
+ error(
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION, 60, 6),
+ ]);
+
+ assertExtensionOverride(
+ findNode.extensionOverride('E<bool>'),
+ element: findElement.extension_('E'),
+ extendedType: 'int',
+ typeArgumentTypes: ['dynamic', 'dynamic'],
+ );
+ }
+
+ test_tooMany() async {
+ await assertErrorsInCode(r'''
+extension E<T> on int {
+ void foo() {}
+}
+
+void f() {
+ E<bool, int>(0).foo();
+}
+''', [
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION, 57,
+ 11),
+ ]);
+
+ assertExtensionOverride(
+ findNode.extensionOverride('E<bool, int>'),
+ element: findElement.extension_('E'),
+ extendedType: 'int',
+ typeArgumentTypes: ['dynamic'],
+ );
+ }
+}
diff --git a/pkg/vm/lib/transformations/deferred_loading.dart b/pkg/vm/lib/transformations/deferred_loading.dart
index f2b0318..03bb9c2 100644
--- a/pkg/vm/lib/transformations/deferred_loading.dart
+++ b/pkg/vm/lib/transformations/deferred_loading.dart
@@ -9,14 +9,15 @@
import '../metadata/loading_units.dart';
class _LoadingUnitBuilder {
- final int id;
+ int id;
final _LibraryVertex root;
final List<Library> members = <Library>[];
+ final List<_LoadingUnitBuilder> children = <_LoadingUnitBuilder>[];
- _LoadingUnitBuilder(this.id, this.root);
+ _LoadingUnitBuilder(this.root);
- int get parentId =>
- root.dominator == null ? 0 : root.dominator.loadingUnit.id;
+ _LoadingUnitBuilder get parent => root.dominator?.loadingUnit;
+ int get parentId => parent == null ? 0 : parent.id;
LoadingUnit asLoadingUnit() {
return new LoadingUnit(
@@ -82,7 +83,7 @@
var loadingUnits = <_LoadingUnitBuilder>[];
for (var vertex in map.values) {
if (vertex.isLoadingRoot) {
- var unit = new _LoadingUnitBuilder(loadingUnits.length + 1, vertex);
+ var unit = new _LoadingUnitBuilder(vertex);
vertex.loadingUnit = unit;
unit.members.add(vertex.library);
loadingUnits.add(unit);
@@ -105,6 +106,24 @@
vertex.loadingUnit.members.add(vertex.library);
}
+ // 4. Sort loading units so parents are before children. Normally this order
+ // would already exist as a side effect of loading sources in import order,
+ // but this isn't guarenteed when combining separately produced kernel files.
+ for (var unit in loadingUnits) {
+ var parent = unit.parent;
+ if (parent != null) {
+ parent.children.add(unit);
+ }
+ }
+ var index = 0;
+ loadingUnits.clear();
+ loadingUnits.add(root.loadingUnit);
+ while (index < loadingUnits.length) {
+ var unit = loadingUnits[index];
+ unit.id = ++index;
+ loadingUnits.addAll(unit.children);
+ }
+
return loadingUnits.map((u) => u.asLoadingUnit()).toList();
}
diff --git a/pkg/vm/test/transformations/deferred_loading_test.dart b/pkg/vm/test/transformations/deferred_loading_test.dart
index 4b5f961..f36b610 100644
--- a/pkg/vm/test/transformations/deferred_loading_test.dart
+++ b/pkg/vm/test/transformations/deferred_loading_test.dart
@@ -20,6 +20,10 @@
Component component =
await compileTestCaseToKernelProgram(source, target: target);
+ // Disrupt the import order as a way of simulating issue 42985.
+ final reversed = component.libraries.reversed.toList();
+ component.libraries.setAll(0, reversed);
+
component = transformComponent(component);
// Remove core libraries so the expected output isn't enormous and broken by
diff --git a/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect b/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
index 3dbc78e..f6484af 100644
--- a/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
+++ b/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
@@ -2,39 +2,39 @@
[@vm.loading-units.metadata=LoadingUnitsMetadata(
LoadingUnit(id=1, parent=0,
#lib
- #pkg/vm/testcases/transformations/deferred_loading/a.dart
- #pkg/vm/testcases/transformations/deferred_loading/b.dart
- #pkg/vm/testcases/transformations/deferred_loading/c.dart
- dart:async
- dart:collection
- dart:convert
- dart:developer
- dart:ffi
- dart:_internal
- dart:isolate
- dart:math
- dart:mirrors
- dart:typed_data
- dart:vmservice_io
- dart:_vmservice
- dart:_builtin
- dart:nativewrappers
- dart:io
- dart:cli
- dart:wasm
- dart:core
dart:_http
+ dart:core
+ dart:wasm
+ dart:cli
+ dart:io
+ dart:nativewrappers
+ dart:_builtin
+ dart:_vmservice
+ dart:vmservice_io
+ dart:typed_data
+ dart:mirrors
+ dart:math
+ dart:isolate
+ dart:_internal
+ dart:ffi
+ dart:developer
+ dart:convert
+ dart:collection
+ dart:async
+ #pkg/vm/testcases/transformations/deferred_loading/c.dart
+ #pkg/vm/testcases/transformations/deferred_loading/b.dart
+ #pkg/vm/testcases/transformations/deferred_loading/a.dart
)
LoadingUnit(id=2, parent=1,
- #pkg/vm/testcases/transformations/deferred_loading/d.dart
- #pkg/vm/testcases/transformations/deferred_loading/e.dart
+ #pkg/vm/testcases/transformations/deferred_loading/g.dart
+ #pkg/vm/testcases/transformations/deferred_loading/h.dart
)
LoadingUnit(id=3, parent=1,
#pkg/vm/testcases/transformations/deferred_loading/f.dart
)
LoadingUnit(id=4, parent=1,
- #pkg/vm/testcases/transformations/deferred_loading/g.dart
- #pkg/vm/testcases/transformations/deferred_loading/h.dart
+ #pkg/vm/testcases/transformations/deferred_loading/d.dart
+ #pkg/vm/testcases/transformations/deferred_loading/e.dart
)
LoadingUnit(id=5, parent=3,
#pkg/vm/testcases/transformations/deferred_loading/i.dart
@@ -42,12 +42,11 @@
LoadingUnit(id=6, parent=5,
#pkg/vm/testcases/transformations/deferred_loading/j.dart
)
-)]library #lib from "#lib" as #lib {
+)]library j from "#pkg/vm/testcases/transformations/deferred_loading/j.dart" as j {
- import "#pkg/vm/testcases/transformations/deferred_loading/a.dart";
- import "#pkg/vm/testcases/transformations/deferred_loading/b.dart";
+ import "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a;
- static method main() → dynamic /* originally async */ {
+ static method j() → dynamic /* originally async */ {
final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
FutureOr<dynamic>* :return_value;
dynamic :async_stack_trace;
@@ -55,15 +54,11 @@
(dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
dart.core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
- dynamic :saved_try_context_var0;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try {
#L1:
{
- [yield] let dynamic #t1 = dart.async::_awaitHelper(a::a(), :async_op_then, :async_op_error, :async_op) in null;
- :result;
- [yield] let dynamic #t2 = dart.async::_awaitHelper(b::b(), :async_op_then, :async_op_error, :async_op) in null;
- :result;
+ dart.core::print("J");
}
dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
return;
@@ -78,11 +73,43 @@
return :async_completer.{dart.async::Completer::future};
}
}
-library a from "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a {
+library h from "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h {
- import "#pkg/vm/testcases/transformations/deferred_loading/d.dart" deferred as d;
+ import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g;
- static method a() → dynamic /* originally async */ {
+ static method h() → dynamic /* originally async */ {
+ final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+ FutureOr<dynamic>* :return_value;
+ dynamic :async_stack_trace;
+ (dynamic) →* dynamic :async_op_then;
+ (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
+ dart.core::int* :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L2:
+ {
+ dart.core::print("H");
+ }
+ dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+ :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+ }
+ :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
+ :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
+ return :async_completer.{dart.async::Completer::future};
+ }
+}
+library i from "#pkg/vm/testcases/transformations/deferred_loading/i.dart" as i {
+
+ import "#pkg/vm/testcases/transformations/deferred_loading/j.dart" deferred as j;
+ import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
+
+ static method i() → dynamic /* originally async */ {
final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
FutureOr<dynamic>* :return_value;
dynamic :async_stack_trace;
@@ -93,45 +120,12 @@
dynamic :saved_try_context_var0;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try {
- #L2:
- {
- dart.core::print("A");
- [yield] let dynamic #t3 = dart.async::_awaitHelper(LoadLibrary(d), :async_op_then, :async_op_error, :async_op) in null;
- :result;
- :return_value = let final dynamic #t4 = CheckLibraryIsLoaded(d) in d::d();
- break #L2;
- }
- dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
- return;
- }
- on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
- :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
- }
- :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
- :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
- :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
- :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
- return :async_completer.{dart.async::Completer::future};
- }
-}
-library b from "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b {
-
- import "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c;
-
- static method b() → dynamic /* originally async */ {
- final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
- FutureOr<dynamic>* :return_value;
- dynamic :async_stack_trace;
- (dynamic) →* dynamic :async_op_then;
- (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
- dart.core::int* :await_jump_var = 0;
- dynamic :await_ctx_var;
- function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
- try {
#L3:
{
- dart.core::print("B");
- :return_value = c::c();
+ dart.core::print("I");
+ [yield] let dynamic #t1 = dart.async::_awaitHelper(LoadLibrary(j), :async_op_then, :async_op_error, :async_op) in null;
+ :result;
+ :return_value = let final dynamic #t2 = CheckLibraryIsLoaded(j) in j::j();
break #L3;
}
dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -147,11 +141,11 @@
return :async_completer.{dart.async::Completer::future};
}
}
-library d from "#pkg/vm/testcases/transformations/deferred_loading/d.dart" as d {
+library g from "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g {
- import "#pkg/vm/testcases/transformations/deferred_loading/e.dart" as e;
+ import "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h;
- static method d() → dynamic /* originally async */ {
+ static method g() → dynamic /* originally async */ {
final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
FutureOr<dynamic>* :return_value;
dynamic :async_stack_trace;
@@ -163,9 +157,7 @@
try {
#L4:
{
- dart.core::print("D");
- :return_value = e::e();
- break #L4;
+ dart.core::print("G");
}
dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
return;
@@ -180,12 +172,12 @@
return :async_completer.{dart.async::Completer::future};
}
}
-library c from "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c {
+library f from "#pkg/vm/testcases/transformations/deferred_loading/f.dart" as f {
- import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
- import "#pkg/vm/testcases/transformations/deferred_loading/f.dart" deferred as f;
+ import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" deferred as g;
+ import "#pkg/vm/testcases/transformations/deferred_loading/i.dart" deferred as i;
- static method c() → dynamic /* originally async */ {
+ static method f() → dynamic /* originally async */ {
final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
FutureOr<dynamic>* :return_value;
dynamic :async_stack_trace;
@@ -198,10 +190,14 @@
try {
#L5:
{
- dart.core::print("C");
- [yield] let dynamic #t5 = dart.async::_awaitHelper(LoadLibrary(f), :async_op_then, :async_op_error, :async_op) in null;
+ dart.core::print("F");
+ [yield] let dynamic #t3 = dart.async::_awaitHelper(LoadLibrary(g), :async_op_then, :async_op_error, :async_op) in null;
:result;
- :return_value = let final dynamic #t6 = CheckLibraryIsLoaded(f) in f::f();
+ :return_value = let final dynamic #t4 = CheckLibraryIsLoaded(g) in g::g();
+ break #L5;
+ [yield] let dynamic #t5 = dart.async::_awaitHelper(LoadLibrary(i), :async_op_then, :async_op_error, :async_op) in null;
+ :result;
+ :return_value = let final dynamic #t6 = CheckLibraryIsLoaded(i) in i::i();
break #L5;
}
dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -253,12 +249,12 @@
return :async_completer.{dart.async::Completer::future};
}
}
-library f from "#pkg/vm/testcases/transformations/deferred_loading/f.dart" as f {
+library c from "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c {
- import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" deferred as g;
- import "#pkg/vm/testcases/transformations/deferred_loading/i.dart" deferred as i;
+ import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
+ import "#pkg/vm/testcases/transformations/deferred_loading/f.dart" deferred as f;
- static method f() → dynamic /* originally async */ {
+ static method c() → dynamic /* originally async */ {
final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
FutureOr<dynamic>* :return_value;
dynamic :async_stack_trace;
@@ -271,14 +267,10 @@
try {
#L7:
{
- dart.core::print("F");
- [yield] let dynamic #t9 = dart.async::_awaitHelper(LoadLibrary(g), :async_op_then, :async_op_error, :async_op) in null;
+ dart.core::print("C");
+ [yield] let dynamic #t9 = dart.async::_awaitHelper(LoadLibrary(f), :async_op_then, :async_op_error, :async_op) in null;
:result;
- :return_value = let final dynamic #t10 = CheckLibraryIsLoaded(g) in g::g();
- break #L7;
- [yield] let dynamic #t11 = dart.async::_awaitHelper(LoadLibrary(i), :async_op_then, :async_op_error, :async_op) in null;
- :result;
- :return_value = let final dynamic #t12 = CheckLibraryIsLoaded(i) in i::i();
+ :return_value = let final dynamic #t10 = CheckLibraryIsLoaded(f) in f::f();
break #L7;
}
dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -294,11 +286,11 @@
return :async_completer.{dart.async::Completer::future};
}
}
-library g from "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g {
+library d from "#pkg/vm/testcases/transformations/deferred_loading/d.dart" as d {
- import "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h;
+ import "#pkg/vm/testcases/transformations/deferred_loading/e.dart" as e;
- static method g() → dynamic /* originally async */ {
+ static method d() → dynamic /* originally async */ {
final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
FutureOr<dynamic>* :return_value;
dynamic :async_stack_trace;
@@ -310,7 +302,9 @@
try {
#L8:
{
- dart.core::print("G");
+ dart.core::print("D");
+ :return_value = e::e();
+ break #L8;
}
dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
return;
@@ -325,12 +319,11 @@
return :async_completer.{dart.async::Completer::future};
}
}
-library i from "#pkg/vm/testcases/transformations/deferred_loading/i.dart" as i {
+library b from "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b {
- import "#pkg/vm/testcases/transformations/deferred_loading/j.dart" deferred as j;
- import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
+ import "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c;
- static method i() → dynamic /* originally async */ {
+ static method b() → dynamic /* originally async */ {
final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
FutureOr<dynamic>* :return_value;
dynamic :async_stack_trace;
@@ -338,15 +331,12 @@
(dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
dart.core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
- dynamic :saved_try_context_var0;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try {
#L9:
{
- dart.core::print("I");
- [yield] let dynamic #t13 = dart.async::_awaitHelper(LoadLibrary(j), :async_op_then, :async_op_error, :async_op) in null;
- :result;
- :return_value = let final dynamic #t14 = CheckLibraryIsLoaded(j) in j::j();
+ dart.core::print("B");
+ :return_value = c::c();
break #L9;
}
dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -362,11 +352,11 @@
return :async_completer.{dart.async::Completer::future};
}
}
-library h from "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h {
+library a from "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a {
- import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g;
+ import "#pkg/vm/testcases/transformations/deferred_loading/d.dart" deferred as d;
- static method h() → dynamic /* originally async */ {
+ static method a() → dynamic /* originally async */ {
final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
FutureOr<dynamic>* :return_value;
dynamic :async_stack_trace;
@@ -374,11 +364,16 @@
(dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
dart.core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
+ dynamic :saved_try_context_var0;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try {
#L10:
{
- dart.core::print("H");
+ dart.core::print("A");
+ [yield] let dynamic #t11 = dart.async::_awaitHelper(LoadLibrary(d), :async_op_then, :async_op_error, :async_op) in null;
+ :result;
+ :return_value = let final dynamic #t12 = CheckLibraryIsLoaded(d) in d::d();
+ break #L10;
}
dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
return;
@@ -393,11 +388,12 @@
return :async_completer.{dart.async::Completer::future};
}
}
-library j from "#pkg/vm/testcases/transformations/deferred_loading/j.dart" as j {
+library #lib from "#lib" as #lib {
- import "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a;
+ import "#pkg/vm/testcases/transformations/deferred_loading/a.dart";
+ import "#pkg/vm/testcases/transformations/deferred_loading/b.dart";
- static method j() → dynamic /* originally async */ {
+ static method main() → dynamic /* originally async */ {
final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
FutureOr<dynamic>* :return_value;
dynamic :async_stack_trace;
@@ -405,11 +401,15 @@
(dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
dart.core::int* :await_jump_var = 0;
dynamic :await_ctx_var;
+ dynamic :saved_try_context_var0;
function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
try {
#L11:
{
- dart.core::print("J");
+ [yield] let dynamic #t13 = dart.async::_awaitHelper(a::a(), :async_op_then, :async_op_error, :async_op) in null;
+ :result;
+ [yield] let dynamic #t14 = dart.async::_awaitHelper(b::b(), :async_op_then, :async_op_error, :async_op) in null;
+ :result;
}
dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
return;
diff --git a/runtime/lib/errors.cc b/runtime/lib/errors.cc
index 2465c8b..7106518 100644
--- a/runtime/lib/errors.cc
+++ b/runtime/lib/errors.cc
@@ -90,10 +90,13 @@
script.GetTokenLocation(assertion_start, &from_line, &from_column);
intptr_t to_line, to_column;
script.GetTokenLocation(assertion_end, &to_line, &to_column);
- // The snippet will extract the correct assertion code even if the source
- // is generated.
- args.SetAt(0, String::Handle(script.GetSnippet(from_line, from_column,
- to_line, to_column)));
+ // Extract the assertion condition text (if source is available).
+ auto& condition_text = String::Handle(
+ script.GetSnippet(from_line, from_column, to_line, to_column));
+ if (condition_text.IsNull()) {
+ condition_text = Symbols::OptimizedOut().raw();
+ }
+ args.SetAt(0, condition_text);
// Initialize location arguments starting at position 1.
// Do not set a column if the source has been generated as it will be wrong.
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index f535c91..34cc58e 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -213,12 +213,6 @@
}
}
- if (FLAG_print_classes) {
- for (intptr_t i = 0; i < class_array.Length(); i++) {
- cls ^= class_array.At(i);
- PrintClassInformation(cls);
- }
- }
// Clear pending classes array.
class_array = GrowableObjectArray::New();
object_store->set_pending_classes(class_array);
@@ -1161,6 +1155,9 @@
}
// Mark as loaded and finalized.
cls.Finalize();
+ if (FLAG_print_classes) {
+ PrintClassInformation(cls);
+ }
FinalizeMemberTypes(cls);
if (cls.is_enum_class()) {
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index a1ea46f..1785105 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -1829,8 +1829,9 @@
unit.set_id(id);
intptr_t parent_id = helper_->ReadUInt();
+ RELEASE_ASSERT(parent_id < id);
parent ^= loading_units.At(parent_id);
- ASSERT(parent.IsNull() == (parent_id == 0));
+ RELEASE_ASSERT(parent.IsNull() == (parent_id == 0));
unit.set_parent(parent);
intptr_t library_count = helper_->ReadUInt();
@@ -2001,8 +2002,11 @@
NameIndex KernelReaderHelper::ReadInterfaceMemberNameReference() {
NameIndex name_index = reader_.ReadCanonicalNameReference();
- reader_
- .ReadCanonicalNameReference(); // read interface target origin reference
+ NameIndex origin_name_index = reader_.ReadCanonicalNameReference();
+ if (!FLAG_precompiled_mode && origin_name_index != NameIndex::kInvalidName) {
+ // Reference to a skipped member signature target, return the origin target.
+ return origin_name_index;
+ }
return name_index;
}
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 092af49..a992ff3 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1947,7 +1947,16 @@
ProcedureHelper procedure_helper(&helper_);
procedure_helper.ReadUntilExcluding(ProcedureHelper::kAnnotations);
- if (procedure_helper.IsRedirectingFactoryConstructor()) {
+ // CFE adds 'member signature' abstract functions to a legacy class deriving
+ // or implementing an opted-in interface. The signature of these functions is
+ // legacy erased and used as the target of interface calls. They are used for
+ // static reasoning about the program by CFE, but not really needed by the VM.
+ // In certain situations (e.g. issue 162073826), a large number of these
+ // additional functions can cause strain on the VM. They are therefore skipped
+ // in jit mode and their associated origin function is used instead as
+ // interface call target.
+ if (procedure_helper.IsRedirectingFactoryConstructor() ||
+ (!FLAG_precompiled_mode && procedure_helper.IsMemberSignature())) {
helper_.SetOffset(procedure_end);
return;
}
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index 8e2c533..341e4fb 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -79,7 +79,7 @@
// Getter invocation might actually be a method extraction.
if (is_getter) {
- function = cls.LookupDynamicFunction(demangled_getter_name);
+ function = lookup(cls, demangled_getter_name);
if (!function.IsNull()) {
if (allow_add && FLAG_lazy_dispatchers) {
// We were looking for the getter but found a method with the same
@@ -136,7 +136,7 @@
bool allow_add) {
return ResolveDynamicForReceiverClassWithCustomLookup(
receiver_class, function_name, args_desc, allow_add,
- &Class::LookupDynamicFunction);
+ std::mem_fn(&Class::LookupDynamicFunction));
}
FunctionPtr Resolver::ResolveDynamicForReceiverClassAllowPrivate(
@@ -146,7 +146,7 @@
bool allow_add) {
return ResolveDynamicForReceiverClassWithCustomLookup(
receiver_class, function_name, args_desc, allow_add,
- &Class::LookupDynamicFunctionAllowPrivate);
+ std::mem_fn(&Class::LookupDynamicFunctionAllowPrivate));
}
FunctionPtr Resolver::ResolveDynamicAnyArgs(Zone* zone,
diff --git a/tools/VERSION b/tools/VERSION
index 2fcf00b..915ea8e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 10
PATCH 0
-PRERELEASE 14
+PRERELEASE 15
PRERELEASE_PATCH 0
\ No newline at end of file