encode.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*
  2. * Copyright 2021 ByteDance Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package ast
  17. import (
  18. "sync"
  19. "unicode/utf8"
  20. "github.com/bytedance/sonic/internal/rt"
  21. "github.com/bytedance/sonic/option"
  22. )
  23. func quoteString(e *[]byte, s string) {
  24. *e = append(*e, '"')
  25. start := 0
  26. for i := 0; i < len(s); {
  27. if b := s[i]; b < utf8.RuneSelf {
  28. if rt.SafeSet[b] {
  29. i++
  30. continue
  31. }
  32. if start < i {
  33. *e = append(*e, s[start:i]...)
  34. }
  35. *e = append(*e, '\\')
  36. switch b {
  37. case '\\', '"':
  38. *e = append(*e, b)
  39. case '\n':
  40. *e = append(*e, 'n')
  41. case '\r':
  42. *e = append(*e, 'r')
  43. case '\t':
  44. *e = append(*e, 't')
  45. default:
  46. // This encodes bytes < 0x20 except for \t, \n and \r.
  47. // If escapeHTML is set, it also escapes <, >, and &
  48. // because they can lead to security holes when
  49. // user-controlled strings are rendered into JSON
  50. // and served to some browsers.
  51. *e = append(*e, `u00`...)
  52. *e = append(*e, rt.Hex[b>>4])
  53. *e = append(*e, rt.Hex[b&0xF])
  54. }
  55. i++
  56. start = i
  57. continue
  58. }
  59. c, size := utf8.DecodeRuneInString(s[i:])
  60. // if c == utf8.RuneError && size == 1 {
  61. // if start < i {
  62. // e.Write(s[start:i])
  63. // }
  64. // e.WriteString(`\ufffd`)
  65. // i += size
  66. // start = i
  67. // continue
  68. // }
  69. if c == '\u2028' || c == '\u2029' {
  70. if start < i {
  71. *e = append(*e, s[start:i]...)
  72. }
  73. *e = append(*e, `\u202`...)
  74. *e = append(*e, rt.Hex[c&0xF])
  75. i += size
  76. start = i
  77. continue
  78. }
  79. i += size
  80. }
  81. if start < len(s) {
  82. *e = append(*e, s[start:]...)
  83. }
  84. *e = append(*e, '"')
  85. }
  86. var bytesPool = sync.Pool{}
  87. func (self *Node) MarshalJSON() ([]byte, error) {
  88. if self == nil {
  89. return bytesNull, nil
  90. }
  91. buf := newBuffer()
  92. err := self.encode(buf)
  93. if err != nil {
  94. freeBuffer(buf)
  95. return nil, err
  96. }
  97. var ret []byte
  98. if !rt.CanSizeResue(cap(*buf)) {
  99. ret = *buf
  100. } else {
  101. ret = make([]byte, len(*buf))
  102. copy(ret, *buf)
  103. freeBuffer(buf)
  104. }
  105. return ret, err
  106. }
  107. func newBuffer() *[]byte {
  108. if ret := bytesPool.Get(); ret != nil {
  109. return ret.(*[]byte)
  110. } else {
  111. buf := make([]byte, 0, option.DefaultAstBufferSize)
  112. return &buf
  113. }
  114. }
  115. func freeBuffer(buf *[]byte) {
  116. if !rt.CanSizeResue(cap(*buf)) {
  117. return
  118. }
  119. *buf = (*buf)[:0]
  120. bytesPool.Put(buf)
  121. }
  122. func (self *Node) encode(buf *[]byte) error {
  123. if self.isRaw() {
  124. return self.encodeRaw(buf)
  125. }
  126. switch int(self.itype()) {
  127. case V_NONE : return ErrNotExist
  128. case V_ERROR : return self.Check()
  129. case V_NULL : return self.encodeNull(buf)
  130. case V_TRUE : return self.encodeTrue(buf)
  131. case V_FALSE : return self.encodeFalse(buf)
  132. case V_ARRAY : return self.encodeArray(buf)
  133. case V_OBJECT: return self.encodeObject(buf)
  134. case V_STRING: return self.encodeString(buf)
  135. case V_NUMBER: return self.encodeNumber(buf)
  136. case V_ANY : return self.encodeInterface(buf)
  137. default : return ErrUnsupportType
  138. }
  139. }
  140. func (self *Node) encodeRaw(buf *[]byte) error {
  141. lock := self.rlock()
  142. if !self.isRaw() {
  143. self.runlock()
  144. return self.encode(buf)
  145. }
  146. raw := self.toString()
  147. if lock {
  148. self.runlock()
  149. }
  150. *buf = append(*buf, raw...)
  151. return nil
  152. }
  153. func (self *Node) encodeNull(buf *[]byte) error {
  154. *buf = append(*buf, strNull...)
  155. return nil
  156. }
  157. func (self *Node) encodeTrue(buf *[]byte) error {
  158. *buf = append(*buf, bytesTrue...)
  159. return nil
  160. }
  161. func (self *Node) encodeFalse(buf *[]byte) error {
  162. *buf = append(*buf, bytesFalse...)
  163. return nil
  164. }
  165. func (self *Node) encodeNumber(buf *[]byte) error {
  166. str := self.toString()
  167. *buf = append(*buf, str...)
  168. return nil
  169. }
  170. func (self *Node) encodeString(buf *[]byte) error {
  171. if self.l == 0 {
  172. *buf = append(*buf, '"', '"')
  173. return nil
  174. }
  175. quote(buf, self.toString())
  176. return nil
  177. }
  178. func (self *Node) encodeArray(buf *[]byte) error {
  179. if self.isLazy() {
  180. if err := self.skipAllIndex(); err != nil {
  181. return err
  182. }
  183. }
  184. nb := self.len()
  185. if nb == 0 {
  186. *buf = append(*buf, bytesArray...)
  187. return nil
  188. }
  189. *buf = append(*buf, '[')
  190. var started bool
  191. for i := 0; i < nb; i++ {
  192. n := self.nodeAt(i)
  193. if !n.Exists() {
  194. continue
  195. }
  196. if started {
  197. *buf = append(*buf, ',')
  198. }
  199. started = true
  200. if err := n.encode(buf); err != nil {
  201. return err
  202. }
  203. }
  204. *buf = append(*buf, ']')
  205. return nil
  206. }
  207. func (self *Pair) encode(buf *[]byte) error {
  208. if len(*buf) == 0 {
  209. *buf = append(*buf, '"', '"', ':')
  210. return self.Value.encode(buf)
  211. }
  212. quote(buf, self.Key)
  213. *buf = append(*buf, ':')
  214. return self.Value.encode(buf)
  215. }
  216. func (self *Node) encodeObject(buf *[]byte) error {
  217. if self.isLazy() {
  218. if err := self.skipAllKey(); err != nil {
  219. return err
  220. }
  221. }
  222. nb := self.len()
  223. if nb == 0 {
  224. *buf = append(*buf, bytesObject...)
  225. return nil
  226. }
  227. *buf = append(*buf, '{')
  228. var started bool
  229. for i := 0; i < nb; i++ {
  230. n := self.pairAt(i)
  231. if n == nil || !n.Value.Exists() {
  232. continue
  233. }
  234. if started {
  235. *buf = append(*buf, ',')
  236. }
  237. started = true
  238. if err := n.encode(buf); err != nil {
  239. return err
  240. }
  241. }
  242. *buf = append(*buf, '}')
  243. return nil
  244. }