Tao Wen 9 лет назад
Родитель
Сommit
76bf0defae
2 измененных файлов с 33 добавлено и 22 удалено
  1. 33 22
      jsoniter.go
  2. 0 0
      jsoniter_base64_test.go

+ 33 - 22
jsoniter.go

@@ -89,6 +89,19 @@ func (iter *Iterator) skipWhitespaces() {
 	}
 }
 
+func (iter *Iterator) skipWhitespacesWithoutLoadMore() bool {
+	for i := iter.head; i < iter.tail; i++ {
+		c := iter.buf[i]
+		switch c {
+		case ' ', '\n', '\t', '\r':
+			continue
+		}
+		iter.head = i
+		return false
+	}
+	return true
+}
+
 func (iter *Iterator) nextToken() byte {
 	// a variation of skip whitespaces, returning the next non-whitespace token
 	for {
@@ -124,7 +137,7 @@ func (iter *Iterator) CurrentBuffer() string {
 	if peekStart < 0 {
 		peekStart = 0
 	}
-	return fmt.Sprintf("parsing %v ...%s... at %s", iter.head,
+	return fmt.Sprintf("parsing %v ...|%s|... at %s", iter.head,
 		string(iter.buf[peekStart: iter.head]), string(iter.buf[0:iter.tail]))
 }
 
@@ -549,33 +562,31 @@ func (iter *Iterator) ReadObject() (ret string) {
 
 func (iter *Iterator) readObjectField() (ret string) {
 	str := iter.ReadStringAsBytes()
-	field := *(*string)(unsafe.Pointer(&str))
-	if iter.nextToken() != ':' {
+	if iter.skipWhitespacesWithoutLoadMore() {
+		if ret == "" {
+			ret = string(str);
+		}
+		if !iter.loadMore() {
+			return
+		}
+	}
+	if iter.buf[iter.head] != ':' {
 		iter.ReportError("ReadObject", "expect : after object field")
 		return
 	}
-	// skip whitespaces, and detect if buffer is rotated
-	for {
-		for i := iter.head; i < iter.tail; i++ {
-			c := iter.buf[i]
-			switch c {
-			case ' ', '\n', '\t', '\r':
-				continue
-			}
-			iter.head = i
-			break
+	iter.head++
+	if iter.skipWhitespacesWithoutLoadMore() {
+		if ret == "" {
+			ret = string(str);
 		}
-		if iter.head == iter.tail {
-			// no longer safe to reuse buffer
-			field = string(str)
-			if !iter.loadMore() {
-				return
-			}
-		} else {
-			break
+		if !iter.loadMore() {
+			return
 		}
 	}
-	return field
+	if ret == "" {
+		return *(*string)(unsafe.Pointer(&str))
+	}
+	return ret
 }
 
 func (iter *Iterator) ReadFloat32() (ret float32) {

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
jsoniter_base64_test.go


Некоторые файлы не были показаны из-за большого количества измененных файлов