1
0
mirror of https://github.com/json-iterator/go.git synced 2025-06-24 23:16:47 +02:00

use iterator from cache for any

This commit is contained in:
Tao Wen
2017-06-17 21:10:08 +08:00
parent 50e4910c63
commit 55fc498d27
8 changed files with 82 additions and 121 deletions

View File

@ -8,8 +8,8 @@ import (
type objectLazyAny struct {
baseAny
cfg *frozenConfig
buf []byte
iter *Iterator
err error
cache map[string]Any
remaining []byte
@ -19,16 +19,6 @@ func (any *objectLazyAny) ValueType() ValueType {
return Object
}
func (any *objectLazyAny) Parse() *Iterator {
iter := any.iter
if iter == nil {
iter = NewIterator(ConfigDefault)
any.iter = iter
}
iter.ResetBytes(any.remaining)
return iter
}
func (any *objectLazyAny) fillCacheUntil(target string) Any {
if any.remaining == nil {
return any.cache[target]
@ -40,14 +30,15 @@ func (any *objectLazyAny) fillCacheUntil(target string) Any {
if val != nil {
return val
}
iter := any.Parse()
iter := any.cfg.BorrowIterator(any.remaining)
defer any.cfg.ReturnIterator(iter)
if len(any.remaining) == len(any.buf) {
iter.head++
c := iter.nextToken()
if c != '}' {
iter.unreadByte()
k := string(iter.readObjectFieldAsBytes())
v := iter.readAny(iter)
v := iter.readAny()
any.cache[k] = v
if target == k {
any.remaining = iter.buf[iter.head:]
@ -62,7 +53,7 @@ func (any *objectLazyAny) fillCacheUntil(target string) Any {
}
for iter.nextToken() == ',' {
k := string(iter.readObjectFieldAsBytes())
v := iter.readAny(iter)
v := iter.readAny()
any.cache[k] = v
if target == k {
any.remaining = iter.buf[iter.head:]
@ -82,14 +73,15 @@ func (any *objectLazyAny) fillCache() {
if any.cache == nil {
any.cache = map[string]Any{}
}
iter := any.Parse()
iter := any.cfg.BorrowIterator(any.remaining)
defer any.cfg.ReturnIterator(iter)
if len(any.remaining) == len(any.buf) {
iter.head++
c := iter.nextToken()
if c != '}' {
iter.unreadByte()
k := string(iter.readObjectFieldAsBytes())
v := iter.readAny(iter)
v := iter.readAny()
any.cache[k] = v
} else {
any.remaining = nil
@ -99,7 +91,7 @@ func (any *objectLazyAny) fillCache() {
}
for iter.nextToken() == ',' {
k := string(iter.readObjectFieldAsBytes())
v := iter.readAny(iter)
v := iter.readAny()
any.cache[k] = v
}
any.remaining = nil
@ -266,13 +258,14 @@ func (any *objectLazyAny) IterateObject() (func() (string, Any, bool), bool) {
}
remaining := any.remaining
if len(remaining) == len(any.buf) {
iter := any.Parse()
iter := any.cfg.BorrowIterator(any.remaining)
defer any.cfg.ReturnIterator(iter)
iter.head++
c := iter.nextToken()
if c != '}' {
iter.unreadByte()
k := string(iter.readObjectFieldAsBytes())
v := iter.readAny(iter)
v := iter.readAny()
any.cache[k] = v
remaining = iter.buf[iter.head:]
any.remaining = remaining
@ -306,16 +299,12 @@ func (any *objectLazyAny) IterateObject() (func() (string, Any, bool), bool) {
return key, value, true
} else {
// read from buffer
iter := any.iter
if iter == nil {
iter = NewIterator(ConfigDefault)
any.iter = iter
}
iter.ResetBytes(remaining)
iter := any.cfg.BorrowIterator(any.remaining)
defer any.cfg.ReturnIterator(iter)
c := iter.nextToken()
if c == ',' {
nextKey = string(iter.readObjectFieldAsBytes())
nextValue = iter.readAny(iter)
nextValue = iter.readAny()
any.cache[nextKey] = nextValue
remaining = iter.buf[iter.head:]
any.remaining = remaining