Version 2.14.0-148.0.dev
Merge commit '130aaeacc3d28e847b1d45338ac6f704e813d3d4' into 'dev'
diff --git a/DEPS b/DEPS
index 871d214..4017423 100644
--- a/DEPS
+++ b/DEPS
@@ -63,8 +63,8 @@
# The list of revisions for these tools comes from Fuchsia, here:
# https://fuchsia.googlesource.com/integration/+/HEAD/prebuilts
# If there are problems with the toolchain, contact fuchsia-toolchain@.
- "clang_revision": "7e9747b50bcb1be28d4a3236571e8050835497a6",
- "gn_revision": "1e3fd10c5df6b704fc764ee388149e4f32862823",
+ "clang_revision": "3dc24bc31edbc01dea085b24a6a6b024d7ae531c",
+ "gn_revision": "39a87c0b36310bdf06b692c098f199a0d97fc810",
# Scripts that make 'git cl format' work.
"clang_format_scripts_rev": "c09c8deeac31f05bd801995c475e7c8070f9ecda",
@@ -106,7 +106,7 @@
"dart_style_rev": "f17c23e0eea9a870601c19d904e2a9c1a7c81470",
"chromedriver_tag": "83.0.4103.39",
- "dartdoc_rev" : "e6a9b7c536a85e49233c97bb892bbb0ab778e425",
+ "dartdoc_rev" : "305713608c25106d95f9114418d895e08d1a9e9c",
"devtools_rev" : "e138d55437a59838607415ef21f20bd6c4955dbc",
"jsshell_tag": "version:88.0",
"ffi_rev": "f3346299c55669cc0db48afae85b8110088bf8da",
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index f1ac8c2..91586be 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -294,6 +294,10 @@
# Clang doesn't support these flags.
cflags += [ "-finline-limit=64" ]
}
+ if (current_cpu == "arm64") {
+ # TODO (https://github.com/flutter/flutter/issues/75348).
+ cflags += [ "-mno-outline-atomics" ]
+ }
if (is_asan) {
# Android build relies on -Wl,--gc-sections removing unreachable code.
# ASan instrumentation for globals inhibits this and results in a library
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index d78d0d5..fbff8be 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -16,8 +16,6 @@
import 'package:analyzer/src/summary2/element_builder.dart';
import 'package:analyzer/src/summary2/export.dart';
import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/linked_library_context.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
import 'package:analyzer/src/summary2/metadata_resolver.dart';
import 'package:analyzer/src/summary2/reference.dart';
import 'package:analyzer/src/summary2/reference_resolver.dart';
@@ -28,11 +26,9 @@
final Linker linker;
final Uri uri;
final Reference reference;
- late final List<Reference> exports;
+ final LibraryElementImpl element;
+ final List<LinkingUnit> units;
- late final LinkedLibraryContext context;
-
- late final LibraryElementImpl element;
late final LibraryScope scope;
/// Local declarations.
@@ -42,8 +38,15 @@
final Scope exportScope = Scope.top();
final List<Export> exporters = [];
+ late final List<Reference> exports;
- LibraryBuilder._(this.linker, this.uri, this.reference);
+ LibraryBuilder._({
+ required this.linker,
+ required this.uri,
+ required this.reference,
+ required this.element,
+ required this.units,
+ });
void addExporters() {
for (var element in element.exports) {
@@ -97,24 +100,19 @@
return true;
}
- void buildElement() {
- element = linker.elementFactory.createLibraryElementForLinking(context)
- as LibraryElementImpl;
- }
-
/// Build elements for declarations in the library units, add top-level
/// declarations to the local scope, for combining into export scopes.
void buildElements() {
- for (var unitContext in context.units) {
+ for (var linkingUnit in units) {
var elementBuilder = ElementBuilder(
libraryBuilder: this,
- unitReference: unitContext.reference,
- unitElement: unitContext.element,
+ unitReference: linkingUnit.reference,
+ unitElement: linkingUnit.element,
);
- if (unitContext.indexInLibrary == 0) {
- elementBuilder.buildLibraryElementChildren(unitContext.unit);
+ if (linkingUnit.isDefiningUnit) {
+ elementBuilder.buildLibraryElementChildren(linkingUnit.node);
}
- elementBuilder.buildDeclarationElements(unitContext.unit);
+ elementBuilder.buildDeclarationElements(linkingUnit.node);
}
if ('$uri' == 'dart:core') {
localScope.declare('dynamic', reference.getChild('dynamic'));
@@ -137,8 +135,8 @@
}
void collectMixinSuperInvokedNames() {
- for (var unitContext in context.units) {
- for (var declaration in unitContext.unit.declarations) {
+ for (var linkingUnit in units) {
+ for (var declaration in linkingUnit.node.declarations) {
if (declaration is ast.MixinDeclaration) {
var names = <String>{};
var collector = MixinSuperInvokedNamesCollector(names);
@@ -163,28 +161,24 @@
}
void resolveMetadata() {
- for (var unitContext in context.units) {
- var unitElement =
- unitContext.reference.element as CompilationUnitElementImpl;
- var resolver = MetadataResolver(linker, scope, unitElement);
- unitContext.unit.accept(resolver);
+ for (var linkingUnit in units) {
+ var resolver = MetadataResolver(linker, scope, linkingUnit.element);
+ linkingUnit.node.accept(resolver);
}
}
void resolveTypes(NodesToBuildType nodesToBuildType) {
- for (var unitContext in context.units) {
- var unitRef = reference.getChild('@unit');
- var unitReference = unitRef.getChild(unitContext.uriStr);
+ for (var linkingUnit in units) {
var resolver = ReferenceResolver(
linker,
nodesToBuildType,
linker.elementFactory,
element,
- unitReference,
- unitContext.unit.featureSet.isEnabled(Feature.non_nullable),
+ linkingUnit.reference,
+ linkingUnit.node.featureSet.isEnabled(Feature.non_nullable),
scope,
);
- unitContext.unit.accept(resolver);
+ linkingUnit.node.accept(resolver);
}
}
@@ -209,32 +203,102 @@
}
static void build(Linker linker, LinkInputLibrary inputLibrary) {
- var uriStr = inputLibrary.uriStr;
- var reference = linker.rootReference.getChild(uriStr);
-
var elementFactory = linker.elementFactory;
- var context = LinkedLibraryContext(elementFactory, uriStr, reference);
- var unitRef = reference.getChild('@unit');
- var unitIndex = 0;
- for (var inputUnit in inputLibrary.units) {
- var uriStr = inputUnit.uriStr;
- var reference = unitRef.getChild(uriStr);
- context.units.add(
- LinkedUnitContext(
- context,
- unitIndex++,
- inputUnit.partUriStr,
- uriStr,
- reference,
- inputUnit.isSynthetic,
- unit: inputUnit.unit as ast.CompilationUnitImpl,
- ),
- );
+ var rootReference = linker.rootReference;
+ var libraryUriStr = inputLibrary.uriStr;
+ var libraryReference = rootReference.getChild(libraryUriStr);
+
+ var definingUnit = inputLibrary.units[0];
+ var definingUnitNode = definingUnit.unit as ast.CompilationUnitImpl;
+
+ var name = '';
+ var nameOffset = -1;
+ var nameLength = 0;
+ for (var directive in definingUnitNode.directives) {
+ if (directive is ast.LibraryDirective) {
+ name = directive.name.components.map((e) => e.name).join('.');
+ nameOffset = directive.name.offset;
+ nameLength = directive.name.length;
+ break;
+ }
}
- var builder = LibraryBuilder._(linker, inputLibrary.uri, reference);
+ var libraryElement = LibraryElementImpl(
+ elementFactory.analysisContext,
+ elementFactory.analysisSession,
+ name,
+ nameOffset,
+ nameLength,
+ definingUnitNode.featureSet,
+ );
+ libraryElement.isSynthetic = definingUnit.isSynthetic;
+ libraryElement.languageVersion = definingUnitNode.languageVersion!;
+ _bindReference(libraryReference, libraryElement);
+ elementFactory.setLibraryTypeSystem(libraryElement);
+
+ var unitContainerRef = libraryReference.getChild('@unit');
+ var unitElements = <CompilationUnitElementImpl>[];
+ var isDefiningUnit = true;
+ var linkingUnits = <LinkingUnit>[];
+ for (var inputUnit in inputLibrary.units) {
+ var unitNode = inputUnit.unit as ast.CompilationUnitImpl;
+
+ var unitElement = CompilationUnitElementImpl();
+ unitElement.isSynthetic = inputUnit.isSynthetic;
+ unitElement.librarySource = inputLibrary.source;
+ unitElement.lineInfo = unitNode.lineInfo;
+ unitElement.source = inputUnit.source;
+ unitElement.uri = inputUnit.partUriStr;
+
+ var unitReference = unitContainerRef.getChild(inputUnit.uriStr);
+ _bindReference(unitReference, unitElement);
+
+ unitElements.add(unitElement);
+ linkingUnits.add(
+ LinkingUnit(
+ input: inputUnit,
+ isDefiningUnit: isDefiningUnit,
+ reference: unitReference,
+ node: unitNode,
+ element: unitElement,
+ ),
+ );
+ isDefiningUnit = false;
+ }
+
+ libraryElement.definingCompilationUnit = unitElements[0];
+ libraryElement.parts = unitElements.skip(1).toList();
+
+ var builder = LibraryBuilder._(
+ linker: linker,
+ uri: inputLibrary.uri,
+ reference: libraryReference,
+ element: libraryElement,
+ units: linkingUnits,
+ );
+
linker.builders[builder.uri] = builder;
- builder.context = context;
}
+
+ static void _bindReference(Reference reference, ElementImpl element) {
+ reference.element = element;
+ element.reference = reference;
+ }
+}
+
+class LinkingUnit {
+ final LinkInputUnit input;
+ final bool isDefiningUnit;
+ final Reference reference;
+ final ast.CompilationUnitImpl node;
+ final CompilationUnitElementImpl element;
+
+ LinkingUnit({
+ required this.input,
+ required this.isDefiningUnit,
+ required this.reference,
+ required this.node,
+ required this.element,
+ });
}
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index d3408d6..225b860 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -115,10 +115,6 @@
void _computeLibraryScopes() {
for (var library in builders.values) {
- library.buildElement();
- }
-
- for (var library in builders.values) {
library.buildElements();
}
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index fcd971f..92f3296 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -2,7 +2,6 @@
// 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/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/context/context.dart';
import 'package:analyzer/src/dart/analysis/session.dart';
@@ -10,7 +9,6 @@
import 'package:analyzer/src/dart/element/type_provider.dart';
import 'package:analyzer/src/dart/resolver/scope.dart';
import 'package:analyzer/src/summary2/bundle_reader.dart';
-import 'package:analyzer/src/summary2/linked_library_context.dart';
import 'package:analyzer/src/summary2/reference.dart';
class LinkedElementFactory {
@@ -68,69 +66,6 @@
return Namespace(exportedNames);
}
- LibraryElementImpl? createLibraryElementForLinking(
- LinkedLibraryContext libraryContext,
- ) {
- var sourceFactory = analysisContext.sourceFactory;
- var libraryUriStr = libraryContext.uriStr;
- var librarySource = sourceFactory.forUri(libraryUriStr);
-
- // The URI cannot be resolved, we don't know the library.
- if (librarySource == null) return null;
-
- var definingUnitContext = libraryContext.definingUnit;
- var definingUnitNode = definingUnitContext.unit;
-
- // TODO(scheglov) Do we need this?
- var name = '';
- var nameOffset = -1;
- var nameLength = 0;
- for (var directive in definingUnitNode.directives) {
- if (directive is LibraryDirective) {
- name = directive.name.components.map((e) => e.name).join('.');
- nameOffset = directive.name.offset;
- nameLength = directive.name.length;
- break;
- }
- }
-
- var libraryElement = LibraryElementImpl(
- analysisContext,
- analysisSession,
- name,
- nameOffset,
- nameLength,
- definingUnitNode.featureSet,
- );
- libraryElement.isSynthetic = definingUnitContext.isSynthetic;
- libraryElement.languageVersion = definingUnitNode.languageVersion!;
- _bindReference(libraryContext.reference, libraryElement);
- _setLibraryTypeSystem(libraryElement);
-
- var units = <CompilationUnitElementImpl>[];
- for (var unitContext in libraryContext.units) {
- var unitNode = unitContext.unit;
-
- var unitSource = sourceFactory.forUri(unitContext.uriStr);
- if (unitSource == null) continue;
-
- var unitElement = CompilationUnitElementImpl();
- unitElement.isSynthetic = unitContext.isSynthetic;
- unitElement.librarySource = librarySource;
- unitElement.lineInfo = unitNode.lineInfo;
- unitElement.source = unitSource;
- unitElement.uri = unitContext.partUriStr;
- _bindReference(unitContext.reference, unitElement);
-
- units.add(unitElement);
- }
-
- libraryElement.definingCompilationUnit = units[0];
- libraryElement.parts = units.skip(1).toList();
-
- return libraryElement;
- }
-
LibraryElementImpl? createLibraryElementForReading(String uriStr) {
var sourceFactory = analysisContext.sourceFactory;
var librarySource = sourceFactory.forUri(uriStr);
@@ -149,7 +84,7 @@
var libraryElement = reader.readElement(
librarySource: librarySource,
);
- _setLibraryTypeSystem(libraryElement);
+ setLibraryTypeSystem(libraryElement);
return libraryElement;
}
@@ -179,7 +114,7 @@
for (var reference in rootReference.children) {
var libraryElement = reference.element as LibraryElementImpl?;
if (libraryElement != null && !libraryElement.hasTypeProviderSystemSet) {
- _setLibraryTypeSystem(libraryElement);
+ setLibraryTypeSystem(libraryElement);
}
}
}
@@ -276,13 +211,7 @@
analysisSession.inheritanceManager.removeOfLibraries(uriStrSet);
}
- void _declareDartCoreDynamicNever() {
- var dartCoreRef = rootReference.getChild('dart:core');
- dartCoreRef.getChild('dynamic').element = DynamicElementImpl.instance;
- dartCoreRef.getChild('Never').element = NeverElementImpl.instance;
- }
-
- void _setLibraryTypeSystem(LibraryElementImpl libraryElement) {
+ void setLibraryTypeSystem(LibraryElementImpl libraryElement) {
// During linking we create libraries when typeProvider is not ready.
// And if we link dart:core and dart:async, we cannot create it.
// We will set typeProvider later, during [createTypeProviders].
@@ -302,8 +231,9 @@
libraryElement.createLoadLibraryFunction();
}
- static void _bindReference(Reference reference, ElementImpl element) {
- reference.element = element;
- element.reference = reference;
+ void _declareDartCoreDynamicNever() {
+ var dartCoreRef = rootReference.getChild('dart:core');
+ dartCoreRef.getChild('dynamic').element = DynamicElementImpl.instance;
+ dartCoreRef.getChild('Never').element = NeverElementImpl.instance;
}
}
diff --git a/pkg/analyzer/lib/src/summary2/linked_library_context.dart b/pkg/analyzer/lib/src/summary2/linked_library_context.dart
deleted file mode 100644
index e9c7e77..0000000
--- a/pkg/analyzer/lib/src/summary2/linked_library_context.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// 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/summary2/linked_element_factory.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
-
-class LinkedLibraryContext {
- final LinkedElementFactory elementFactory;
- final String uriStr;
- final Reference reference;
- final List<LinkedUnitContext> units = [];
-
- LinkedLibraryContext(this.elementFactory, this.uriStr, this.reference);
-
- LinkedUnitContext get definingUnit => units.first;
-}
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
deleted file mode 100644
index 472f5cb..0000000
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2019, 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/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/summary2/linked_library_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
-
-/// The context of a unit - the context of the bundle, and the unit tokens.
-class LinkedUnitContext {
- final LinkedLibraryContext libraryContext;
- final int indexInLibrary;
- final String? partUriStr;
- final String uriStr;
- final Reference reference;
- final bool isSynthetic;
- final CompilationUnitImpl unit;
-
- LinkedUnitContext(this.libraryContext, this.indexInLibrary, this.partUriStr,
- this.uriStr, this.reference, this.isSynthetic,
- {required this.unit});
-
- CompilationUnitElementImpl get element {
- return reference.element as CompilationUnitElementImpl;
- }
-}
diff --git a/pkg/analyzer/lib/src/summary2/type_alias.dart b/pkg/analyzer/lib/src/summary2/type_alias.dart
index 4ff3555..b48b646 100644
--- a/pkg/analyzer/lib/src/summary2/type_alias.dart
+++ b/pkg/analyzer/lib/src/summary2/type_alias.dart
@@ -10,8 +10,8 @@
/// Check typedefs and mark the ones having self references.
void perform(Linker linker) {
for (var builder in linker.builders.values) {
- for (var unitContext in builder.context.units) {
- for (var node in unitContext.unit.declarations) {
+ for (var linkingUnit in builder.units) {
+ for (var node in linkingUnit.node.declarations) {
if (node is FunctionTypeAlias) {
var finder = _Finder(linker, node);
finder.functionTypeAlias(node);
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index 8d7438d..8543179 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -21,8 +21,8 @@
void perform() {
for (var builder in _linker.builders.values) {
- for (var unitContext in builder.context.units) {
- for (var node in unitContext.unit.declarations) {
+ for (var linkingUnit in builder.units) {
+ for (var node in linkingUnit.node.declarations) {
if (node is FunctionTypeAlias) {
_pending.add(node);
} else if (node is GenericTypeAlias) {
@@ -33,8 +33,8 @@
}
for (var builder in _linker.builders.values) {
- for (var unitContext in builder.context.units) {
- for (var node in unitContext.unit.declarations) {
+ for (var linkingUnit in builder.units) {
+ for (var node in linkingUnit.node.declarations) {
if (node is ClassTypeAlias) {
_typeParameters(node.typeParameters);
} else if (node is ClassDeclaration) {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
index 2bf9161..9d8b897 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
@@ -13,9 +13,10 @@
});
}
-/// todo(pq): add tests for topLevelVariables: https://dart-review.googlesource.com/c/sdk/+/200301
@reflectiveTest
class InvalidAnnotationTargetTest extends PubPackageResolutionTest {
+ // todo(pq): add tests for topLevelVariables:
+ // https://dart-review.googlesource.com/c/sdk/+/200301
void test_classType_class() async {
writeTestPackageConfigWithMeta();
await assertNoErrorsInCode('''
diff --git a/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart b/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart
index 2b0c310..3584005 100644
--- a/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart
@@ -117,6 +117,34 @@
''');
}
+ test_nonFunctionTypeAlias_explicitTypeArg() async {
+ writeTestPackageConfigWithMeta();
+ await assertNoErrorsInCode('''
+typedef List2<T> = List<T>;
+void f(List2<int> a) {}
+''');
+ }
+
+ test_nonFunctionTypeAlias_missingTypeArg() async {
+ writeTestPackageConfigWithMeta();
+ await assertErrorsInCode('''
+typedef List2<T> = List<T>;
+void f(List2 a) {}
+''', [
+ error(HintCode.STRICT_RAW_TYPE, 35, 5),
+ ]);
+ }
+
+ test_nonFunctionTypeAlias_optionalTypeArgs() async {
+ writeTestPackageConfigWithMeta();
+ await assertNoErrorsInCode('''
+import 'package:meta/meta.dart';
+@optionalTypeArgs
+typedef List2<T> = List<T>;
+void f(List2 a) {}
+''');
+ }
+
test_parameter_missingTypeArg() async {
await assertErrorsInCode(r'''
void f(List a) {}
@@ -181,21 +209,21 @@
''', [error(HintCode.STRICT_RAW_TYPE, 11, 4)]);
}
- test_typedef_classic_missingTypeArg() async {
+ test_typeAlias_classic_missingTypeArg() async {
await assertErrorsInCode(r'''
typedef T F1<T>(T _);
F1 func = (a) => a;
''', [error(HintCode.STRICT_RAW_TYPE, 22, 2)]);
}
- test_typedef_modern_missingTypeArg() async {
+ test_typeAlias_modern_missingTypeArg() async {
await assertErrorsInCode(r'''
typedef F1<T> = T Function(T);
F1 func = (a) => a;
''', [error(HintCode.STRICT_RAW_TYPE, 31, 2)]);
}
- test_typedef_modern_optionalTypeArgs() async {
+ test_typeAlias_modern_optionalTypeArgs() async {
writeTestPackageConfigWithMeta();
await assertNoErrorsInCode(r'''
import 'package:meta/meta.dart';
@@ -208,7 +236,7 @@
''');
}
- test_typedef_modern_withTypeArg() async {
+ test_typeAlias_modern_withTypeArg() async {
await assertNoErrorsInCode(r'''
typedef T F1<T>(T _);
typedef F2<T> = T Function(T);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 66dfa4d..925dec6 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -12749,6 +12749,8 @@
part 'test.dart';
class B {
}
+class B {
+}
''');
}
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 5841c60..6bebee4 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -199,8 +199,10 @@
/// overriding member `m`.
const _NonVirtual nonVirtual = _NonVirtual();
-/// Used to annotate a class, mixin, or extension declaration `C`. Indicates
-/// that any type arguments declared on `C` are to be treated as optional.
+/// Used to annotate a class, mixin, extension, function, method, or typedef
+/// declaration `C`. Indicates that any type arguments declared on `C` are to
+/// be treated as optional.
+///
/// Tools such as the analyzer and linter can use this information to suppress
/// warnings that would otherwise require type arguments on `C` to be provided.
const _OptionalTypeArgs optionalTypeArgs = _OptionalTypeArgs();
@@ -396,6 +398,14 @@
const _NonVirtual();
}
+@Target({
+ TargetKind.classType,
+ TargetKind.extension,
+ TargetKind.function,
+ TargetKind.method,
+ TargetKind.mixinType,
+ TargetKind.typedefType,
+})
class _OptionalTypeArgs {
const _OptionalTypeArgs();
}
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index a5d848f..e15ff53 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -1133,6 +1133,7 @@
Exceptions::ThrowArgumentError(error);
UNREACHABLE();
}
+ tpeer->handle()->EnsureFreedExternal(IsolateGroup::Current());
tpeer->ClearData();
const ExternalTypedData& typed_data = ExternalTypedData::Handle(
diff --git a/runtime/tests/vm/dart/transferable_allocations_test.dart b/runtime/tests/vm/dart/transferable_allocations_test.dart
new file mode 100644
index 0000000..ec61786
--- /dev/null
+++ b/runtime/tests/vm/dart/transferable_allocations_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// Verifies that Transferable (external old space) objects are promptly gc'ed.
+// The test will run out of ia32 3GB heap allocation if objects are not gc'ed.
+
+// VMOptions=--old_gen_heap_size=32
+
+import 'dart:isolate';
+import 'dart:typed_data';
+
+void main() {
+ final data = Uint8List.view(new Uint8List(5 * 1024 * 1024).buffer);
+ for (int i = 0; i < 1000; i++) {
+ TransferableTypedData.fromList(<Uint8List>[data]).materialize();
+ }
+}
diff --git a/runtime/tests/vm/dart_2/transferable_allocations_test.dart b/runtime/tests/vm/dart_2/transferable_allocations_test.dart
new file mode 100644
index 0000000..ec61786
--- /dev/null
+++ b/runtime/tests/vm/dart_2/transferable_allocations_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// Verifies that Transferable (external old space) objects are promptly gc'ed.
+// The test will run out of ia32 3GB heap allocation if objects are not gc'ed.
+
+// VMOptions=--old_gen_heap_size=32
+
+import 'dart:isolate';
+import 'dart:typed_data';
+
+void main() {
+ final data = Uint8List.view(new Uint8List(5 * 1024 * 1024).buffer);
+ for (int i = 0; i < 1000; i++) {
+ TransferableTypedData.fromList(<Uint8List>[data]).materialize();
+ }
+}
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 411dbce..616c6bf 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -163,6 +163,9 @@
}
if (old_space_.ReachedHardThreshold()) {
+ if (last_gc_was_old_space_) {
+ CollectNewSpaceGarbage(Thread::Current(), kFull);
+ }
CollectGarbage(kMarkSweep, kExternal);
} else {
CheckStartConcurrentMarking(Thread::Current(), kExternal);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index bdef06a..6f0bc6c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -24851,8 +24851,7 @@
}
TransferableTypedDataPtr TransferableTypedData::New(uint8_t* data,
- intptr_t length,
- Heap::Space space) {
+ intptr_t length) {
TransferableTypedDataPeer* peer = new TransferableTypedDataPeer(data, length);
Thread* thread = Thread::Current();
@@ -24860,7 +24859,8 @@
{
ObjectPtr raw = Object::Allocate(
TransferableTypedData::kClassId, TransferableTypedData::InstanceSize(),
- space, TransferableTypedData::ContainsCompressedPointers());
+ thread->heap()->SpaceForExternal(length),
+ TransferableTypedData::ContainsCompressedPointers());
NoSafepointScope no_safepoint;
thread->heap()->SetPeer(raw, peer);
result ^= raw;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 8461552..c3361b3 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -11138,9 +11138,7 @@
class TransferableTypedData : public Instance {
public:
- static TransferableTypedDataPtr New(uint8_t* data,
- intptr_t len,
- Heap::Space space = Heap::kNew);
+ static TransferableTypedDataPtr New(uint8_t* data, intptr_t len);
static intptr_t InstanceSize() {
return RoundedAllocationSize(sizeof(UntaggedTransferableTypedData));
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 6617eec..655857e 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1689,7 +1689,7 @@
ASSERT(reader != nullptr);
ASSERT(!Snapshot::IsFull(kind));
- const intptr_t length = reader->Read<int32_t>();
+ const intptr_t length = reader->Read<int64_t>();
const FinalizableData finalizable_data =
static_cast<MessageSnapshotReader*>(reader)->finalizable_data()->Take();
@@ -1726,7 +1726,7 @@
writer->WriteIndexedObject(GetClassId());
writer->WriteTags(writer->GetObjectTags(this));
- writer->Write<int32_t>(length);
+ writer->Write<int64_t>(length);
static_cast<MessageWriter*>(writer)->finalizable_data()->Put(
length, data, tpeer,
diff --git a/tools/VERSION b/tools/VERSION
index 443649c..4791dbb5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 147
+PRERELEASE 148
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/gn.py b/tools/gn.py
index f711dd3..108adca 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -175,6 +175,8 @@
if gn_args['target_os'] in ['linux', 'win']:
gn_args['dart_use_fallback_root_certificates'] = True
+ gn_args['bssl_use_clang_integrated_as'] = True
+
# Use tcmalloc only when targeting Linux and when not using ASAN.
gn_args['dart_use_tcmalloc'] = ((gn_args['target_os'] == 'linux') and
sanitizer == 'none')