MCPcopy Index your code
hub / github.com/segmentio/encoding / decodeDynamicNumber

Method decodeDynamicNumber

json/decode.go:1336–1396  ·  view source on GitHub ↗
(b []byte, p unsafe.Pointer)

Source from the content-addressed store, hash-verified

1334}
1335
1336func (d decoder) decodeDynamicNumber(b []byte, p unsafe.Pointer) ([]byte, error) {
1337 kind := Float
1338 var err error
1339
1340 // Only pre-parse for numeric kind if a conditional decode
1341 // has been requested.
1342 if d.anyFlagsSet(UseBigInt | UseInt64 | UseUint64) {
1343 _, _, kind, err = d.parseNumber(b)
1344 if err != nil {
1345 return b, err
1346 }
1347 }
1348
1349 var rem []byte
1350 anyPtr := (*any)(p)
1351
1352 // Mutually exclusive integer handling cases.
1353 switch {
1354 // If requested, attempt decode of positive integers as uint64.
1355 case kind == Uint && d.anyFlagsSet(UseUint64):
1356 rem, err = decodeInto[uint64](anyPtr, b, d, decoder.decodeUint64)
1357 if err == nil {
1358 return rem, err
1359 }
1360
1361 // If uint64 decode was not requested but int64 decode was requested,
1362 // then attempt decode of positive integers as int64.
1363 case kind == Uint && d.anyFlagsSet(UseInt64):
1364 fallthrough
1365
1366 // If int64 decode was requested,
1367 // attempt decode of negative integers as int64.
1368 case kind == Int && d.anyFlagsSet(UseInt64):
1369 rem, err = decodeInto[int64](anyPtr, b, d, decoder.decodeInt64)
1370 if err == nil {
1371 return rem, err
1372 }
1373 }
1374
1375 // Fallback numeric handling cases:
1376 // these cannot be combined into the above switch,
1377 // since these cases also handle overflow
1378 // from the above cases, if decode was already attempted.
1379 switch {
1380 // If *big.Int decode was requested, handle that case for any integer.
1381 case kind == Uint && d.anyFlagsSet(UseBigInt):
1382 fallthrough
1383 case kind == Int && d.anyFlagsSet(UseBigInt):
1384 rem, err = decodeInto[*big.Int](anyPtr, b, d, bigIntDecoder)
1385
1386 // If json.Number decode was requested, handle that for any number.
1387 case d.anyFlagsSet(UseNumber):
1388 rem, err = decodeInto[Number](anyPtr, b, d, decoder.decodeNumber)
1389
1390 // Fall back to float64 decode when no special decoding has been requested.
1391 default:
1392 rem, err = decodeInto[float64](anyPtr, b, d, decoder.decodeFloat64)
1393 }

Callers 1

decodeInterfaceMethod · 0.95

Calls 3

anyFlagsSetMethod · 0.95
parseNumberMethod · 0.95
decodeIntoFunction · 0.85

Tested by

no test coverage detected