Skip to content

Commit bfa3640

Browse files
authored
Merge pull request #55 from cuonglm/cuonglm/do-not-use-reflect-SliceHeader
Make "go test -gcflags=-d=checkptr" passes
2 parents 71cddb3 + 6b1d701 commit bfa3640

13 files changed

+222
-194
lines changed

decode.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func (d *Decoder) decode(src []byte, header *interfaceHeader) error {
8585
typeptr := uintptr(unsafe.Pointer(typ))
8686

8787
// noescape trick for header.typ ( reflect.*rtype )
88-
copiedType := (*rtype)(unsafe.Pointer(typeptr))
88+
copiedType := *(**rtype)(unsafe.Pointer(&typeptr))
8989
ptr := uintptr(header.ptr)
9090

9191
if err := d.validateType(copiedType, ptr); err != nil {
@@ -150,7 +150,7 @@ func (d *Decoder) Decode(v interface{}) error {
150150
ptr := uintptr(header.ptr)
151151
typeptr := uintptr(unsafe.Pointer(typ))
152152
// noescape trick for header.typ ( reflect.*rtype )
153-
copiedType := (*rtype)(unsafe.Pointer(typeptr))
153+
copiedType := *(**rtype)(unsafe.Pointer(&typeptr))
154154

155155
if err := d.validateType(copiedType, ptr); err != nil {
156156
return err

decode_bool.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ func (d *boolDecoder) decodeStream(s *stream, p uintptr) error {
6666
if err := trueBytes(s); err != nil {
6767
return err
6868
}
69-
*(*bool)(unsafe.Pointer(p)) = true
69+
**(**bool)(unsafe.Pointer(&p)) = true
7070
return nil
7171
case 'f':
7272
if err := falseBytes(s); err != nil {
7373
return err
7474
}
75-
*(*bool)(unsafe.Pointer(p)) = false
75+
**(**bool)(unsafe.Pointer(&p)) = false
7676
return nil
7777
case nul:
7878
if s.read() {
@@ -104,7 +104,7 @@ func (d *boolDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, error)
104104
return 0, errInvalidCharacter(buf[cursor+3], "bool(true)", cursor)
105105
}
106106
cursor += 4
107-
*(*bool)(unsafe.Pointer(p)) = true
107+
**(**bool)(unsafe.Pointer(&p)) = true
108108
return cursor, nil
109109
case 'f':
110110
if cursor+4 >= buflen {
@@ -123,7 +123,7 @@ func (d *boolDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, error)
123123
return 0, errInvalidCharacter(buf[cursor+4], "bool(false)", cursor)
124124
}
125125
cursor += 5
126-
*(*bool)(unsafe.Pointer(p)) = false
126+
**(**bool)(unsafe.Pointer(&p)) = false
127127
return cursor, nil
128128
}
129129
return 0, errUnexpectedEndOfJSON("bool", cursor)

decode_compile.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,73 +89,73 @@ func (d *Decoder) compilePtr(typ *rtype) (decoder, error) {
8989

9090
func (d *Decoder) compileInt() (decoder, error) {
9191
return newIntDecoder(func(p uintptr, v int64) {
92-
*(*int)(unsafe.Pointer(p)) = int(v)
92+
**(**int)(unsafe.Pointer(&p)) = int(v)
9393
}), nil
9494
}
9595

9696
func (d *Decoder) compileInt8() (decoder, error) {
9797
return newIntDecoder(func(p uintptr, v int64) {
98-
*(*int8)(unsafe.Pointer(p)) = int8(v)
98+
**(**int8)(unsafe.Pointer(&p)) = int8(v)
9999
}), nil
100100
}
101101

102102
func (d *Decoder) compileInt16() (decoder, error) {
103103
return newIntDecoder(func(p uintptr, v int64) {
104-
*(*int16)(unsafe.Pointer(p)) = int16(v)
104+
**(**int16)(unsafe.Pointer(&p)) = int16(v)
105105
}), nil
106106
}
107107

108108
func (d *Decoder) compileInt32() (decoder, error) {
109109
return newIntDecoder(func(p uintptr, v int64) {
110-
*(*int32)(unsafe.Pointer(p)) = int32(v)
110+
**(**int32)(unsafe.Pointer(&p)) = int32(v)
111111
}), nil
112112
}
113113

114114
func (d *Decoder) compileInt64() (decoder, error) {
115115
return newIntDecoder(func(p uintptr, v int64) {
116-
*(*int64)(unsafe.Pointer(p)) = v
116+
**(**int64)(unsafe.Pointer(&p)) = v
117117
}), nil
118118
}
119119

120120
func (d *Decoder) compileUint() (decoder, error) {
121121
return newUintDecoder(func(p uintptr, v uint64) {
122-
*(*uint)(unsafe.Pointer(p)) = uint(v)
122+
**(**uint)(unsafe.Pointer(&p)) = uint(v)
123123
}), nil
124124
}
125125

126126
func (d *Decoder) compileUint8() (decoder, error) {
127127
return newUintDecoder(func(p uintptr, v uint64) {
128-
*(*uint8)(unsafe.Pointer(p)) = uint8(v)
128+
**(**uint8)(unsafe.Pointer(&p)) = uint8(v)
129129
}), nil
130130
}
131131

132132
func (d *Decoder) compileUint16() (decoder, error) {
133133
return newUintDecoder(func(p uintptr, v uint64) {
134-
*(*uint16)(unsafe.Pointer(p)) = uint16(v)
134+
**(**uint16)(unsafe.Pointer(&p)) = uint16(v)
135135
}), nil
136136
}
137137

138138
func (d *Decoder) compileUint32() (decoder, error) {
139139
return newUintDecoder(func(p uintptr, v uint64) {
140-
*(*uint32)(unsafe.Pointer(p)) = uint32(v)
140+
**(**uint32)(unsafe.Pointer(&p)) = uint32(v)
141141
}), nil
142142
}
143143

144144
func (d *Decoder) compileUint64() (decoder, error) {
145145
return newUintDecoder(func(p uintptr, v uint64) {
146-
*(*uint64)(unsafe.Pointer(p)) = v
146+
**(**uint64)(unsafe.Pointer(&p)) = v
147147
}), nil
148148
}
149149

150150
func (d *Decoder) compileFloat32() (decoder, error) {
151151
return newFloatDecoder(func(p uintptr, v float64) {
152-
*(*float32)(unsafe.Pointer(p)) = float32(v)
152+
**(**float32)(unsafe.Pointer(&p)) = float32(v)
153153
}), nil
154154
}
155155

156156
func (d *Decoder) compileFloat64() (decoder, error) {
157157
return newFloatDecoder(func(p uintptr, v float64) {
158-
*(*float64)(unsafe.Pointer(p)) = v
158+
**(**float64)(unsafe.Pointer(&p)) = v
159159
}), nil
160160
}
161161

decode_interface.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ func newInterfaceDecoder(typ *rtype) *interfaceDecoder {
1919
func (d *interfaceDecoder) numDecoder(s *stream) decoder {
2020
if s.useNumber {
2121
return newNumberDecoder(func(p uintptr, v Number) {
22-
*(*interface{})(unsafe.Pointer(p)) = v
22+
**(**interface{})(unsafe.Pointer(&p)) = v
2323
})
2424
}
2525
return newFloatDecoder(func(p uintptr, v float64) {
26-
*(*interface{})(unsafe.Pointer(p)) = v
26+
**(**interface{})(unsafe.Pointer(&p)) = v
2727
})
2828
}
2929

@@ -48,7 +48,7 @@ func (d *interfaceDecoder) decodeStream(s *stream, p uintptr) error {
4848
).decodeStream(s, uintptr(ptr)); err != nil {
4949
return err
5050
}
51-
*(*interface{})(unsafe.Pointer(p)) = v
51+
**(**interface{})(unsafe.Pointer(&p)) = v
5252
return nil
5353
case '[':
5454
var v []interface{}
@@ -61,7 +61,7 @@ func (d *interfaceDecoder) decodeStream(s *stream, p uintptr) error {
6161
).decodeStream(s, uintptr(ptr)); err != nil {
6262
return err
6363
}
64-
*(*interface{})(unsafe.Pointer(p)) = v
64+
**(**interface{})(unsafe.Pointer(&p)) = v
6565
return nil
6666
case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
6767
return d.numDecoder(s).decodeStream(s, p)
@@ -77,7 +77,7 @@ func (d *interfaceDecoder) decodeStream(s *stream, p uintptr) error {
7777
case '"':
7878
literal := s.buf[start:s.cursor]
7979
s.cursor++
80-
*(*interface{})(unsafe.Pointer(p)) = *(*string)(unsafe.Pointer(&literal))
80+
**(**interface{})(unsafe.Pointer(&p)) = *(*string)(unsafe.Pointer(&literal))
8181
return nil
8282
case nul:
8383
if s.read() {
@@ -92,19 +92,19 @@ func (d *interfaceDecoder) decodeStream(s *stream, p uintptr) error {
9292
if err := trueBytes(s); err != nil {
9393
return err
9494
}
95-
*(*interface{})(unsafe.Pointer(p)) = true
95+
**(**interface{})(unsafe.Pointer(&p)) = true
9696
return nil
9797
case 'f':
9898
if err := falseBytes(s); err != nil {
9999
return err
100100
}
101-
*(*interface{})(unsafe.Pointer(p)) = false
101+
**(**interface{})(unsafe.Pointer(&p)) = false
102102
return nil
103103
case 'n':
104104
if err := nullBytes(s); err != nil {
105105
return err
106106
}
107-
*(*interface{})(unsafe.Pointer(p)) = nil
107+
**(**interface{})(unsafe.Pointer(&p)) = nil
108108
return nil
109109
case nul:
110110
if s.read() {
@@ -132,7 +132,7 @@ func (d *interfaceDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, e
132132
if err != nil {
133133
return 0, err
134134
}
135-
*(*interface{})(unsafe.Pointer(p)) = v
135+
**(**interface{})(unsafe.Pointer(&p)) = v
136136
return cursor, nil
137137
case '[':
138138
var v []interface{}
@@ -147,11 +147,11 @@ func (d *interfaceDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, e
147147
if err != nil {
148148
return 0, err
149149
}
150-
*(*interface{})(unsafe.Pointer(p)) = v
150+
**(**interface{})(unsafe.Pointer(&p)) = v
151151
return cursor, nil
152152
case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
153153
return newFloatDecoder(func(p uintptr, v float64) {
154-
*(*interface{})(unsafe.Pointer(p)) = v
154+
**(**interface{})(unsafe.Pointer(&p)) = v
155155
}).decode(buf, cursor, p)
156156
case '"':
157157
cursor++
@@ -163,7 +163,7 @@ func (d *interfaceDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, e
163163
case '"':
164164
literal := buf[start:cursor]
165165
cursor++
166-
*(*interface{})(unsafe.Pointer(p)) = *(*string)(unsafe.Pointer(&literal))
166+
**(**interface{})(unsafe.Pointer(&p)) = *(*string)(unsafe.Pointer(&literal))
167167
return cursor, nil
168168
case nul:
169169
return 0, errUnexpectedEndOfJSON("string", cursor)
@@ -185,7 +185,7 @@ func (d *interfaceDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, e
185185
return 0, errInvalidCharacter(buf[cursor+3], "bool(true)", cursor)
186186
}
187187
cursor += 4
188-
*(*interface{})(unsafe.Pointer(p)) = true
188+
**(**interface{})(unsafe.Pointer(&p)) = true
189189
return cursor, nil
190190
case 'f':
191191
if cursor+4 >= int64(len(buf)) {
@@ -204,7 +204,7 @@ func (d *interfaceDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, e
204204
return 0, errInvalidCharacter(buf[cursor+4], "bool(false)", cursor)
205205
}
206206
cursor += 5
207-
*(*interface{})(unsafe.Pointer(p)) = false
207+
**(**interface{})(unsafe.Pointer(&p)) = false
208208
return cursor, nil
209209
case 'n':
210210
if cursor+3 >= int64(len(buf)) {
@@ -220,7 +220,7 @@ func (d *interfaceDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, e
220220
return 0, errInvalidCharacter(buf[cursor+3], "null", cursor)
221221
}
222222
cursor += 4
223-
*(*interface{})(unsafe.Pointer(p)) = nil
223+
**(**interface{})(unsafe.Pointer(&p)) = nil
224224
return cursor, nil
225225
}
226226
return cursor, errNotAtBeginningOfValue(cursor)

decode_map.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func (d *mapDecoder) decodeStream(s *stream, p uintptr) error {
6565
s.skipWhiteSpace()
6666
mapValue := makemap(d.mapType, 0)
6767
if s.buf[s.cursor+1] == '}' {
68-
*(*unsafe.Pointer)(unsafe.Pointer(p)) = mapValue
68+
**(**unsafe.Pointer)(unsafe.Pointer(&p)) = mapValue
6969
s.cursor++
7070
return nil
7171
}
@@ -96,7 +96,7 @@ func (d *mapDecoder) decodeStream(s *stream, p uintptr) error {
9696
s.read()
9797
}
9898
if s.char() == '}' {
99-
*(*unsafe.Pointer)(unsafe.Pointer(p)) = mapValue
99+
**(**unsafe.Pointer)(unsafe.Pointer(&p)) = mapValue
100100
s.cursor++
101101
return nil
102102
}
@@ -137,7 +137,7 @@ func (d *mapDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, error)
137137
cursor = skipWhiteSpace(buf, cursor)
138138
mapValue := makemap(d.mapType, 0)
139139
if buf[cursor] == '}' {
140-
*(*unsafe.Pointer)(unsafe.Pointer(p)) = mapValue
140+
**(**unsafe.Pointer)(unsafe.Pointer(&p)) = mapValue
141141
cursor++
142142
return cursor, nil
143143
}
@@ -165,7 +165,7 @@ func (d *mapDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, error)
165165
mapassign(d.mapType, mapValue, unsafe.Pointer(&key), unsafe.Pointer(&value))
166166
cursor = skipWhiteSpace(buf, valueCursor)
167167
if buf[cursor] == '}' {
168-
*(*unsafe.Pointer)(unsafe.Pointer(p)) = mapValue
168+
**(**unsafe.Pointer)(unsafe.Pointer(&p)) = mapValue
169169
cursor++
170170
return cursor, nil
171171
}

decode_ptr.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func (d *ptrDecoder) decodeStream(s *stream, p uintptr) error {
2121
if err := d.dec.decodeStream(s, newptr); err != nil {
2222
return err
2323
}
24-
*(*uintptr)(unsafe.Pointer(p)) = newptr
24+
**(**uintptr)(unsafe.Pointer(&p)) = newptr
2525
return nil
2626
}
2727

@@ -32,6 +32,6 @@ func (d *ptrDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, error)
3232
return 0, err
3333
}
3434
cursor = c
35-
*(*uintptr)(unsafe.Pointer(p)) = newptr
35+
**(**uintptr)(unsafe.Pointer(&p)) = newptr
3636
return cursor, nil
3737
}

0 commit comments

Comments
 (0)