Version 3.5.0-301.0.dev Merge 3180d9545360cfb176a90d45db48009cf1beb842 into dev
diff --git a/pkg/analyzer/lib/src/summary2/augmentation.dart b/pkg/analyzer/lib/src/summary2/augmentation.dart index 73ac89a..ece4e71 100644 --- a/pkg/analyzer/lib/src/summary2/augmentation.dart +++ b/pkg/analyzer/lib/src/summary2/augmentation.dart
@@ -5,6 +5,7 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/member.dart'; +import 'package:analyzer/src/dart/element/type.dart'; import 'package:analyzer/src/dart/element/type_algebra.dart'; import 'package:analyzer/src/summary2/library_builder.dart'; import 'package:analyzer/src/utilities/extensions/element.dart'; @@ -238,16 +239,23 @@ var declaration = augmented.declaration; var declarationTypeParameters = declaration.typeParameters; + MapSubstitution toDeclaration; var augmentationTypeParameters = augmentation.typeParameters; - if (augmentationTypeParameters.length != declarationTypeParameters.length) { - return; + if (augmentationTypeParameters.length == declarationTypeParameters.length) { + toDeclaration = Substitution.fromPairs( + augmentationTypeParameters, + declarationTypeParameters.instantiateNone(), + ); + } else { + toDeclaration = Substitution.fromPairs( + augmentationTypeParameters, + List.filled( + augmentationTypeParameters.length, + InvalidTypeImpl.instance, + ), + ); } - var toDeclaration = Substitution.fromPairs( - augmentationTypeParameters, - declarationTypeParameters.instantiateNone(), - ); - if (augmentation is InterfaceElementImpl && declaration is InterfaceElementImpl && augmented is AugmentedInterfaceElementImpl) {
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart index 1aeba7d..bf840bf 100644 --- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart +++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -2024,12 +2024,20 @@ var augmentationSubstitution = Substitution.empty; if (enclosing != declaration) { var elementTypeParameters = enclosing.typeParameters; - // We don't add augmentation members if numbers of type parameters - // don't match, so we can assume that they are the same here. - augmentationSubstitution = Substitution.fromPairs( - elementTypeParameters, - declarationTypeParameters.instantiateNone(), - ); + if (elementTypeParameters.length == declarationTypeParameters.length) { + augmentationSubstitution = Substitution.fromPairs( + elementTypeParameters, + declarationTypeParameters.instantiateNone(), + ); + } else { + augmentationSubstitution = Substitution.fromPairs( + elementTypeParameters, + List.filled( + elementTypeParameters.length, + InvalidTypeImpl.instance, + ), + ); + } } var substitution = Substitution.empty;
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart index 0936906..2b862dd 100644 --- a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart +++ b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart
@@ -93,6 +93,26 @@ ]); } + test_class_method() async { + newFile('$testPackageLibPath/a.dart', r''' +import augment 'test.dart'; + +class A { + void foo() {} +} +'''); + + await assertErrorsInCode(r''' +augment library 'a.dart'; + +augment class A<T> { + augment void foo() {} +} +''', [ + error(CompileTimeErrorCode.AUGMENTATION_TYPE_PARAMETER_COUNT, 42, 1), + ]); + } + test_enum_0_1() async { newFile('$testPackageLibPath/a.dart', r''' import augment 'test.dart'; @@ -404,4 +424,24 @@ error(CompileTimeErrorCode.AUGMENTATION_TYPE_PARAMETER_COUNT, 44, 1), ]); } + + test_mixin_method() async { + newFile('$testPackageLibPath/a.dart', r''' +import augment 'test.dart'; + +mixin A { + void foo() {} +} +'''); + + await assertErrorsInCode(r''' +augment library 'a.dart'; + +augment mixin A<T> { + augment void foo() {} +} +''', [ + error(CompileTimeErrorCode.AUGMENTATION_TYPE_PARAMETER_COUNT, 42, 1), + ]); + } }
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart index 337e2bd..c8edef6 100644 --- a/pkg/analyzer/test/src/summary/elements_test.dart +++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -4678,6 +4678,57 @@ '''); } + test_methods_typeParameterCountMismatch() async { + newFile('$testPackageLibPath/a.dart', r''' +augment library 'test.dart'; +augment class A<T> { + augment void foo() {} +} +'''); + + var library = await buildLibrary(r''' +import augment 'a.dart'; +class A { + void foo() {} + void bar() {} +} +'''); + + configuration.withConstructors = false; + checkElementText(library, r''' +library + definingUnit + classes + class A @31 + augmentation: self::@augmentation::package:test/a.dart::@classAugmentation::A + methods + foo @42 + returnType: void + augmentation: self::@augmentation::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo + bar @58 + returnType: void + augmented + methods + self::@class::A::@method::bar + MethodMember + base: self::@augmentation::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo + augmentationSubstitution: {T: InvalidType} + augmentationImports + package:test/a.dart + definingUnit + classes + augment class A @43 + typeParameters + covariant T @45 + defaultType: dynamic + augmentationTarget: self::@class::A + methods + augment foo @65 + returnType: void + augmentationTarget: self::@class::A::@method::foo +'''); + } + test_modifiers_abstract() async { newFile('$testPackageLibPath/a.dart', r''' augment library 'test.dart'; @@ -50776,6 +50827,95 @@ '''); } + test_augmented_constants_typeParameterCountMismatch() async { + newFile('$testPackageLibPath/a.dart', r''' +augment library 'test.dart'; +augment enum A<T> { + augment v +} +'''); + + var library = await buildLibrary(r''' +import augment 'a.dart'; +enum A { + v, v2 +} +'''); + + configuration + ..withConstructors = false + ..withConstantInitializers = false + ..withReferences = true; + checkElementText(library, r''' +library + reference: self + definingUnit + reference: self + enums + enum A @30 + reference: self::@enum::A + augmentation: self::@augmentation::package:test/a.dart::@enumAugmentation::A + supertype: Enum + fields + static const enumConstant v @36 + reference: self::@enum::A::@field::v + type: A + shouldUseTypeForInitializerInference: false + augmentation: self::@augmentation::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v + static const enumConstant v2 @39 + reference: self::@enum::A::@field::v2 + type: A + shouldUseTypeForInitializerInference: false + synthetic static const values @-1 + reference: self::@enum::A::@field::values + type: List<A> + accessors + synthetic static get v @-1 + reference: self::@enum::A::@getter::v + returnType: A + synthetic static get v2 @-1 + reference: self::@enum::A::@getter::v2 + returnType: A + synthetic static get values @-1 + reference: self::@enum::A::@getter::values + returnType: List<A> + augmented + fields + FieldMember + base: self::@augmentation::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v + augmentationSubstitution: {T: InvalidType} + self::@enum::A::@field::v2 + self::@enum::A::@field::values + constants + FieldMember + base: self::@augmentation::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v + augmentationSubstitution: {T: InvalidType} + self::@enum::A::@field::v2 + accessors + self::@enum::A::@getter::v + self::@enum::A::@getter::v2 + self::@enum::A::@getter::values + augmentationImports + package:test/a.dart + reference: self::@augmentation::package:test/a.dart + definingUnit + reference: self::@augmentation::package:test/a.dart + enums + augment enum A @42 + reference: self::@augmentation::package:test/a.dart::@enumAugmentation::A + typeParameters + covariant T @44 + defaultType: dynamic + augmentationTarget: self::@enum::A + fields + augment static const enumConstant v @59 + reference: self::@augmentation::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v + type: A + shouldUseTypeForInitializerInference: false + augmentationTarget: self::@enum::A::@field::v +'''); + } + test_augmented_constructors_add_named() async { newFile('$testPackageLibPath/a.dart', r''' augment library 'test.dart'; @@ -56509,6 +56649,57 @@ '''); } + test_augmented_methods_typeParameterCountMismatch() async { + newFile('$testPackageLibPath/a.dart', r''' +augment library 'test.dart'; +augment extension A<T> { + augment void foo() {} +} +'''); + + var library = await buildLibrary(r''' +import augment 'a.dart'; +extension A on int { + void foo() {} + void bar() {} +} +'''); + + checkElementText(library, r''' +library + definingUnit + extensions + A @35 + extendedType: int + augmentation: self::@augmentation::package:test/a.dart::@extensionAugmentation::A + methods + foo @53 + returnType: void + augmentation: self::@augmentation::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo + bar @69 + returnType: void + augmented + methods + self::@extension::A::@method::bar + MethodMember + base: self::@augmentation::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo + augmentationSubstitution: {T: InvalidType} + augmentationImports + package:test/a.dart + definingUnit + extensions + augment A @47 + typeParameters + covariant T @49 + defaultType: dynamic + augmentationTarget: self::@extension::A + methods + augment foo @69 + returnType: void + augmentationTarget: self::@extension::A::@method::foo +'''); + } + test_augmented_setters_add() async { newFile('$testPackageLibPath/a.dart', r''' augment library 'test.dart'; @@ -58694,6 +58885,77 @@ '''); } + test_augmented_methods_typeParameterCountMismatch() async { + newFile('$testPackageLibPath/a.dart', r''' +augment library 'test.dart'; +augment extension type A<T>(int it) { + augment void foo() {} +} +'''); + + var library = await buildLibrary(r''' +import augment 'a.dart'; +extension type A(int it) { + void foo() {} + void bar() {} +} +'''); + + checkElementText(library, r''' +library + definingUnit + extensionTypes + A @40 + augmentation: self::@augmentation::package:test/a.dart::@extensionTypeAugmentation::A + representation: self::@extensionType::A::@field::it + primaryConstructor: self::@extensionType::A::@constructor::new + typeErasure: int + fields + final it @46 + type: int + constructors + @40 + parameters + requiredPositional final this.it @46 + type: int + field: self::@extensionType::A::@field::it + accessors + synthetic get it @-1 + returnType: int + methods + foo @59 + returnType: void + augmentation: self::@augmentation::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo + bar @75 + returnType: void + augmented + fields + self::@extensionType::A::@field::it + constructors + self::@extensionType::A::@constructor::new + accessors + self::@extensionType::A::@getter::it + methods + self::@extensionType::A::@method::bar + MethodMember + base: self::@augmentation::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo + augmentationSubstitution: {T: InvalidType} + augmentationImports + package:test/a.dart + definingUnit + extensionTypes + augment A @52 + typeParameters + covariant T @54 + defaultType: dynamic + augmentationTarget: self::@extensionType::A + methods + augment foo @82 + returnType: void + augmentationTarget: self::@extensionType::A::@method::foo +'''); + } + test_augmented_setters_add() async { newFile('$testPackageLibPath/a.dart', r''' augment library 'test.dart'; @@ -62791,6 +63053,60 @@ '''); } + test_augmented_methods_typeParameterCountMismatch() async { + newFile('$testPackageLibPath/a.dart', r''' +augment library 'test.dart'; +augment mixin A<T> { + augment void foo() {} +} +'''); + + var library = await buildLibrary(r''' +import augment 'a.dart'; +mixin A { + void foo() {} + void bar() {} +} +'''); + + checkElementText(library, r''' +library + definingUnit + mixins + mixin A @31 + augmentation: self::@augmentation::package:test/a.dart::@mixinAugmentation::A + superclassConstraints + Object + methods + foo @42 + returnType: void + augmentation: self::@augmentation::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo + bar @58 + returnType: void + augmented + superclassConstraints + Object + methods + self::@mixin::A::@method::bar + MethodMember + base: self::@augmentation::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo + augmentationSubstitution: {T: InvalidType} + augmentationImports + package:test/a.dart + definingUnit + mixins + augment mixin A @43 + typeParameters + covariant T @45 + defaultType: dynamic + augmentationTarget: self::@mixin::A + methods + augment foo @65 + returnType: void + augmentationTarget: self::@mixin::A::@method::foo +'''); + } + test_augmented_setters_add() async { newFile('$testPackageLibPath/a.dart', r''' augment library 'test.dart';
diff --git a/pkg/dds/test/control_web_server_starts_dds_test.dart b/pkg/dds/test/control_web_server_starts_dds_test.dart index ef1ad79..4fb25fb 100644 --- a/pkg/dds/test/control_web_server_starts_dds_test.dart +++ b/pkg/dds/test/control_web_server_starts_dds_test.dart
@@ -28,9 +28,9 @@ silenceOutput: true, ); expect(serviceInfo.serverUri, isNotNull); - expect(serviceInfo.serverWebSocketUri, isNotNull); + final serverWebSocketUri = serviceInfo.serverWebSocketUri!; service = await vmServiceConnectUri( - serviceInfo.serverWebSocketUri!.toString(), + serverWebSocketUri.toString(), ); // Check that DDS has been launched.
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc index 972ae8f..eb81ba2 100644 --- a/runtime/vm/runtime_entry.cc +++ b/runtime/vm/runtime_entry.cc
@@ -561,39 +561,35 @@ Thread* thread) { ObjectPtr object = static_cast<ObjectPtr>(object_in); - // If we eliminate a generational write barriers on allocations of an object + // If we eliminate the generational write barrier when writing into an object, // we need to ensure it's either a new-space object or it has been added to - // the remembered set. + // the remembered set. If we eliminate the incremental write barrier, we need + // to add the object to the deferred marking stack so it will be [re]scanned. // // NOTE: We use static_cast<>() instead of ::RawCast() to avoid handle // allocations in debug mode. Handle allocations in leaf runtimes can cause // memory leaks because they will allocate into a handle scope from the next // outermost runtime code (to which the generated Dart code might not return // in a long time). - bool add_to_remembered_set = true; - if (object->IsNewObject()) { - add_to_remembered_set = false; - } else if (object->IsArray()) { + bool skips_barrier = true; + if (object->IsArray()) { const intptr_t length = Array::LengthOf(static_cast<ArrayPtr>(object)); - add_to_remembered_set = - compiler::target::WillAllocateNewOrRememberedArray(length); + skips_barrier = compiler::target::WillAllocateNewOrRememberedArray(length); } else if (object->IsContext()) { const intptr_t num_context_variables = Context::NumVariables(static_cast<ContextPtr>(object)); - add_to_remembered_set = - compiler::target::WillAllocateNewOrRememberedContext( - num_context_variables); + skips_barrier = compiler::target::WillAllocateNewOrRememberedContext( + num_context_variables); } - if (add_to_remembered_set) { - object->untag()->EnsureInRememberedSet(thread); - } + if (skips_barrier) { + if (object->IsOldObject()) { + object->untag()->EnsureInRememberedSet(thread); + } - // For incremental write barrier elimination, we need to ensure that the - // allocation ends up in the new space or else the object needs to added - // to deferred marking stack so it will be [re]scanned. - if (thread->is_marking()) { - thread->DeferredMarkingStackAddObject(object); + if (thread->is_marking()) { + thread->DeferredMarkingStackAddObject(object); + } } return static_cast<uword>(object);
diff --git a/tools/VERSION b/tools/VERSION index 4214e18..2f24734 100644 --- a/tools/VERSION +++ b/tools/VERSION
@@ -27,5 +27,5 @@ MAJOR 3 MINOR 5 PATCH 0 -PRERELEASE 300 +PRERELEASE 301 PRERELEASE_PATCH 0