encode.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. )
  21. const (
  22. _MaxBuffer = 1024 // 1KB buffer size
  23. )
  24. func quoteString(e *[]byte, s string) {
  25. *e = append(*e, '"')
  26. start := 0
  27. for i := 0; i < len(s); {
  28. if b := s[i]; b < utf8.RuneSelf {
  29. if safeSet[b] {
  30. i++
  31. continue
  32. }
  33. if start < i {
  34. *e = append(*e, s[start:i]...)
  35. }
  36. *e = append(*e, '\\')
  37. switch b {
  38. case '\\', '"':
  39. *e = append(*e, b)
  40. case '\n':
  41. *e = append(*e, 'n')
  42. case '\r':
  43. *e = append(*e, 'r')
  44. case '\t':
  45. *e = append(*e, 't')
  46. default:
  47. // This encodes bytes < 0x20 except for \t, \n and \r.
  48. // If escapeHTML is set, it also escapes <, >, and &
  49. // because they can lead to security holes when
  50. // user-controlled strings are rendered into JSON
  51. // and served to some browsers.
  52. *e = append(*e, `u00`...)
  53. *e = append(*e, hex[b>>4])
  54. *e = append(*e, hex[b&0xF])
  55. }
  56. i++
  57. start = i
  58. continue
  59. }
  60. c, size := utf8.DecodeRuneInString(s[i:])
  61. // if c == utf8.RuneError && size == 1 {
  62. // if start < i {
  63. // e.Write(s[start:i])
  64. // }
  65. // e.WriteString(`\ufffd`)
  66. // i += size
  67. // start = i
  68. // continue
  69. // }
  70. if c == '\u2028' || c == '\u2029' {
  71. if start < i {
  72. *e = append(*e, s[start:i]...)
  73. }
  74. *e = append(*e, `\u202`...)
  75. *e = append(*e, hex[c&0xF])
  76. i += size
  77. start = i
  78. continue
  79. }
  80. i += size
  81. }
  82. if start < len(s) {
  83. *e = append(*e, s[start:]...)
  84. }
  85. *e = append(*e, '"')
  86. }
  87. var bytesPool = sync.Pool{}
  88. func (self *Node) MarshalJSON() ([]byte, error) {
  89. buf := newBuffer()
  90. err := self.encode(buf)
  91. if err != nil {
  92. freeBuffer(buf)
  93. return nil, err
  94. }
  95. ret := make([]byte, len(*buf))
  96. copy(ret, *buf)
  97. freeBuffer(buf)
  98. return ret, err
  99. }
  100. func newBuffer() *[]byte {
  101. if ret := bytesPool.Get(); ret != nil {
  102. return ret.(*[]byte)
  103. } else {
  104. buf := make([]byte, 0, _MaxBuffer)
  105. return &buf
  106. }
  107. }
  108. func freeBuffer(buf *[]byte) {
  109. *buf = (*buf)[:0]
  110. bytesPool.Put(buf)
  111. }
  112. func (self *Node) encode(buf *[]byte) error {
  113. if self.IsRaw() {
  114. return self.encodeRaw(buf)
  115. }
  116. switch self.Type() {
  117. case V_NONE : return ErrNotExist
  118. case V_ERROR : return self.Check()
  119. case V_NULL : return self.encodeNull(buf)
  120. case V_TRUE : return self.encodeTrue(buf)
  121. case V_FALSE : return self.encodeFalse(buf)
  122. case V_ARRAY : return self.encodeArray(buf)
  123. case V_OBJECT: return self.encodeObject(buf)
  124. case V_STRING: return self.encodeString(buf)
  125. case V_NUMBER: return self.encodeNumber(buf)
  126. case V_ANY : return self.encodeInterface(buf)
  127. default : return ErrUnsupportType
  128. }
  129. }
  130. func (self *Node) encodeRaw(buf *[]byte) error {
  131. raw, err := self.Raw()
  132. if err != nil {
  133. return err
  134. }
  135. *buf = append(*buf, raw...)
  136. return nil
  137. }
  138. func (self *Node) encodeNull(buf *[]byte) error {
  139. *buf = append(*buf, bytesNull...)
  140. return nil
  141. }
  142. func (self *Node) encodeTrue(buf *[]byte) error {
  143. *buf = append(*buf, bytesTrue...)
  144. return nil
  145. }
  146. func (self *Node) encodeFalse(buf *[]byte) error {
  147. *buf = append(*buf, bytesFalse...)
  148. return nil
  149. }
  150. func (self *Node) encodeNumber(buf *[]byte) error {
  151. str := self.toString()
  152. *buf = append(*buf, str...)
  153. return nil
  154. }
  155. func (self *Node) encodeString(buf *[]byte) error {
  156. if self.l == 0 {
  157. *buf = append(*buf, '"', '"')
  158. return nil
  159. }
  160. quote(buf, self.toString())
  161. return nil
  162. }
  163. func (self *Node) encodeArray(buf *[]byte) error {
  164. if self.isLazy() {
  165. if err := self.skipAllIndex(); err != nil {
  166. return err
  167. }
  168. }
  169. nb := self.len()
  170. if nb == 0 {
  171. *buf = append(*buf, bytesArray...)
  172. return nil
  173. }
  174. *buf = append(*buf, '[')
  175. var s = (*linkedNodes)(self.p)
  176. var started bool
  177. if nb > 0 {
  178. n := s.At(0)
  179. if n.Exists() {
  180. if err := n.encode(buf); err != nil {
  181. return err
  182. }
  183. started = true
  184. }
  185. }
  186. for i := 1; i < nb; i++ {
  187. n := s.At(i)
  188. if !n.Exists() {
  189. continue
  190. }
  191. if started {
  192. *buf = append(*buf, ',')
  193. }
  194. started = true
  195. if err := n.encode(buf); err != nil {
  196. return err
  197. }
  198. }
  199. *buf = append(*buf, ']')
  200. return nil
  201. }
  202. func (self *Pair) encode(buf *[]byte) error {
  203. if len(*buf) == 0 {
  204. *buf = append(*buf, '"', '"', ':')
  205. return self.Value.encode(buf)
  206. }
  207. quote(buf, self.Key)
  208. *buf = append(*buf, ':')
  209. return self.Value.encode(buf)
  210. }
  211. func (self *Node) encodeObject(buf *[]byte) error {
  212. if self.isLazy() {
  213. if err := self.skipAllKey(); err != nil {
  214. return err
  215. }
  216. }
  217. nb := self.len()
  218. if nb == 0 {
  219. *buf = append(*buf, bytesObject...)
  220. return nil
  221. }
  222. *buf = append(*buf, '{')
  223. var s = (*linkedPairs)(self.p)
  224. var started bool
  225. if nb > 0 {
  226. n := s.At(0)
  227. if n.Value.Exists() {
  228. if err := n.encode(buf); err != nil {
  229. return err
  230. }
  231. started = true
  232. }
  233. }
  234. for i := 1; i < nb; i++ {
  235. n := s.At(i)
  236. if !n.Value.Exists() {
  237. continue
  238. }
  239. if started {
  240. *buf = append(*buf, ',')
  241. }
  242. started = true
  243. if err := n.encode(buf); err != nil {
  244. return err
  245. }
  246. }
  247. *buf = append(*buf, '}')
  248. return nil
  249. }