Version 3.9.0-168.0.dev
Merge e3e82c95cb3782515e5775bd8da170fd6771a723 into dev
diff --git a/DEPS b/DEPS
index be7207e..c7d69b5 100644
--- a/DEPS
+++ b/DEPS
@@ -138,13 +138,13 @@
"leak_tracker_rev": "f5620600a5ce1c44f65ddaa02001e200b096e14c", # rolled manually
"material_color_utilities_rev": "799b6ba2f3f1c28c67cc7e0b4f18e0c7d7f3c03e",
"native_rev": "09a756cb8d89638c1179efc86b51156282f5e856", # rolled manually while native assets are experimental
- "protobuf_rev": "deda2883eb3c8437a89bdae524b732fffef6150c",
+ "protobuf_rev": "d940c8de905439e292770ccf6c546477ae566462",
"pub_rev": "59406faad8959e332da98260bab894feb8500908", # rolled manually
"shelf_rev": "082d3ac2d13a98700d8148e8fad8f3e12a6fd0e1",
"sync_http_rev": "dc54465f07d9652875deeade643256dafa2fbc6c",
"tar_rev": "5a1ea943e70cdf3fa5e1102cdbb9418bd9b4b81a",
"test_rev": "42a6d333d96b4b0964d356b9a29ca47ccdb43691",
- "tools_rev": "36f5c9f9989e06e79323499914c50e78ab1a6621",
+ "tools_rev": "be0bd20c803377063c45904512f272fdda94e8c3",
"vector_math_rev": "13f185f7e97d559e003f5ac79201da12f9a01049",
"web_rev": "f1becf07db9faa56559d2844c3c6d430dc9b37de",
"webdev_rev": "5dbb30ebc695ad2ecc01fa8eae4e0494c199e1bc",
diff --git a/pkg/_fe_analyzer_shared/lib/src/base/errors.dart b/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
index 31d20c1..e090dd1 100644
--- a/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
@@ -20,9 +20,6 @@
///
/// Generally, messages should follow the [Guide for Writing
/// Diagnostics](https://github.com/dart-lang/sdk/blob/main/pkg/front_end/lib/src/base/diagnostics.md).
-///
-/// Note that this class name, `ErrorCode`, is soft-deprecated in favor of the
-/// type alias, `DiagnosticCode`.
@AnalyzerPublicApi(message: 'exported by package:analyzer/error/error.dart')
abstract class DiagnosticCode {
/// Regular expression for identifying positional arguments in error messages.
@@ -139,9 +136,6 @@
/**
* The severity of an [DiagnosticCode].
- *
- * Note that this class name, `ErrorSeverity`, is soft-deprecated in favor of
- * the type alias, [DiagnosticSeverity].
*/
@AnalyzerPublicApi(message: 'exported by package:analyzer/error/error.dart')
class DiagnosticSeverity implements Comparable<DiagnosticSeverity> {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
index 2eda980..bb3c14d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
@@ -11,7 +11,6 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/source/source_range.dart';
import 'package:analyzer/src/dart/analysis/session_helper.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
/// Handles textDocument/colorPresentation.
@@ -232,7 +231,7 @@
/// `const` should be inserted if the existing expression is constant but
/// we are not already in a constant context.
bool _willRequireConstKeyword(int offset, ResolvedUnitResult unit) {
- var node = NodeLocator2(offset).searchWithin(unit.unit);
+ var node = unit.unit.nodeCovering(offset: offset);
if (node is! Expression) {
return false;
}
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index ca1d2e8..b218eed 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -112,7 +112,7 @@
T Function(
engine.AnalysisResultWithErrors result,
engine.Diagnostic diagnostic, [
- engine.DiagnosticSeverity errorSeverity,
+ engine.DiagnosticSeverity severity,
])
constructor,
) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_helper.dart
index e89cb27..d6f1dc8 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_helper.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_helper.dart
@@ -585,13 +585,6 @@
/// beginning of a statement. The [node] provides context to determine which
/// keywords to include.
void addStatementKeywords(AstNode node) {
- if (node.inAsyncMethodOrFunction) {
- addKeyword(Keyword.AWAIT);
- } else if (node.inAsyncStarOrSyncStarMethodOrFunction) {
- addKeyword(Keyword.AWAIT);
- addKeyword(Keyword.YIELD);
- addKeywordAndText(Keyword.YIELD, '*');
- }
if (node.inLoop) {
addKeyword(Keyword.BREAK);
addKeyword(Keyword.CONTINUE);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
index 666359f..fa97407 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
@@ -30,7 +30,6 @@
import 'package:analyzer/src/dart/analysis/session_helper.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/dart/resolver/exit_detector.dart';
import 'package:analyzer/src/generated/java_core.dart';
import 'package:analyzer/src/utilities/extensions/ast.dart';
@@ -785,7 +784,7 @@
return null;
}
var offset = _selectionRange.offset;
- var node = NodeLocator2(offset, offset).searchWithin(_resolveResult.unit);
+ var node = _resolveResult.unit.nodeCovering(offset: offset);
// Check for the parameter list of a FunctionExpression.
{
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 959466f..c53017b 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -4544,7 +4544,7 @@
List<MethodElementImpl2> get methods2 => methods;
@override
- String? get name3 => firstFragment.name;
+ String? get name3 => firstFragment.name2;
@override
Element get nonSynthetic2 => isSynthetic ? enclosingElement : this as Element;
diff --git a/pkg/analyzer/lib/src/fine/requirements.dart b/pkg/analyzer/lib/src/fine/requirements.dart
index aa2dffa..df70317 100644
--- a/pkg/analyzer/lib/src/fine/requirements.dart
+++ b/pkg/analyzer/lib/src/fine/requirements.dart
@@ -882,8 +882,10 @@
return null;
}
- // SAFETY: we don't export elements without name.
- var instanceName = element.lookupName!.asLookupName;
+ var instanceName = element.lookupName?.asLookupName;
+ if (instanceName == null) {
+ return null;
+ }
var instancesMap = instances[libraryElement.uri] ??= {};
var instanceItem =
@@ -916,8 +918,10 @@
return null;
}
- // SAFETY: we don't export elements without name.
- var interfaceName = element.lookupName!.asLookupName;
+ var interfaceName = element.lookupName?.asLookupName;
+ if (interfaceName == null) {
+ return null;
+ }
var interfacesMap = interfaces[libraryElement.uri] ??= {};
var interfaceItem =
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index e9dce89..ea04184 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -969,6 +969,7 @@
required LibraryFragmentImpl unit,
}) {
var fragment = ClassFragmentImpl(name, 0);
+ fragment.name2 = name;
ClassElementImpl2(Reference.root(), fragment);
fragment.typeParameters =
typeParameters.map((tp) => tp.firstFragment).toList();
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 475388e..85c828d 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -15,7 +15,7 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(DartUriResolverTest);
- defineReflectiveTests(ErrorSeverityTest);
+ defineReflectiveTests(DiagnosticSeverityTest);
defineReflectiveTests(ResolveRelativeUriTest);
});
}
@@ -74,7 +74,7 @@
}
@reflectiveTest
-class ErrorSeverityTest {
+class DiagnosticSeverityTest {
test_max_error_error() async {
expect(
DiagnosticSeverity.ERROR.max(DiagnosticSeverity.ERROR),
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index a995ee9..d1b72de 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -155,6 +155,7 @@
List<MethodElementImpl2> methods = const [],
}) {
var fragment = ClassFragmentImpl(name, 0);
+ fragment.name2 = name;
fragment.isAbstract = isAbstract;
fragment.isAugmentation = isAugmentation;
fragment.isSealed = isSealed;
@@ -479,6 +480,7 @@
List<InterfaceTypeImpl> interfaces = const [],
}) {
var fragment = MixinFragmentImpl(name, 0);
+ fragment.name2 = name;
fragment.isAugmentation = isAugmentation;
fragment.enclosingElement3 = testLibrary.definingCompilationUnit;
fragment.typeParameters = typeParameters.map((e) => e.asElement).toList();
@@ -500,6 +502,7 @@
List<InterfaceTypeImpl> interfaces = const [],
}) {
var fragment = MixinFragmentImpl(name, 0);
+ fragment.name2 = name;
fragment.isAugmentation = isAugmentation;
fragment.enclosingElement3 = testLibrary.definingCompilationUnit;
fragment.typeParameters = typeParameters.map((e) => e.asElement).toList();
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index e73dfb8..375d854 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -44373,6 +44373,64 @@
);
}
+ test_req_classElement_noName() async {
+ newFile(testFile.path, r'''
+class {}
+''');
+
+ _ManualRequirements.install((state) {
+ var e = state.singleUnit.libraryElement.classes.single;
+ e.getNamedConstructor2('foo');
+ });
+
+ await _runManualRequirementsRecording(
+ expectedEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+ package:test/test.dart
+ requirements
+[operation] analyzedLibrary
+ file: /home/test/lib/test.dart
+ requirements
+[status] idle
+''',
+ );
+ }
+
+ test_req_extensionElement_noName() async {
+ newFile(testFile.path, r'''
+extension on int {
+ void foo() {}
+}
+''');
+
+ _ManualRequirements.install((state) {
+ var e = state.singleUnit.libraryElement.extensions.single;
+ e.getMethod('foo');
+ });
+
+ await _runManualRequirementsRecording(
+ expectedEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+ package:test/test.dart
+ requirements
+ topLevels
+ dart:core
+ int: #M0
+[operation] analyzedLibrary
+ file: /home/test/lib/test.dart
+ requirements
+ topLevels
+ dart:core
+ int: #M0
+[status] idle
+''',
+ );
+ }
+
test_req_instanceElement_getField() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
@@ -45197,6 +45255,10 @@
_ManualRequirementsUnit(this.unit);
+ LibraryElementImpl get libraryElement {
+ return libraryFragment.element;
+ }
+
LibraryFragmentImpl get libraryFragment {
return unit.declaredFragment!;
}
diff --git a/pkg/analyzer/test/src/summary/elements/class_test.dart b/pkg/analyzer/test/src/summary/elements/class_test.dart
index 759b153..065f0db 100644
--- a/pkg/analyzer/test/src/summary/elements/class_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/class_test.dart
@@ -13104,7 +13104,7 @@
element: <testLibraryFragment>::@class::0::@constructor::new#element
typeName: null
classes
- class
+ class <null-name>
reference: <testLibrary>::@class::0
firstFragment: <testLibraryFragment>::@class::0
constructors
diff --git a/pkg/analyzer/test/src/summary/elements/enum_test.dart b/pkg/analyzer/test/src/summary/elements/enum_test.dart
index 663d814..9a699e2 100644
--- a/pkg/analyzer/test/src/summary/elements/enum_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/enum_test.dart
@@ -3096,13 +3096,13 @@
constructorName: ConstructorName
type: NamedType
name: <empty> @-1 <synthetic>
- element2: <testLibrary>::@enum::0
- type:
- element: <testLibraryFragment>::@enum::0::@constructor::new#element
+ element2: <null>
+ type: InvalidType
+ element: <null>
argumentList: ArgumentList
leftParenthesis: ( @0
rightParenthesis: ) @0
- staticType:
+ staticType: InvalidType
getter2: <testLibraryFragment>::@enum::0::@getter::v
synthetic values
reference: <testLibraryFragment>::@enum::0::@field::values
@@ -3114,9 +3114,9 @@
SimpleIdentifier
token: v @-1
element: <testLibraryFragment>::@enum::0::@getter::v#element
- staticType:
+ staticType: InvalidType
rightBracket: ] @0
- staticType: List<>
+ staticType: List<<null>>
getter2: <testLibraryFragment>::@enum::0::@getter::values
constructors
synthetic const new
@@ -3131,21 +3131,21 @@
reference: <testLibraryFragment>::@enum::0::@getter::values
element: <testLibraryFragment>::@enum::0::@getter::values#element
enums
- enum
+ enum <null-name>
reference: <testLibrary>::@enum::0
firstFragment: <testLibraryFragment>::@enum::0
supertype: Enum
fields
static const enumConstant hasInitializer v
firstFragment: <testLibraryFragment>::@enum::0::@field::v
- type:
+ type: InvalidType
constantInitializer
fragment: <testLibraryFragment>::@enum::0::@field::v
expression: expression_0
getter: <testLibraryFragment>::@enum::0::@getter::v#element
synthetic static const values
firstFragment: <testLibraryFragment>::@enum::0::@field::values
- type: List<>
+ type: List<<null>>
constantInitializer
fragment: <testLibraryFragment>::@enum::0::@field::values
expression: expression_1
@@ -3156,10 +3156,10 @@
getters
synthetic static get v
firstFragment: <testLibraryFragment>::@enum::0::@getter::v
- returnType:
+ returnType: InvalidType
synthetic static get values
firstFragment: <testLibraryFragment>::@enum::0::@getter::values
- returnType: List<>
+ returnType: List<<null>>
''');
}
diff --git a/pkg/analyzer/test/src/summary/elements/extension_type_test.dart b/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
index defa5d1..56da5ee 100644
--- a/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
@@ -1621,7 +1621,7 @@
reference: <testLibraryFragment>::@extensionType::0::@getter::it
element: <testLibraryFragment>::@extensionType::0::@getter::it#element
extensionTypes
- extension type
+ extension type <null-name>
reference: <testLibrary>::@extensionType::0
firstFragment: <testLibraryFragment>::@extensionType::0
representation: <testLibraryFragment>::@extensionType::0::@field::it#element
diff --git a/pkg/analyzer/test/src/summary/elements/mixin_test.dart b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
index b4d0f26..5afc33d 100644
--- a/pkg/analyzer/test/src/summary/elements/mixin_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
@@ -1433,7 +1433,7 @@
reference: <testLibraryFragment>::@mixin::0
element: <testLibrary>::@mixin::0
mixins
- mixin
+ mixin <null-name>
reference: <testLibrary>::@mixin::0
firstFragment: <testLibraryFragment>::@mixin::0
superclassConstraints
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 473bcb1..35842e2 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -116,7 +116,7 @@
}
/// Returns the maximal [DiagnosticSeverity] of the recorded diagnostics.
- DiagnosticSeverity computeMaxErrorSeverity() {
+ DiagnosticSeverity computeMaxSeverity() {
var status = DiagnosticSeverity.NONE;
for (var result in errorsResults) {
for (var error in result.errors) {
@@ -180,7 +180,7 @@
}
// Compute and return max severity.
- return computeMaxErrorSeverity();
+ return computeMaxSeverity();
}
DiagnosticSeverity? _defaultSeverityProcessor(Diagnostic diagnostic) =>
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 1a5b830..2ae71d2 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -13,7 +13,6 @@
import 'package:analyzer/dart/element/type_system.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/source/source_range.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/services/top_level_declarations.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart'
@@ -2684,8 +2683,13 @@
_EnclosingElementFinder();
- void find(AstNode? target, int offset) {
- var node = NodeLocator2(offset).searchWithin(target);
+ void find(CompilationUnit target, int offset) {
+ var node = target.nodeCovering(offset: offset);
+ if (node != null && offset == node.end) {
+ // If the offset is just outside the node, then the element declared by
+ // the node isn't actually enclosing the offset.
+ node = node.parent;
+ }
while (node != null) {
if (node is ClassDeclaration) {
enclosingClass = node.declaredFragment?.element;
diff --git a/pkg/dart2wasm/lib/dynamic_modules.dart b/pkg/dart2wasm/lib/dynamic_modules.dart
index b7001aa..67ab4047 100644
--- a/pkg/dart2wasm/lib/dynamic_modules.dart
+++ b/pkg/dart2wasm/lib/dynamic_modules.dart
@@ -605,7 +605,9 @@
// These types do not have directly invokable constructors.
translator.classInfo[member.enclosingClass]!.struct
.isSubtypeOf(translator.objectInfo.struct)) {
- passReference(member.reference);
+ if (!member.enclosingClass.isAnonymousMixin) {
+ passReference(member.reference);
+ }
passReference(member.initializerReference);
passReference(member.constructorBodyReference);
}
diff --git a/pkg/dynamic_modules/test/data/const_mixin_class/dynamic_interface.yaml b/pkg/dynamic_modules/test/data/const_mixin_class/dynamic_interface.yaml
new file mode 100644
index 0000000..43360b9
--- /dev/null
+++ b/pkg/dynamic_modules/test/data/const_mixin_class/dynamic_interface.yaml
@@ -0,0 +1,7 @@
+# Copyright (c) 2025, 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.
+
+callable:
+ - library: 'shared/shared.dart'
+ class: 'Foo'
diff --git a/pkg/dynamic_modules/test/data/const_mixin_class/main.dart b/pkg/dynamic_modules/test/data/const_mixin_class/main.dart
new file mode 100644
index 0000000..3910617
--- /dev/null
+++ b/pkg/dynamic_modules/test/data/const_mixin_class/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2025, 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 '../../common/testing.dart' as helper;
+import 'package:expect/expect.dart';
+
+import 'shared/shared.dart' show Foo;
+
+/// A dynamic module is allowed to extend a class in the dynamic interface and
+/// override its members.
+void main() async {
+ final o = (await helper.load('entry1.dart'));
+ Expect.equals(const Foo(), o);
+ helper.done();
+}
diff --git a/pkg/dynamic_modules/test/data/const_mixin_class/modules/entry1.dart b/pkg/dynamic_modules/test/data/const_mixin_class/modules/entry1.dart
new file mode 100644
index 0000000..ec027e2
--- /dev/null
+++ b/pkg/dynamic_modules/test/data/const_mixin_class/modules/entry1.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2025, 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 '../shared/shared.dart';
+
+@pragma('dyn-module:entry-point')
+Object? dynamicModuleEntrypoint() => const Foo();
diff --git a/pkg/dynamic_modules/test/data/const_mixin_class/shared/shared.dart b/pkg/dynamic_modules/test/data/const_mixin_class/shared/shared.dart
new file mode 100644
index 0000000..c9402b4
--- /dev/null
+++ b/pkg/dynamic_modules/test/data/const_mixin_class/shared/shared.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2025, 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.
+
+mixin Mixin {}
+
+class Foo with Mixin {
+ const Foo();
+}
diff --git a/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart b/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart
index a642122..ad49f6f 100644
--- a/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart
+++ b/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart
@@ -16,6 +16,7 @@
const int headerSize = 8;
final int compressedWordSize =
sizeOf<Pointer>() == 8 && !Platform.executable.contains('64C') ? 8 : 4;
+const int wordSize = 8; // analyze_snapshot is not supported on arm32
// Used to ensure we don't have multiple equivalent calls to test.
final _seenDescriptions = <String>{};
@@ -222,7 +223,8 @@
// We have:
// class Base {
- // static int baseS = int.parse('1');
+ // static int baseS0 = int.parse('1');
+ // static int baseS1 = int.parse('2');
// int base0;
// double base1;
// Object? base2;
@@ -231,10 +233,17 @@
// }
//
// This static field is never tree shaken.
- expectField(baseFields[0], name: 'baseS', flags: ['static']);
+ expectField(baseFields[0], name: 'baseS0', flags: ['static']);
+ expectField(baseFields[1], name: 'baseS1', flags: ['static']);
+
+ // Neighboring static fields should always be one word away
+ final int staticFieldOffset0 = baseFields[0]["static_field_offset"];
+ final int staticFieldOffset1 = baseFields[1]["static_field_offset"];
+ Expect.equals(staticFieldOffset1 - staticFieldOffset0, wordSize);
+
if (isProduct) {
// Most [Field] objests are tree shaken.
- Expect.equals(1, baseFields.length);
+ Expect.equals(2, baseFields.length);
int slotOffset = 0;
slotOffset += expectUnknown8Bytes(
@@ -264,28 +273,28 @@
);
} else {
// We don't tree shake [Field] objects in non-product builds.
- Expect.equals(6, baseFields.length);
+ Expect.equals(7, baseFields.length);
expectField(
- baseFields[1],
+ baseFields[2],
name: 'base0',
isReference: false,
unboxedType: 'int',
);
expectField(
- baseFields[2],
+ baseFields[3],
name: 'base1',
isReference: false,
unboxedType: 'double',
);
- expectField(baseFields[3], name: 'base2');
+ expectField(baseFields[4], name: 'base2');
expectField(
- baseFields[4],
+ baseFields[5],
name: 'base3',
isReference: false,
unboxedType: 'Float32x4',
);
expectField(
- baseFields[5],
+ baseFields[6],
name: 'base4',
isReference: false,
unboxedType: 'Float64x2',
@@ -296,34 +305,34 @@
offsetReferences: 0,
offsetBytes: 0,
isReference: false,
- fieldId: baseFieldIds[1],
+ fieldId: baseFieldIds[2],
);
slotOffset += expectInstanceSlot(
baseSlots[slotOffset],
offsetReferences: 0,
offsetBytes: 8,
isReference: false,
- fieldId: baseFieldIds[2],
+ fieldId: baseFieldIds[3],
);
slotOffset += expectInstanceSlot(
baseSlots[slotOffset],
offsetReferences: 0,
offsetBytes: 16,
- fieldId: baseFieldIds[3],
+ fieldId: baseFieldIds[4],
);
slotOffset += expectInstanceSlot(
baseSlots[slotOffset],
offsetReferences: 1,
offsetBytes: 16,
isReference: false,
- fieldId: baseFieldIds[4],
+ fieldId: baseFieldIds[5],
);
slotOffset += expectInstanceSlot(
baseSlots[slotOffset],
offsetReferences: 1,
offsetBytes: 32,
isReference: false,
- fieldId: baseFieldIds[5],
+ fieldId: baseFieldIds[6],
);
}
// We have:
diff --git a/runtime/tests/vm/dart/analyze_snapshot_program.dart b/runtime/tests/vm/dart/analyze_snapshot_program.dart
index d58ed4d..d970325 100644
--- a/runtime/tests/vm/dart/analyze_snapshot_program.dart
+++ b/runtime/tests/vm/dart/analyze_snapshot_program.dart
@@ -40,7 +40,8 @@
}
class FieldTestBase {
- static int baseS = int.parse('1');
+ static int baseS0 = int.parse('1');
+ static int baseS1 = int.parse('2');
int base0;
double base1;
Object? base2;
@@ -48,10 +49,12 @@
Float64x2 base4;
FieldTestBase(this.base0, this.base1, this.base2, this.base3, this.base4) {
- baseS++;
+ baseS0++;
+ baseS1++;
}
- String foo() => 'Base.foo: [$baseS, $base0, $base1, $base2, $base3, $base4]';
+ String foo() =>
+ 'Base.foo: [$baseS0, $baseS1, $base0, $base1, $base2, $base3, $base4]';
}
class FieldTestSub<T> extends FieldTestBase {
diff --git a/runtime/vm/analyze_snapshot_api_impl.cc b/runtime/vm/analyze_snapshot_api_impl.cc
index f6f268e..9a60ea8 100644
--- a/runtime/vm/analyze_snapshot_api_impl.cc
+++ b/runtime/vm/analyze_snapshot_api_impl.cc
@@ -293,6 +293,8 @@
js_.PrintProperty64("type_class", GetObjectId(field.type()));
if (field.is_static()) {
js_.PrintProperty("instance", GetObjectId(field.StaticValue()));
+ js_.PrintProperty64("static_field_offset",
+ FieldTable::FieldOffsetFor(field.field_id()));
}
if (field.HasInitializerFunction()) {
js_.PrintProperty("initializer_function",
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index 6a3236d..e276f33 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -109,3 +109,6 @@
[ $sanitizer == asan || $sanitizer == msan || $sanitizer == tsan ]
data_not_asan_test: SkipByDesign # This test tries to allocate too much memory on purpose.
+
+[ $hot_reload || $hot_reload_rollback ]
+isolate_group_shared_callback_test: SkipSlow # shared_slow_path_triggers_gc in combination with reload makes this test very slow
\ No newline at end of file
diff --git a/tools/VERSION b/tools/VERSION
index f750e54..ad260f7 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 3
MINOR 9
PATCH 0
-PRERELEASE 167
+PRERELEASE 168
PRERELEASE_PATCH 0