@@ -3,7 +3,6 @@ package diff
3
3
import (
4
4
"errors"
5
5
"reflect"
6
- "unsafe"
7
6
)
8
7
9
8
// ErrCyclic is returned when one of the compared values contain circular references
@@ -12,41 +11,41 @@ var ErrCyclic = errors.New("circular references not supported")
12
11
// visited is used to detect cyclic structures.
13
12
// It is not safe for concurent use.
14
13
type visited struct {
15
- lhs []unsafe. Pointer
16
- rhs []unsafe. Pointer
14
+ lhs []uintptr
15
+ rhs []uintptr
17
16
}
18
17
19
18
// add will try to add the value's pointers to the list. It will return an error
20
19
// if the value is already in the list.
21
20
// visited.remove should be called whether an error occured or not.
22
21
func (v * visited ) add (lhs , rhs reflect.Value ) error {
23
22
if canAddr (lhs ) && ! isEmptyMapOrSlice (lhs ) {
24
- if inPointers (v .lhs , unsafe . Pointer ( lhs .Pointer () )) {
23
+ if inPointers (v .lhs , lhs .Pointer ()) {
25
24
return ErrCyclic
26
25
}
27
- v .lhs = append (v .lhs , unsafe . Pointer ( lhs .Pointer () ))
26
+ v .lhs = append (v .lhs , lhs .Pointer ())
28
27
}
29
28
if canAddr (rhs ) && ! isEmptyMapOrSlice (rhs ) {
30
- if inPointers (v .rhs , unsafe . Pointer ( rhs .Pointer () )) {
29
+ if inPointers (v .rhs , rhs .Pointer ()) {
31
30
return ErrCyclic
32
31
}
33
- v .rhs = append (v .rhs , unsafe . Pointer ( rhs .Pointer () ))
32
+ v .rhs = append (v .rhs , rhs .Pointer ())
34
33
}
35
34
36
35
return nil
37
36
}
38
37
39
38
func (v * visited ) remove (lhs , rhs reflect.Value ) {
40
- if canAddr (lhs ) && isLastPointer (v .lhs , unsafe . Pointer ( lhs .Pointer () )) {
39
+ if canAddr (lhs ) && isLastPointer (v .lhs , lhs .Pointer ()) {
41
40
v .lhs = v .lhs [:len (v .lhs )- 1 ]
42
41
}
43
42
44
- if canAddr (rhs ) && isLastPointer (v .rhs , unsafe . Pointer ( rhs .Pointer () )) {
43
+ if canAddr (rhs ) && isLastPointer (v .rhs , rhs .Pointer ()) {
45
44
v .rhs = v .rhs [:len (v .rhs )- 1 ]
46
45
}
47
46
}
48
47
49
- func isLastPointer (pointers []unsafe. Pointer , val unsafe. Pointer ) bool {
48
+ func isLastPointer (pointers []uintptr , val uintptr ) bool {
50
49
if len (pointers ) == 0 {
51
50
return false
52
51
}
@@ -59,7 +58,7 @@ func isEmptyMapOrSlice(v reflect.Value) bool {
59
58
return (v .Kind () == reflect .Slice || v .Kind () == reflect .Map ) && v .Len () == 0
60
59
}
61
60
62
- func inPointers (pointers []unsafe. Pointer , val unsafe. Pointer ) bool {
61
+ func inPointers (pointers []uintptr , val uintptr ) bool {
63
62
for _ , lhs := range pointers {
64
63
if lhs == val {
65
64
return true
0 commit comments