mirror of
https://github.com/json-iterator/go.git
synced 2025-05-16 21:45:43 +02:00
make skipWhitespaces faster
This commit is contained in:
parent
c44e7c496a
commit
e5f5c5716b
36
jsoniter.go
36
jsoniter.go
@ -72,16 +72,20 @@ func ParseString(input string) *Iterator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) skipWhitespaces() {
|
func (iter *Iterator) skipWhitespaces() {
|
||||||
c := iter.readByte()
|
|
||||||
for {
|
for {
|
||||||
|
for i := iter.head; i < iter.tail; i++ {
|
||||||
|
c := iter.buf[i]
|
||||||
switch c {
|
switch c {
|
||||||
case ' ', '\n', '\t', 'r':
|
case ' ', '\n', '\t', 'r':
|
||||||
c = iter.readByte()
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
break
|
iter.head = i
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !iter.loadMore() {
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
iter.unreadByte()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) ReportError(operation string, msg string) {
|
func (iter *Iterator) ReportError(operation string, msg string) {
|
||||||
@ -107,16 +111,28 @@ func (iter *Iterator) CurrentBuffer() string {
|
|||||||
|
|
||||||
func (iter *Iterator) readByte() (ret byte) {
|
func (iter *Iterator) readByte() (ret byte) {
|
||||||
if iter.head == iter.tail {
|
if iter.head == iter.tail {
|
||||||
|
if iter.loadMore() {
|
||||||
|
ret = iter.buf[iter.head]
|
||||||
|
iter.head++
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = iter.buf[iter.head]
|
||||||
|
iter.head++
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) loadMore() bool {
|
||||||
if iter.reader == nil {
|
if iter.reader == nil {
|
||||||
iter.Error = io.EOF
|
iter.Error = io.EOF
|
||||||
return
|
return false
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
n, err := iter.reader.Read(iter.buf)
|
n, err := iter.reader.Read(iter.buf)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
iter.Error = err
|
iter.Error = err
|
||||||
return
|
return false
|
||||||
} else {
|
} else {
|
||||||
// n == 0, err == nil is not EOF
|
// n == 0, err == nil is not EOF
|
||||||
continue
|
continue
|
||||||
@ -124,13 +140,9 @@ func (iter *Iterator) readByte() (ret byte) {
|
|||||||
} else {
|
} else {
|
||||||
iter.head = 0
|
iter.head = 0
|
||||||
iter.tail = n
|
iter.tail = n
|
||||||
break
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
ret = iter.buf[iter.head]
|
|
||||||
iter.head++
|
|
||||||
return ret
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) unreadByte() {
|
func (iter *Iterator) unreadByte() {
|
||||||
@ -314,7 +326,7 @@ func (iter *Iterator) ReadStringAsBytes() (ret []byte) {
|
|||||||
iter.ReportError("ReadString", `expects " or n`)
|
iter.ReportError("ReadString", `expects " or n`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
end, escaped := stringEnd(iter.buf[iter.head:])
|
end, escaped := stringEnd(iter.buf[iter.head:iter.tail])
|
||||||
if end != -1 && !escaped {
|
if end != -1 && !escaped {
|
||||||
ret = iter.buf[iter.head:iter.head+end-1]
|
ret = iter.buf[iter.head:iter.head+end-1]
|
||||||
iter.head += end
|
iter.head += end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user