From d34abd9c1ebbf93d597828e43629d3a5dfe8cb81 Mon Sep 17 00:00:00 2001 From: dmathieu Date: Wed, 8 May 2024 10:26:41 +0200 Subject: [PATCH] don't mutate the map when comparing it --- log/keyvalue.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/log/keyvalue.go b/log/keyvalue.go index 53bcd52f4d0f..8258defe360d 100644 --- a/log/keyvalue.go +++ b/log/keyvalue.go @@ -257,15 +257,9 @@ func (v Value) Equal(w Value) bool { case KindSlice: return slices.EqualFunc(v.asSlice(), w.asSlice(), Value.Equal) case KindMap: - sv := v.asMap() - slices.SortFunc(sv, func(a, b KeyValue) int { - return cmp.Compare(a.Key, b.Key) - }) - sw := w.asMap() - slices.SortFunc(sw, func(a, b KeyValue) int { - return cmp.Compare(a.Key, b.Key) - }) - return slices.EqualFunc(v.asMap(), w.asMap(), KeyValue.Equal) + sv := sortMap(v.asMap()) + sw := sortMap(w.asMap()) + return slices.EqualFunc(sv, sw, KeyValue.Equal) case KindBytes: return bytes.Equal(v.asBytes(), w.asBytes()) case KindEmpty: @@ -276,6 +270,16 @@ func (v Value) Equal(w Value) bool { } } +func sortMap(m []KeyValue) []KeyValue { + sm := make([]KeyValue, len(m)) + copy(sm, m) + slices.SortFunc(sm, func(a, b KeyValue) int { + return cmp.Compare(a.Key, b.Key) + }) + + return sm +} + // String returns Value's value as a string, formatted like [fmt.Sprint]. // // The returned string is meant for debugging;