encode.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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 started bool
  176. for i := 0; i < nb; i++ {
  177. n := self.nodeAt(i)
  178. if !n.Exists() {
  179. continue
  180. }
  181. if started {
  182. *buf = append(*buf, ',')
  183. }
  184. started = true
  185. if err := n.encode(buf); err != nil {
  186. return err
  187. }
  188. }
  189. *buf = append(*buf, ']')
  190. return nil
  191. }
  192. func (self *Pair) encode(buf *[]byte) error {
  193. if len(*buf) == 0 {
  194. *buf = append(*buf, '"', '"', ':')
  195. return self.Value.encode(buf)
  196. }
  197. quote(buf, self.Key)
  198. *buf = append(*buf, ':')
  199. return self.Value.encode(buf)
  200. }
  201. func (self *Node) encodeObject(buf *[]byte) error {
  202. if self.isLazy() {
  203. if err := self.skipAllKey(); err != nil {
  204. return err
  205. }
  206. }
  207. nb := self.len()
  208. if nb == 0 {
  209. *buf = append(*buf, bytesObject...)
  210. return nil
  211. }
  212. *buf = append(*buf, '{')
  213. var started bool
  214. for i := 0; i < nb; i++ {
  215. n := self.pairAt(i)
  216. if n == nil || !n.Value.Exists() {
  217. continue
  218. }
  219. if started {
  220. *buf = append(*buf, ',')
  221. }
  222. started = true
  223. if err := n.encode(buf); err != nil {
  224. return err
  225. }
  226. }
  227. *buf = append(*buf, '}')
  228. return nil
  229. }