summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/ast/encode.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/bytedance/sonic/ast/encode.go')
-rw-r--r--vendor/github.com/bytedance/sonic/ast/encode.go55
1 files changed, 35 insertions, 20 deletions
diff --git a/vendor/github.com/bytedance/sonic/ast/encode.go b/vendor/github.com/bytedance/sonic/ast/encode.go
index 956809c2c..eae0bd258 100644
--- a/vendor/github.com/bytedance/sonic/ast/encode.go
+++ b/vendor/github.com/bytedance/sonic/ast/encode.go
@@ -17,12 +17,11 @@
package ast
import (
- `sync`
- `unicode/utf8`
-)
+ "sync"
+ "unicode/utf8"
-const (
- _MaxBuffer = 1024 // 1KB buffer size
+ "github.com/bytedance/sonic/internal/rt"
+ "github.com/bytedance/sonic/option"
)
func quoteString(e *[]byte, s string) {
@@ -30,7 +29,7 @@ func quoteString(e *[]byte, s string) {
start := 0
for i := 0; i < len(s); {
if b := s[i]; b < utf8.RuneSelf {
- if safeSet[b] {
+ if rt.SafeSet[b] {
i++
continue
}
@@ -54,8 +53,8 @@ func quoteString(e *[]byte, s string) {
// user-controlled strings are rendered into JSON
// and served to some browsers.
*e = append(*e, `u00`...)
- *e = append(*e, hex[b>>4])
- *e = append(*e, hex[b&0xF])
+ *e = append(*e, rt.Hex[b>>4])
+ *e = append(*e, rt.Hex[b&0xF])
}
i++
start = i
@@ -76,7 +75,7 @@ func quoteString(e *[]byte, s string) {
*e = append(*e, s[start:i]...)
}
*e = append(*e, `\u202`...)
- *e = append(*e, hex[c&0xF])
+ *e = append(*e, rt.Hex[c&0xF])
i += size
start = i
continue
@@ -92,16 +91,24 @@ func quoteString(e *[]byte, s string) {
var bytesPool = sync.Pool{}
func (self *Node) MarshalJSON() ([]byte, error) {
+ if self == nil {
+ return bytesNull, nil
+ }
+
buf := newBuffer()
err := self.encode(buf)
if err != nil {
freeBuffer(buf)
return nil, err
}
-
- ret := make([]byte, len(*buf))
- copy(ret, *buf)
- freeBuffer(buf)
+ var ret []byte
+ if !rt.CanSizeResue(cap(*buf)) {
+ ret = *buf
+ } else {
+ ret = make([]byte, len(*buf))
+ copy(ret, *buf)
+ freeBuffer(buf)
+ }
return ret, err
}
@@ -109,21 +116,24 @@ func newBuffer() *[]byte {
if ret := bytesPool.Get(); ret != nil {
return ret.(*[]byte)
} else {
- buf := make([]byte, 0, _MaxBuffer)
+ buf := make([]byte, 0, option.DefaultAstBufferSize)
return &buf
}
}
func freeBuffer(buf *[]byte) {
+ if !rt.CanSizeResue(cap(*buf)) {
+ return
+ }
*buf = (*buf)[:0]
bytesPool.Put(buf)
}
func (self *Node) encode(buf *[]byte) error {
- if self.IsRaw() {
+ if self.isRaw() {
return self.encodeRaw(buf)
}
- switch self.Type() {
+ switch int(self.itype()) {
case V_NONE : return ErrNotExist
case V_ERROR : return self.Check()
case V_NULL : return self.encodeNull(buf)
@@ -139,16 +149,21 @@ func (self *Node) encode(buf *[]byte) error {
}
func (self *Node) encodeRaw(buf *[]byte) error {
- raw, err := self.Raw()
- if err != nil {
- return err
+ lock := self.rlock()
+ if !self.isRaw() {
+ self.runlock()
+ return self.encode(buf)
+ }
+ raw := self.toString()
+ if lock {
+ self.runlock()
}
*buf = append(*buf, raw...)
return nil
}
func (self *Node) encodeNull(buf *[]byte) error {
- *buf = append(*buf, bytesNull...)
+ *buf = append(*buf, strNull...)
return nil
}