(b []byte, p unsafe.Pointer)
| 1265 | } |
| 1266 | |
| 1267 | func (d decoder) decodeInterface(b []byte, p unsafe.Pointer) ([]byte, error) { |
| 1268 | val := *(*any)(p) |
| 1269 | *(*any)(p) = nil |
| 1270 | |
| 1271 | if t := reflect.TypeOf(val); t != nil && t.Kind() == reflect.Ptr { |
| 1272 | if v := reflect.ValueOf(val); v.IsNil() || t.Elem().Kind() != reflect.Ptr { |
| 1273 | // If the destination is nil the only value that is OK to decode is |
| 1274 | // `null`, and the encoding/json package always nils the destination |
| 1275 | // interface value in this case. |
| 1276 | if hasNullPrefix(b) { |
| 1277 | *(*any)(p) = nil |
| 1278 | return b[4:], nil |
| 1279 | } |
| 1280 | } |
| 1281 | |
| 1282 | b, err := Parse(b, val, d.flags) |
| 1283 | if err == nil { |
| 1284 | *(*any)(p) = val |
| 1285 | } |
| 1286 | |
| 1287 | return b, err |
| 1288 | } |
| 1289 | |
| 1290 | v, b, k, err := d.parseValue(b) |
| 1291 | if err != nil { |
| 1292 | return b, err |
| 1293 | } |
| 1294 | |
| 1295 | switch k.Class() { |
| 1296 | case Object: |
| 1297 | m := make(map[string]interface{}) |
| 1298 | v, err = d.decodeMapStringInterface(v, unsafe.Pointer(&m)) |
| 1299 | val = m |
| 1300 | |
| 1301 | case Array: |
| 1302 | a := make([]interface{}, 0, 10) |
| 1303 | v, err = d.decodeSlice(v, unsafe.Pointer(&a), unsafe.Sizeof(a[0]), sliceInterfaceType, decoder.decodeInterface) |
| 1304 | val = a |
| 1305 | |
| 1306 | case String: |
| 1307 | s := "" |
| 1308 | v, err = d.decodeString(v, unsafe.Pointer(&s)) |
| 1309 | val = s |
| 1310 | |
| 1311 | case Null: |
| 1312 | v, val = nil, nil |
| 1313 | |
| 1314 | case Bool: |
| 1315 | v, val = nil, k == True |
| 1316 | |
| 1317 | case Num: |
| 1318 | v, err = d.decodeDynamicNumber(v, unsafe.Pointer(&val)) |
| 1319 | |
| 1320 | default: |
| 1321 | return b, syntaxError(v, "expected token but found '%c'", v[0]) |
| 1322 | } |
| 1323 | |
| 1324 | if err != nil { |
no test coverage detected