Skip to content

Commit 6ae9152

Browse files
scheglovCommit Queue
authored andcommitted
Issue 62222. Use Object.hashAll(), cache hashCode values.
Bug: #62222 Change-Id: I5bd8a99b83887d38d734f113b863406214856a9f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/467684 Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Paul Berry <paulberry@google.com>
1 parent 875cbd1 commit 6ae9152

File tree

1 file changed

+24
-35
lines changed

1 file changed

+24
-35
lines changed

pkg/analyzer/lib/src/dart/constant/value.dart

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,10 @@ class DartObjectImpl implements DartObject, Constant {
10311031

10321032
/// Set the `index` and `_name` fields for this enum constant.
10331033
void updateEnumConstant({required int index, required String name}) {
1034-
var fields = state.fields!;
1034+
var state = this.state as GenericState;
1035+
state._hashCode = null;
1036+
1037+
var fields = state.fields;
10351038
fields['index'] = DartObjectImpl(
10361039
_typeSystem,
10371040
_typeSystem.typeProvider.intType,
@@ -1486,6 +1489,9 @@ class GenericState extends InstanceState {
14861489
/// The values of the fields of this instance.
14871490
final Map<String, DartObjectImpl> _fieldMap;
14881491

1492+
/// The cached hash code.
1493+
int? _hashCode;
1494+
14891495
/// Information about the constructor invoked to generate this instance.
14901496
final ConstructorInvocationImpl? invocation;
14911497

@@ -1499,11 +1505,10 @@ class GenericState extends InstanceState {
14991505

15001506
@override
15011507
int get hashCode {
1502-
int hashCode = 0;
1503-
for (DartObjectImpl value in _fieldMap.values) {
1504-
hashCode += value.hashCode;
1505-
}
1506-
return hashCode;
1508+
return _hashCode ??= Object.hashAll([
1509+
..._fieldMap.keys,
1510+
..._fieldMap.values,
1511+
]);
15071512
}
15081513

15091514
@override
@@ -2552,6 +2557,9 @@ class ListState extends InstanceState {
25522557
@override
25532558
final bool isUnknown;
25542559

2560+
@override
2561+
late final int hashCode = Object.hashAll(elements);
2562+
25552563
ListState({
25562564
required TypeImpl elementType,
25572565
required this.elements,
@@ -2562,16 +2570,6 @@ class ListState extends InstanceState {
25622570
factory ListState.unknown(TypeImpl elementType) =>
25632571
ListState(elementType: elementType, elements: [], isUnknown: true);
25642572

2565-
@override
2566-
int get hashCode {
2567-
int value = 0;
2568-
int count = elements.length;
2569-
for (int i = 0; i < count; i++) {
2570-
value = (value << 3) ^ elements[i].hashCode;
2571-
}
2572-
return value;
2573-
}
2574-
25752573
@override
25762574
String get typeName => "List";
25772575

@@ -2651,6 +2649,12 @@ class MapState extends InstanceState {
26512649
/// Whether the map contains an entry that has an unknown value.
26522650
final bool _isUnknown;
26532651

2652+
@override
2653+
late final int hashCode = Object.hashAll([
2654+
...entries.keys,
2655+
...entries.values,
2656+
]);
2657+
26542658
/// Initializes a newly created state to represent a set with the given
26552659
/// [entries].
26562660
MapState({
@@ -2670,15 +2674,6 @@ class MapState extends InstanceState {
26702674
isUnknown: true,
26712675
);
26722676

2673-
@override
2674-
int get hashCode {
2675-
int value = 0;
2676-
for (DartObjectImpl key in entries.keys.toSet()) {
2677-
value = (value << 3) ^ key.hashCode;
2678-
}
2679-
return value;
2680-
}
2681-
26822677
@override
26832678
bool get isUnknown => _isUnknown;
26842679

@@ -2830,7 +2825,7 @@ class RecordState extends InstanceState {
28302825
final Map<String, DartObjectImpl> namedFields;
28312826

28322827
@override
2833-
late final hashCode = Object.hashAll([
2828+
late final int hashCode = Object.hashAll([
28342829
...positionalFields,
28352830
...namedFields.values,
28362831
]);
@@ -2957,6 +2952,9 @@ class SetState extends InstanceState {
29572952
/// Whether the set contains an entry that has an unknown value.
29582953
final bool _isUnknown;
29592954

2955+
@override
2956+
late final int hashCode = Object.hashAll(elements);
2957+
29602958
/// Initializes a newly created state to represent a set with the given
29612959
/// [elements].
29622960
SetState({
@@ -2970,15 +2968,6 @@ class SetState extends InstanceState {
29702968
factory SetState.unknown(TypeImpl elementType) =>
29712969
SetState(elementType: elementType, elements: {}, isUnknown: true);
29722970

2973-
@override
2974-
int get hashCode {
2975-
int value = 0;
2976-
for (DartObjectImpl element in elements) {
2977-
value = (value << 3) ^ element.hashCode;
2978-
}
2979-
return value;
2980-
}
2981-
29822971
@override
29832972
bool get isUnknown => _isUnknown;
29842973

0 commit comments

Comments
 (0)