Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit b69943d

Browse files
committedAug 13, 2020
Fix slice pointer
1 parent 5ea40da commit b69943d

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed
 

‎src/encoding/json/encode.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,9 @@ func (se sliceEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
871871
if e.ptrLevel++; e.ptrLevel > startDetectingCyclesAfter {
872872
// We're a large number of nested ptrEncoder.encode calls deep;
873873
// start checking if we've run into a pointer cycle.
874-
ptr := v.Pointer()
874+
p := reflect.New(reflect.TypeOf(v))
875+
p.Elem().Set(reflect.ValueOf(v))
876+
ptr := p.Pointer()
875877
if _, ok := e.ptrSeen[ptr]; ok {
876878
e.error(&UnsupportedValueError{v, fmt.Sprintf("encountered a cycle via %s", v.Type())})
877879
}

‎src/encoding/json/encode_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ var (
187187
pointerCycleIndirect = &PointerCycleIndirect{}
188188
mapCycle = make(map[string]interface{})
189189
sliceCycle = []interface{}{nil}
190+
sliceNoCycle = []interface{}{nil, nil}
190191
)
191192

192193
func init() {
@@ -199,6 +200,10 @@ func init() {
199200

200201
mapCycle["x"] = mapCycle
201202
sliceCycle[0] = sliceCycle
203+
sliceNoCycle[1] = sliceNoCycle[:1]
204+
for i := startDetectingCyclesAfter; i > 0; i-- {
205+
sliceNoCycle = []interface{}{sliceNoCycle}
206+
}
202207
}
203208

204209
func TestSamePointerNoCycle(t *testing.T) {
@@ -207,6 +212,12 @@ func TestSamePointerNoCycle(t *testing.T) {
207212
}
208213
}
209214

215+
func TestSliceNoCycle(t *testing.T) {
216+
if _, err := Marshal(sliceNoCycle); err != nil {
217+
t.Fatalf("unexpected error: %v", err)
218+
}
219+
}
220+
210221
var unsupportedValues = []interface{}{
211222
math.NaN(),
212223
math.Inf(-1),

0 commit comments

Comments
 (0)
Please sign in to comment.