mirror of
https://github.com/json-iterator/go.git
synced 2025-06-06 22:36:25 +02:00
do not use defer() in read int
This commit is contained in:
parent
d2a7335211
commit
13f86432b8
@ -113,13 +113,9 @@ func (iter *Iterator) ReadUint32() (ret uint32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) readUint32(c byte) (ret uint32) {
|
func (iter *Iterator) readUint32(c byte) (ret uint32) {
|
||||||
defer func() {
|
|
||||||
if iter.head < len(iter.buf) && iter.buf[iter.head] == '.' {
|
|
||||||
iter.ReportError("readUint32", "can not decode float as int")
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
ind := intDigits[c]
|
ind := intDigits[c]
|
||||||
if ind == 0 {
|
if ind == 0 {
|
||||||
|
iter.assertInteger()
|
||||||
return 0 // single zero
|
return 0 // single zero
|
||||||
}
|
}
|
||||||
if ind == invalidCharForNumber {
|
if ind == invalidCharForNumber {
|
||||||
@ -132,12 +128,14 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) {
|
|||||||
ind2 := intDigits[iter.buf[i]]
|
ind2 := intDigits[iter.buf[i]]
|
||||||
if ind2 == invalidCharForNumber {
|
if ind2 == invalidCharForNumber {
|
||||||
iter.head = i
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
ind3 := intDigits[iter.buf[i]]
|
ind3 := intDigits[iter.buf[i]]
|
||||||
if ind3 == invalidCharForNumber {
|
if ind3 == invalidCharForNumber {
|
||||||
iter.head = i
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
return value*10 + uint32(ind2)
|
return value*10 + uint32(ind2)
|
||||||
}
|
}
|
||||||
//iter.head = i + 1
|
//iter.head = i + 1
|
||||||
@ -146,30 +144,35 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) {
|
|||||||
ind4 := intDigits[iter.buf[i]]
|
ind4 := intDigits[iter.buf[i]]
|
||||||
if ind4 == invalidCharForNumber {
|
if ind4 == invalidCharForNumber {
|
||||||
iter.head = i
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
return value*100 + uint32(ind2)*10 + uint32(ind3)
|
return value*100 + uint32(ind2)*10 + uint32(ind3)
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
ind5 := intDigits[iter.buf[i]]
|
ind5 := intDigits[iter.buf[i]]
|
||||||
if ind5 == invalidCharForNumber {
|
if ind5 == invalidCharForNumber {
|
||||||
iter.head = i
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
return value*1000 + uint32(ind2)*100 + uint32(ind3)*10 + uint32(ind4)
|
return value*1000 + uint32(ind2)*100 + uint32(ind3)*10 + uint32(ind4)
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
ind6 := intDigits[iter.buf[i]]
|
ind6 := intDigits[iter.buf[i]]
|
||||||
if ind6 == invalidCharForNumber {
|
if ind6 == invalidCharForNumber {
|
||||||
iter.head = i
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
return value*10000 + uint32(ind2)*1000 + uint32(ind3)*100 + uint32(ind4)*10 + uint32(ind5)
|
return value*10000 + uint32(ind2)*1000 + uint32(ind3)*100 + uint32(ind4)*10 + uint32(ind5)
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
ind7 := intDigits[iter.buf[i]]
|
ind7 := intDigits[iter.buf[i]]
|
||||||
if ind7 == invalidCharForNumber {
|
if ind7 == invalidCharForNumber {
|
||||||
iter.head = i
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
return value*100000 + uint32(ind2)*10000 + uint32(ind3)*1000 + uint32(ind4)*100 + uint32(ind5)*10 + uint32(ind6)
|
return value*100000 + uint32(ind2)*10000 + uint32(ind3)*1000 + uint32(ind4)*100 + uint32(ind5)*10 + uint32(ind6)
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
ind8 := intDigits[iter.buf[i]]
|
ind8 := intDigits[iter.buf[i]]
|
||||||
if ind8 == invalidCharForNumber {
|
if ind8 == invalidCharForNumber {
|
||||||
iter.head = i
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
return value*1000000 + uint32(ind2)*100000 + uint32(ind3)*10000 + uint32(ind4)*1000 + uint32(ind5)*100 + uint32(ind6)*10 + uint32(ind7)
|
return value*1000000 + uint32(ind2)*100000 + uint32(ind3)*10000 + uint32(ind4)*1000 + uint32(ind5)*100 + uint32(ind6)*10 + uint32(ind7)
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
@ -177,6 +180,7 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) {
|
|||||||
value = value*10000000 + uint32(ind2)*1000000 + uint32(ind3)*100000 + uint32(ind4)*10000 + uint32(ind5)*1000 + uint32(ind6)*100 + uint32(ind7)*10 + uint32(ind8)
|
value = value*10000000 + uint32(ind2)*1000000 + uint32(ind3)*100000 + uint32(ind4)*10000 + uint32(ind5)*1000 + uint32(ind6)*100 + uint32(ind7)*10 + uint32(ind8)
|
||||||
iter.head = i
|
iter.head = i
|
||||||
if ind9 == invalidCharForNumber {
|
if ind9 == invalidCharForNumber {
|
||||||
|
iter.assertInteger()
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -185,6 +189,7 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) {
|
|||||||
ind = intDigits[iter.buf[i]]
|
ind = intDigits[iter.buf[i]]
|
||||||
if ind == invalidCharForNumber {
|
if ind == invalidCharForNumber {
|
||||||
iter.head = i
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
if value > uint32SafeToMultiply10 {
|
if value > uint32SafeToMultiply10 {
|
||||||
@ -199,6 +204,7 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) {
|
|||||||
value = (value << 3) + (value << 1) + uint32(ind)
|
value = (value << 3) + (value << 1) + uint32(ind)
|
||||||
}
|
}
|
||||||
if !iter.loadMore() {
|
if !iter.loadMore() {
|
||||||
|
iter.assertInteger()
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -229,13 +235,9 @@ func (iter *Iterator) ReadUint64() uint64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) readUint64(c byte) (ret uint64) {
|
func (iter *Iterator) readUint64(c byte) (ret uint64) {
|
||||||
defer func() {
|
|
||||||
if iter.head < len(iter.buf) && iter.buf[iter.head] == '.' {
|
|
||||||
iter.ReportError("readUint64", "can not decode float as int")
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
ind := intDigits[c]
|
ind := intDigits[c]
|
||||||
if ind == 0 {
|
if ind == 0 {
|
||||||
|
iter.assertInteger()
|
||||||
return 0 // single zero
|
return 0 // single zero
|
||||||
}
|
}
|
||||||
if ind == invalidCharForNumber {
|
if ind == invalidCharForNumber {
|
||||||
@ -243,11 +245,73 @@ func (iter *Iterator) readUint64(c byte) (ret uint64) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
value := uint64(ind)
|
value := uint64(ind)
|
||||||
|
if iter.tail-iter.head > 10 {
|
||||||
|
i := iter.head
|
||||||
|
ind2 := intDigits[iter.buf[i]]
|
||||||
|
if ind2 == invalidCharForNumber {
|
||||||
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
ind3 := intDigits[iter.buf[i]]
|
||||||
|
if ind3 == invalidCharForNumber {
|
||||||
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
|
return value*10 + uint64(ind2)
|
||||||
|
}
|
||||||
|
//iter.head = i + 1
|
||||||
|
//value = value * 100 + uint32(ind2) * 10 + uint32(ind3)
|
||||||
|
i++
|
||||||
|
ind4 := intDigits[iter.buf[i]]
|
||||||
|
if ind4 == invalidCharForNumber {
|
||||||
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
|
return value*100 + uint64(ind2)*10 + uint64(ind3)
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
ind5 := intDigits[iter.buf[i]]
|
||||||
|
if ind5 == invalidCharForNumber {
|
||||||
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
|
return value*1000 + uint64(ind2)*100 + uint64(ind3)*10 + uint64(ind4)
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
ind6 := intDigits[iter.buf[i]]
|
||||||
|
if ind6 == invalidCharForNumber {
|
||||||
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
|
return value*10000 + uint64(ind2)*1000 + uint64(ind3)*100 + uint64(ind4)*10 + uint64(ind5)
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
ind7 := intDigits[iter.buf[i]]
|
||||||
|
if ind7 == invalidCharForNumber {
|
||||||
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
|
return value*100000 + uint64(ind2)*10000 + uint64(ind3)*1000 + uint64(ind4)*100 + uint64(ind5)*10 + uint64(ind6)
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
ind8 := intDigits[iter.buf[i]]
|
||||||
|
if ind8 == invalidCharForNumber {
|
||||||
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
|
return value*1000000 + uint64(ind2)*100000 + uint64(ind3)*10000 + uint64(ind4)*1000 + uint64(ind5)*100 + uint64(ind6)*10 + uint64(ind7)
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
ind9 := intDigits[iter.buf[i]]
|
||||||
|
value = value*10000000 + uint64(ind2)*1000000 + uint64(ind3)*100000 + uint64(ind4)*10000 + uint64(ind5)*1000 + uint64(ind6)*100 + uint64(ind7)*10 + uint64(ind8)
|
||||||
|
iter.head = i
|
||||||
|
if ind9 == invalidCharForNumber {
|
||||||
|
iter.assertInteger()
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
}
|
||||||
for {
|
for {
|
||||||
for i := iter.head; i < iter.tail; i++ {
|
for i := iter.head; i < iter.tail; i++ {
|
||||||
ind = intDigits[iter.buf[i]]
|
ind = intDigits[iter.buf[i]]
|
||||||
if ind == invalidCharForNumber {
|
if ind == invalidCharForNumber {
|
||||||
iter.head = i
|
iter.head = i
|
||||||
|
iter.assertInteger()
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
if value > uint64SafeToMultiple10 {
|
if value > uint64SafeToMultiple10 {
|
||||||
@ -262,7 +326,14 @@ func (iter *Iterator) readUint64(c byte) (ret uint64) {
|
|||||||
value = (value << 3) + (value << 1) + uint64(ind)
|
value = (value << 3) + (value << 1) + uint64(ind)
|
||||||
}
|
}
|
||||||
if !iter.loadMore() {
|
if !iter.loadMore() {
|
||||||
|
iter.assertInteger()
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) assertInteger() {
|
||||||
|
if iter.head < len(iter.buf) && iter.buf[iter.head] == '.' {
|
||||||
|
iter.ReportError("assertInteger", "can not decode float as int")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user