1
0
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:
Tao Wen 2016-12-06 20:01:22 +08:00
parent c44e7c496a
commit e5f5c5716b

View File

@ -72,16 +72,20 @@ func ParseString(input string) *Iterator {
} }
func (iter *Iterator) skipWhitespaces() { func (iter *Iterator) skipWhitespaces() {
c := iter.readByte()
for { for {
switch c { for i := iter.head; i < iter.tail; i++ {
case ' ', '\n', '\t', 'r': c := iter.buf[i]
c = iter.readByte() switch c {
continue case ' ', '\n', '\t', 'r':
continue
}
iter.head = i
return
}
if !iter.loadMore() {
return
} }
break
} }
iter.unreadByte()
} }
func (iter *Iterator) ReportError(operation string, msg string) { func (iter *Iterator) ReportError(operation string, msg string) {
@ -107,25 +111,10 @@ 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.reader == nil { if iter.loadMore() {
iter.Error = io.EOF ret = iter.buf[iter.head]
return iter.head++
} return ret
for {
n, err := iter.reader.Read(iter.buf)
if n == 0 {
if err != nil {
iter.Error = err
return
} else {
// n == 0, err == nil is not EOF
continue
}
} else {
iter.head = 0
iter.tail = n
break
}
} }
} }
ret = iter.buf[iter.head] ret = iter.buf[iter.head]
@ -133,6 +122,29 @@ func (iter *Iterator) readByte() (ret byte) {
return ret return ret
} }
func (iter *Iterator) loadMore() bool {
if iter.reader == nil {
iter.Error = io.EOF
return false
}
for {
n, err := iter.reader.Read(iter.buf)
if n == 0 {
if err != nil {
iter.Error = err
return false
} else {
// n == 0, err == nil is not EOF
continue
}
} else {
iter.head = 0
iter.tail = n
return true
}
}
}
func (iter *Iterator) unreadByte() { func (iter *Iterator) unreadByte() {
if iter.head == 0 { if iter.head == 0 {
iter.ReportError("unreadByte", "unread too many bytes") iter.ReportError("unreadByte", "unread too many bytes")
@ -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