@@ -101,10 +101,11 @@ func (d *sliceDecoder) decodeStream(s *stream, depth int64, p unsafe.Pointer) er
101
101
s .cursor ++
102
102
s .skipWhiteSpace ()
103
103
if s .char () == ']' {
104
- * (* sliceHeader )(p ) = sliceHeader {
105
- data : newArray (d .elemType , 0 ),
106
- len : 0 ,
107
- cap : 0 ,
104
+ dst := (* sliceHeader )(p )
105
+ if dst .data == nil {
106
+ dst .data = newArray (d .elemType , 0 )
107
+ } else {
108
+ dst .len = 0
108
109
}
109
110
s .cursor ++
110
111
return nil
@@ -138,18 +139,13 @@ func (d *sliceDecoder) decodeStream(s *stream, depth int64, p unsafe.Pointer) er
138
139
slice .cap = capacity
139
140
slice .len = idx + 1
140
141
slice .data = data
141
- dstCap := idx + 1
142
- dst := sliceHeader {
143
- data : newArray ( d . elemType , dstCap ),
144
- len : idx + 1 ,
145
- cap : dstCap ,
142
+ dst := ( * sliceHeader )( p )
143
+ dst . len = idx + 1
144
+ if dst . len > dst . cap {
145
+ dst . data = newArray ( d . elemType , dst . len )
146
+ dst . cap = dst . len
146
147
}
147
- copySlice (d .elemType , dst , sliceHeader {
148
- data : slice .data ,
149
- len : slice .len ,
150
- cap : slice .cap ,
151
- })
152
- * (* sliceHeader )(p ) = dst
148
+ copySlice (d .elemType , * dst , * slice )
153
149
d .releaseSlice (slice )
154
150
s .cursor ++
155
151
return nil
@@ -218,10 +214,11 @@ func (d *sliceDecoder) decode(buf []byte, cursor, depth int64, p unsafe.Pointer)
218
214
cursor ++
219
215
cursor = skipWhiteSpace (buf , cursor )
220
216
if buf [cursor ] == ']' {
221
- * * (* * sliceHeader )(unsafe .Pointer (& p )) = sliceHeader {
222
- data : newArray (d .elemType , 0 ),
223
- len : 0 ,
224
- cap : 0 ,
217
+ dst := (* sliceHeader )(p )
218
+ if dst .data == nil {
219
+ dst .data = newArray (d .elemType , 0 )
220
+ } else {
221
+ dst .len = 0
225
222
}
226
223
cursor ++
227
224
return cursor , nil
@@ -256,18 +253,13 @@ func (d *sliceDecoder) decode(buf []byte, cursor, depth int64, p unsafe.Pointer)
256
253
slice .cap = capacity
257
254
slice .len = idx + 1
258
255
slice .data = data
259
- dstCap := idx + 1
260
- dst := sliceHeader {
261
- data : newArray ( d . elemType , dstCap ),
262
- len : idx + 1 ,
263
- cap : dstCap ,
256
+ dst := ( * sliceHeader )( p )
257
+ dst . len = idx + 1
258
+ if dst . len > dst . cap {
259
+ dst . data = newArray ( d . elemType , dst . len )
260
+ dst . cap = dst . len
264
261
}
265
- copySlice (d .elemType , dst , sliceHeader {
266
- data : slice .data ,
267
- len : slice .len ,
268
- cap : slice .cap ,
269
- })
270
- * * (* * sliceHeader )(unsafe .Pointer (& p )) = dst
262
+ copySlice (d .elemType , * dst , * slice )
271
263
d .releaseSlice (slice )
272
264
cursor ++
273
265
return cursor , nil
0 commit comments