@@ -127,15 +127,16 @@ func (d *decoder) unmarshalBool(size uint, offset uint, result reflect.Value) (u
127
127
return 0 , err
128
128
}
129
129
switch result .Kind () {
130
- default :
131
- return newOffset , newUnmarshalTypeError (value , result .Type ())
132
130
case reflect .Bool :
133
131
result .SetBool (value )
134
132
return newOffset , nil
135
133
case reflect .Interface :
136
- result .Set (reflect .ValueOf (value ))
137
- return newOffset , nil
134
+ if result .NumMethod () == 0 {
135
+ result .Set (reflect .ValueOf (value ))
136
+ return newOffset , nil
137
+ }
138
138
}
139
+ return newOffset , newUnmarshalTypeError (value , result .Type ())
139
140
}
140
141
141
142
// follow pointers and create values as necessary
@@ -161,15 +162,16 @@ func (d *decoder) unmarshalBytes(size uint, offset uint, result reflect.Value) (
161
162
return 0 , err
162
163
}
163
164
switch result .Kind () {
164
- default :
165
- return newOffset , newUnmarshalTypeError (value , result .Type ())
166
165
case reflect .Slice :
167
166
result .SetBytes (value )
168
167
return newOffset , nil
169
168
case reflect .Interface :
170
- result .Set (reflect .ValueOf (value ))
171
- return newOffset , nil
169
+ if result .NumMethod () == 0 {
170
+ result .Set (reflect .ValueOf (value ))
171
+ return newOffset , nil
172
+ }
172
173
}
174
+ return newOffset , newUnmarshalTypeError (value , result .Type ())
173
175
}
174
176
175
177
func (d * decoder ) unmarshalFloat32 (size uint , offset uint , result reflect.Value ) (uint , error ) {
@@ -182,15 +184,16 @@ func (d *decoder) unmarshalFloat32(size uint, offset uint, result reflect.Value)
182
184
}
183
185
184
186
switch result .Kind () {
185
- default :
186
- return newOffset , newUnmarshalTypeError (value , result .Type ())
187
187
case reflect .Float32 , reflect .Float64 :
188
188
result .SetFloat (float64 (value ))
189
189
return newOffset , nil
190
190
case reflect .Interface :
191
- result .Set (reflect .ValueOf (value ))
192
- return newOffset , nil
191
+ if result .NumMethod () == 0 {
192
+ result .Set (reflect .ValueOf (value ))
193
+ return newOffset , nil
194
+ }
193
195
}
196
+ return newOffset , newUnmarshalTypeError (value , result .Type ())
194
197
}
195
198
196
199
func (d * decoder ) unmarshalFloat64 (size uint , offset uint , result reflect.Value ) (uint , error ) {
@@ -203,18 +206,19 @@ func (d *decoder) unmarshalFloat64(size uint, offset uint, result reflect.Value)
203
206
return 0 , err
204
207
}
205
208
switch result .Kind () {
206
- default :
207
- return newOffset , newUnmarshalTypeError (value , result .Type ())
208
209
case reflect .Float32 , reflect .Float64 :
209
210
if result .OverflowFloat (value ) {
210
211
return 0 , newUnmarshalTypeError (value , result .Type ())
211
212
}
212
213
result .SetFloat (value )
213
214
return newOffset , nil
214
215
case reflect .Interface :
215
- result .Set (reflect .ValueOf (value ))
216
- return newOffset , nil
216
+ if result .NumMethod () == 0 {
217
+ result .Set (reflect .ValueOf (value ))
218
+ return newOffset , nil
219
+ }
217
220
}
221
+ return newOffset , newUnmarshalTypeError (value , result .Type ())
218
222
}
219
223
220
224
func (d * decoder ) unmarshalInt32 (size uint , offset uint , result reflect.Value ) (uint , error ) {
@@ -227,26 +231,25 @@ func (d *decoder) unmarshalInt32(size uint, offset uint, result reflect.Value) (
227
231
}
228
232
229
233
switch result .Kind () {
230
- default :
231
- return newOffset , newUnmarshalTypeError (value , result .Type ())
232
234
case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
233
235
n := int64 (value )
234
- if result .OverflowInt (n ) {
235
- return 0 , newUnmarshalTypeError (value , result .Type ())
236
+ if ! result .OverflowInt (n ) {
237
+ result .SetInt (n )
238
+ return newOffset , nil
236
239
}
237
- result .SetInt (n )
238
- return newOffset , nil
239
240
case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 , reflect .Uintptr :
240
241
n := uint64 (value )
241
- if result .OverflowUint (n ) {
242
- return 0 , newUnmarshalTypeError (value , result .Type ())
242
+ if ! result .OverflowUint (n ) {
243
+ result .SetUint (n )
244
+ return newOffset , nil
243
245
}
244
- result .SetUint (n )
245
- return newOffset , nil
246
246
case reflect .Interface :
247
- result .Set (reflect .ValueOf (value ))
248
- return newOffset , nil
247
+ if result .NumMethod () == 0 {
248
+ result .Set (reflect .ValueOf (value ))
249
+ return newOffset , nil
250
+ }
249
251
}
252
+ return newOffset , newUnmarshalTypeError (value , result .Type ())
250
253
}
251
254
252
255
func (d * decoder ) unmarshalMap (size uint , offset uint , result reflect.Value ) (uint , error ) {
@@ -259,10 +262,13 @@ func (d *decoder) unmarshalMap(size uint, offset uint, result reflect.Value) (ui
259
262
case reflect .Map :
260
263
return d .decodeMap (size , offset , result )
261
264
case reflect .Interface :
262
- rv := reflect .ValueOf (make (map [string ]interface {}, size ))
263
- newOffset , err := d .decodeMap (size , offset , rv )
264
- result .Set (rv )
265
- return newOffset , err
265
+ if result .NumMethod () == 0 {
266
+ rv := reflect .ValueOf (make (map [string ]interface {}, size ))
267
+ newOffset , err := d .decodeMap (size , offset , rv )
268
+ result .Set (rv )
269
+ return newOffset , err
270
+ }
271
+ return 0 , newUnmarshalTypeError ("map" , result .Type ())
266
272
}
267
273
}
268
274
@@ -273,19 +279,19 @@ func (d *decoder) unmarshalPointer(size uint, offset uint, result reflect.Value)
273
279
}
274
280
275
281
func (d * decoder ) unmarshalSlice (size uint , offset uint , result reflect.Value ) (uint , error ) {
276
-
277
282
switch result .Kind () {
278
- default :
279
- return 0 , newUnmarshalTypeError ("array" , result .Type ())
280
283
case reflect .Slice :
281
284
return d .decodeSlice (size , offset , result )
282
285
case reflect .Interface :
283
- a := []interface {}{}
284
- rv := reflect .ValueOf (& a ).Elem ()
285
- newOffset , err := d .decodeSlice (size , offset , rv )
286
- result .Set (rv )
287
- return newOffset , err
286
+ if result .NumMethod () == 0 {
287
+ a := []interface {}{}
288
+ rv := reflect .ValueOf (& a ).Elem ()
289
+ newOffset , err := d .decodeSlice (size , offset , rv )
290
+ result .Set (rv )
291
+ return newOffset , err
292
+ }
288
293
}
294
+ return 0 , newUnmarshalTypeError ("array" , result .Type ())
289
295
}
290
296
291
297
func (d * decoder ) unmarshalString (size uint , offset uint , result reflect.Value ) (uint , error ) {
@@ -295,15 +301,17 @@ func (d *decoder) unmarshalString(size uint, offset uint, result reflect.Value)
295
301
return 0 , err
296
302
}
297
303
switch result .Kind () {
298
- default :
299
- return newOffset , newUnmarshalTypeError (value , result .Type ())
300
304
case reflect .String :
301
305
result .SetString (value )
302
306
return newOffset , nil
303
307
case reflect .Interface :
304
- result .Set (reflect .ValueOf (value ))
305
- return newOffset , nil
308
+ if result .NumMethod () == 0 {
309
+ result .Set (reflect .ValueOf (value ))
310
+ return newOffset , nil
311
+ }
306
312
}
313
+ return newOffset , newUnmarshalTypeError (value , result .Type ())
314
+
307
315
}
308
316
309
317
func (d * decoder ) unmarshalUint (size uint , offset uint , result reflect.Value , uintType uint ) (uint , error ) {
@@ -317,25 +325,24 @@ func (d *decoder) unmarshalUint(size uint, offset uint, result reflect.Value, ui
317
325
}
318
326
319
327
switch result .Kind () {
320
- default :
321
- return newOffset , newUnmarshalTypeError (value , result .Type ())
322
328
case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
323
329
n := int64 (value )
324
- if result .OverflowInt (n ) {
325
- return 0 , newUnmarshalTypeError (value , result .Type ())
330
+ if ! result .OverflowInt (n ) {
331
+ result .SetInt (n )
332
+ return newOffset , nil
326
333
}
327
- result .SetInt (n )
328
- return newOffset , nil
329
334
case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 , reflect .Uintptr :
330
- if result .OverflowUint (value ) {
331
- return 0 , newUnmarshalTypeError (value , result .Type ())
335
+ if ! result .OverflowUint (value ) {
336
+ result .SetUint (value )
337
+ return newOffset , nil
332
338
}
333
- result .SetUint (value )
334
- return newOffset , nil
335
339
case reflect .Interface :
336
- result .Set (reflect .ValueOf (value ))
337
- return newOffset , nil
340
+ if result .NumMethod () == 0 {
341
+ result .Set (reflect .ValueOf (value ))
342
+ return newOffset , nil
343
+ }
338
344
}
345
+ return newOffset , newUnmarshalTypeError (value , result .Type ())
339
346
}
340
347
341
348
func (d * decoder ) unmarshalUint128 (size uint , offset uint , result reflect.Value ) (uint , error ) {
@@ -347,18 +354,17 @@ func (d *decoder) unmarshalUint128(size uint, offset uint, result reflect.Value)
347
354
return 0 , err
348
355
}
349
356
350
- // XXX - this should allow *big.Int rather than just bigInt
351
- // Currently this is reported as invalid
352
357
switch result .Kind () {
353
- default :
354
- return newOffset , newUnmarshalTypeError (value , result .Type ())
355
358
case reflect .Struct :
356
359
result .Set (reflect .ValueOf (* value ))
357
360
return newOffset , nil
358
- case reflect .Interface , reflect .Ptr :
359
- result .Set (reflect .ValueOf (value ))
360
- return newOffset , nil
361
+ case reflect .Interface :
362
+ if result .NumMethod () == 0 {
363
+ result .Set (reflect .ValueOf (value ))
364
+ return newOffset , nil
365
+ }
361
366
}
367
+ return newOffset , newUnmarshalTypeError (value , result .Type ())
362
368
}
363
369
364
370
func (d * decoder ) decodeBool (size uint , offset uint ) (bool , uint , error ) {
0 commit comments