@@ -115,7 +115,7 @@ func FingerprintFromGadgets(gadgetInstances []*GadgetInstance) (Fingerprint, err
115
115
return fingerprint , nil
116
116
}
117
117
118
- func (f1 Fingerprint ) CompareTo (f2 Fingerprint ) FingerprintComparison {
118
+ func (f1 Fingerprint ) CompareTo (f2 Fingerprint , includeSurvived bool ) FingerprintComparison {
119
119
ret := FingerprintComparison {
120
120
GadgetDisplacements : map [Addr ]map [GadgetId ][]Offset {},
121
121
NewGadgets : map [GadgetId ][]Addr {},
@@ -124,16 +124,28 @@ func (f1 Fingerprint) CompareTo(f2 Fingerprint) FingerprintComparison {
124
124
125
125
for gadget , oldAddresses := range f1 {
126
126
newAddresses := f2 [gadget ]
127
- for i := 0 ; i < len (oldAddresses ); i ++ {
128
- oldAddress := oldAddresses [i ]
129
- offsets := make ([]Offset , len (newAddresses ))
130
- survived := false
131
- for j , newAddress := range newAddresses {
132
- offset := Offset (newAddress ) - Offset (oldAddress )
133
- if offset == 0 {
134
- survived = true
127
+ newAddressIndex := 0
128
+ survivedAddresses := map [Addr ]bool {}
129
+ for _ , oldAddress := range oldAddresses {
130
+ for newAddressIndex < len (newAddresses ) && oldAddress > newAddresses [newAddressIndex ] {
131
+ newAddressIndex ++
132
+ }
133
+ if newAddressIndex < len (newAddresses ) && oldAddress == newAddresses [newAddressIndex ] {
134
+ survivedAddresses [oldAddress ] = true
135
+ }
136
+ }
137
+ for _ , oldAddress := range oldAddresses {
138
+ survived := survivedAddresses [oldAddress ]
139
+ if (! includeSurvived ) && survived {
140
+ continue
141
+ }
142
+ var offsets []Offset
143
+ for _ , newAddress := range newAddresses {
144
+ if (! includeSurvived ) && survivedAddresses [newAddress ] {
145
+ continue
135
146
}
136
- offsets [j ] = offset
147
+ offset := Offset (newAddress ) - Offset (oldAddress )
148
+ offsets = append (offsets , offset )
137
149
ret .GadgetsByOffset [offset ]++
138
150
}
139
151
if survived {
0 commit comments