interface.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. package decoder
  2. import (
  3. "bytes"
  4. "encoding"
  5. "encoding/json"
  6. "reflect"
  7. "unsafe"
  8. "github.com/goccy/go-json/internal/errors"
  9. "github.com/goccy/go-json/internal/runtime"
  10. )
  11. type interfaceDecoder struct {
  12. typ *runtime.Type
  13. structName string
  14. fieldName string
  15. sliceDecoder *sliceDecoder
  16. mapDecoder *mapDecoder
  17. floatDecoder *floatDecoder
  18. numberDecoder *numberDecoder
  19. stringDecoder *stringDecoder
  20. }
  21. func newEmptyInterfaceDecoder(structName, fieldName string) *interfaceDecoder {
  22. ifaceDecoder := &interfaceDecoder{
  23. typ: emptyInterfaceType,
  24. structName: structName,
  25. fieldName: fieldName,
  26. floatDecoder: newFloatDecoder(structName, fieldName, func(p unsafe.Pointer, v float64) {
  27. *(*interface{})(p) = v
  28. }),
  29. numberDecoder: newNumberDecoder(structName, fieldName, func(p unsafe.Pointer, v json.Number) {
  30. *(*interface{})(p) = v
  31. }),
  32. stringDecoder: newStringDecoder(structName, fieldName),
  33. }
  34. ifaceDecoder.sliceDecoder = newSliceDecoder(
  35. ifaceDecoder,
  36. emptyInterfaceType,
  37. emptyInterfaceType.Size(),
  38. structName, fieldName,
  39. )
  40. ifaceDecoder.mapDecoder = newMapDecoder(
  41. interfaceMapType,
  42. stringType,
  43. ifaceDecoder.stringDecoder,
  44. interfaceMapType.Elem(),
  45. ifaceDecoder,
  46. structName,
  47. fieldName,
  48. )
  49. return ifaceDecoder
  50. }
  51. func newInterfaceDecoder(typ *runtime.Type, structName, fieldName string) *interfaceDecoder {
  52. emptyIfaceDecoder := newEmptyInterfaceDecoder(structName, fieldName)
  53. stringDecoder := newStringDecoder(structName, fieldName)
  54. return &interfaceDecoder{
  55. typ: typ,
  56. structName: structName,
  57. fieldName: fieldName,
  58. sliceDecoder: newSliceDecoder(
  59. emptyIfaceDecoder,
  60. emptyInterfaceType,
  61. emptyInterfaceType.Size(),
  62. structName, fieldName,
  63. ),
  64. mapDecoder: newMapDecoder(
  65. interfaceMapType,
  66. stringType,
  67. stringDecoder,
  68. interfaceMapType.Elem(),
  69. emptyIfaceDecoder,
  70. structName,
  71. fieldName,
  72. ),
  73. floatDecoder: newFloatDecoder(structName, fieldName, func(p unsafe.Pointer, v float64) {
  74. *(*interface{})(p) = v
  75. }),
  76. numberDecoder: newNumberDecoder(structName, fieldName, func(p unsafe.Pointer, v json.Number) {
  77. *(*interface{})(p) = v
  78. }),
  79. stringDecoder: stringDecoder,
  80. }
  81. }
  82. func (d *interfaceDecoder) numDecoder(s *Stream) Decoder {
  83. if s.UseNumber {
  84. return d.numberDecoder
  85. }
  86. return d.floatDecoder
  87. }
  88. var (
  89. emptyInterfaceType = runtime.Type2RType(reflect.TypeOf((*interface{})(nil)).Elem())
  90. interfaceMapType = runtime.Type2RType(
  91. reflect.TypeOf((*map[string]interface{})(nil)).Elem(),
  92. )
  93. stringType = runtime.Type2RType(
  94. reflect.TypeOf(""),
  95. )
  96. )
  97. func decodeStreamUnmarshaler(s *Stream, depth int64, unmarshaler json.Unmarshaler) error {
  98. start := s.cursor
  99. if err := s.skipValue(depth); err != nil {
  100. return err
  101. }
  102. src := s.buf[start:s.cursor]
  103. dst := make([]byte, len(src))
  104. copy(dst, src)
  105. if err := unmarshaler.UnmarshalJSON(dst); err != nil {
  106. return err
  107. }
  108. return nil
  109. }
  110. func decodeStreamUnmarshalerContext(s *Stream, depth int64, unmarshaler unmarshalerContext) error {
  111. start := s.cursor
  112. if err := s.skipValue(depth); err != nil {
  113. return err
  114. }
  115. src := s.buf[start:s.cursor]
  116. dst := make([]byte, len(src))
  117. copy(dst, src)
  118. if err := unmarshaler.UnmarshalJSON(s.Option.Context, dst); err != nil {
  119. return err
  120. }
  121. return nil
  122. }
  123. func decodeUnmarshaler(buf []byte, cursor, depth int64, unmarshaler json.Unmarshaler) (int64, error) {
  124. cursor = skipWhiteSpace(buf, cursor)
  125. start := cursor
  126. end, err := skipValue(buf, cursor, depth)
  127. if err != nil {
  128. return 0, err
  129. }
  130. src := buf[start:end]
  131. dst := make([]byte, len(src))
  132. copy(dst, src)
  133. if err := unmarshaler.UnmarshalJSON(dst); err != nil {
  134. return 0, err
  135. }
  136. return end, nil
  137. }
  138. func decodeUnmarshalerContext(ctx *RuntimeContext, buf []byte, cursor, depth int64, unmarshaler unmarshalerContext) (int64, error) {
  139. cursor = skipWhiteSpace(buf, cursor)
  140. start := cursor
  141. end, err := skipValue(buf, cursor, depth)
  142. if err != nil {
  143. return 0, err
  144. }
  145. src := buf[start:end]
  146. dst := make([]byte, len(src))
  147. copy(dst, src)
  148. if err := unmarshaler.UnmarshalJSON(ctx.Option.Context, dst); err != nil {
  149. return 0, err
  150. }
  151. return end, nil
  152. }
  153. func decodeStreamTextUnmarshaler(s *Stream, depth int64, unmarshaler encoding.TextUnmarshaler, p unsafe.Pointer) error {
  154. start := s.cursor
  155. if err := s.skipValue(depth); err != nil {
  156. return err
  157. }
  158. src := s.buf[start:s.cursor]
  159. if bytes.Equal(src, nullbytes) {
  160. *(*unsafe.Pointer)(p) = nil
  161. return nil
  162. }
  163. dst := make([]byte, len(src))
  164. copy(dst, src)
  165. if err := unmarshaler.UnmarshalText(dst); err != nil {
  166. return err
  167. }
  168. return nil
  169. }
  170. func decodeTextUnmarshaler(buf []byte, cursor, depth int64, unmarshaler encoding.TextUnmarshaler, p unsafe.Pointer) (int64, error) {
  171. cursor = skipWhiteSpace(buf, cursor)
  172. start := cursor
  173. end, err := skipValue(buf, cursor, depth)
  174. if err != nil {
  175. return 0, err
  176. }
  177. src := buf[start:end]
  178. if bytes.Equal(src, nullbytes) {
  179. *(*unsafe.Pointer)(p) = nil
  180. return end, nil
  181. }
  182. if s, ok := unquoteBytes(src); ok {
  183. src = s
  184. }
  185. if err := unmarshaler.UnmarshalText(src); err != nil {
  186. return 0, err
  187. }
  188. return end, nil
  189. }
  190. func (d *interfaceDecoder) decodeStreamEmptyInterface(s *Stream, depth int64, p unsafe.Pointer) error {
  191. c := s.skipWhiteSpace()
  192. for {
  193. switch c {
  194. case '{':
  195. var v map[string]interface{}
  196. ptr := unsafe.Pointer(&v)
  197. if err := d.mapDecoder.DecodeStream(s, depth, ptr); err != nil {
  198. return err
  199. }
  200. *(*interface{})(p) = v
  201. return nil
  202. case '[':
  203. var v []interface{}
  204. ptr := unsafe.Pointer(&v)
  205. if err := d.sliceDecoder.DecodeStream(s, depth, ptr); err != nil {
  206. return err
  207. }
  208. *(*interface{})(p) = v
  209. return nil
  210. case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  211. return d.numDecoder(s).DecodeStream(s, depth, p)
  212. case '"':
  213. s.cursor++
  214. start := s.cursor
  215. for {
  216. switch s.char() {
  217. case '\\':
  218. if _, err := decodeEscapeString(s, nil); err != nil {
  219. return err
  220. }
  221. case '"':
  222. literal := s.buf[start:s.cursor]
  223. s.cursor++
  224. *(*interface{})(p) = string(literal)
  225. return nil
  226. case nul:
  227. if s.read() {
  228. continue
  229. }
  230. return errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  231. }
  232. s.cursor++
  233. }
  234. case 't':
  235. if err := trueBytes(s); err != nil {
  236. return err
  237. }
  238. **(**interface{})(unsafe.Pointer(&p)) = true
  239. return nil
  240. case 'f':
  241. if err := falseBytes(s); err != nil {
  242. return err
  243. }
  244. **(**interface{})(unsafe.Pointer(&p)) = false
  245. return nil
  246. case 'n':
  247. if err := nullBytes(s); err != nil {
  248. return err
  249. }
  250. *(*interface{})(p) = nil
  251. return nil
  252. case nul:
  253. if s.read() {
  254. c = s.char()
  255. continue
  256. }
  257. }
  258. break
  259. }
  260. return errors.ErrInvalidBeginningOfValue(c, s.totalOffset())
  261. }
  262. type emptyInterface struct {
  263. typ *runtime.Type
  264. ptr unsafe.Pointer
  265. }
  266. func (d *interfaceDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
  267. runtimeInterfaceValue := *(*interface{})(unsafe.Pointer(&emptyInterface{
  268. typ: d.typ,
  269. ptr: p,
  270. }))
  271. rv := reflect.ValueOf(runtimeInterfaceValue)
  272. if rv.NumMethod() > 0 && rv.CanInterface() {
  273. if u, ok := rv.Interface().(unmarshalerContext); ok {
  274. return decodeStreamUnmarshalerContext(s, depth, u)
  275. }
  276. if u, ok := rv.Interface().(json.Unmarshaler); ok {
  277. return decodeStreamUnmarshaler(s, depth, u)
  278. }
  279. if u, ok := rv.Interface().(encoding.TextUnmarshaler); ok {
  280. return decodeStreamTextUnmarshaler(s, depth, u, p)
  281. }
  282. if s.skipWhiteSpace() == 'n' {
  283. if err := nullBytes(s); err != nil {
  284. return err
  285. }
  286. *(*interface{})(p) = nil
  287. return nil
  288. }
  289. return d.errUnmarshalType(rv.Type(), s.totalOffset())
  290. }
  291. iface := rv.Interface()
  292. ifaceHeader := (*emptyInterface)(unsafe.Pointer(&iface))
  293. typ := ifaceHeader.typ
  294. if ifaceHeader.ptr == nil || d.typ == typ || typ == nil {
  295. // concrete type is empty interface
  296. return d.decodeStreamEmptyInterface(s, depth, p)
  297. }
  298. if typ.Kind() == reflect.Ptr && typ.Elem() == d.typ || typ.Kind() != reflect.Ptr {
  299. return d.decodeStreamEmptyInterface(s, depth, p)
  300. }
  301. if s.skipWhiteSpace() == 'n' {
  302. if err := nullBytes(s); err != nil {
  303. return err
  304. }
  305. *(*interface{})(p) = nil
  306. return nil
  307. }
  308. decoder, err := CompileToGetDecoder(typ)
  309. if err != nil {
  310. return err
  311. }
  312. return decoder.DecodeStream(s, depth, ifaceHeader.ptr)
  313. }
  314. func (d *interfaceDecoder) errUnmarshalType(typ reflect.Type, offset int64) *errors.UnmarshalTypeError {
  315. return &errors.UnmarshalTypeError{
  316. Value: typ.String(),
  317. Type: typ,
  318. Offset: offset,
  319. Struct: d.structName,
  320. Field: d.fieldName,
  321. }
  322. }
  323. func (d *interfaceDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  324. buf := ctx.Buf
  325. runtimeInterfaceValue := *(*interface{})(unsafe.Pointer(&emptyInterface{
  326. typ: d.typ,
  327. ptr: p,
  328. }))
  329. rv := reflect.ValueOf(runtimeInterfaceValue)
  330. if rv.NumMethod() > 0 && rv.CanInterface() {
  331. if u, ok := rv.Interface().(unmarshalerContext); ok {
  332. return decodeUnmarshalerContext(ctx, buf, cursor, depth, u)
  333. }
  334. if u, ok := rv.Interface().(json.Unmarshaler); ok {
  335. return decodeUnmarshaler(buf, cursor, depth, u)
  336. }
  337. if u, ok := rv.Interface().(encoding.TextUnmarshaler); ok {
  338. return decodeTextUnmarshaler(buf, cursor, depth, u, p)
  339. }
  340. cursor = skipWhiteSpace(buf, cursor)
  341. if buf[cursor] == 'n' {
  342. if err := validateNull(buf, cursor); err != nil {
  343. return 0, err
  344. }
  345. cursor += 4
  346. **(**interface{})(unsafe.Pointer(&p)) = nil
  347. return cursor, nil
  348. }
  349. return 0, d.errUnmarshalType(rv.Type(), cursor)
  350. }
  351. iface := rv.Interface()
  352. ifaceHeader := (*emptyInterface)(unsafe.Pointer(&iface))
  353. typ := ifaceHeader.typ
  354. if ifaceHeader.ptr == nil || d.typ == typ || typ == nil {
  355. // concrete type is empty interface
  356. return d.decodeEmptyInterface(ctx, cursor, depth, p)
  357. }
  358. if typ.Kind() == reflect.Ptr && typ.Elem() == d.typ || typ.Kind() != reflect.Ptr {
  359. return d.decodeEmptyInterface(ctx, cursor, depth, p)
  360. }
  361. cursor = skipWhiteSpace(buf, cursor)
  362. if buf[cursor] == 'n' {
  363. if err := validateNull(buf, cursor); err != nil {
  364. return 0, err
  365. }
  366. cursor += 4
  367. **(**interface{})(unsafe.Pointer(&p)) = nil
  368. return cursor, nil
  369. }
  370. decoder, err := CompileToGetDecoder(typ)
  371. if err != nil {
  372. return 0, err
  373. }
  374. return decoder.Decode(ctx, cursor, depth, ifaceHeader.ptr)
  375. }
  376. func (d *interfaceDecoder) decodeEmptyInterface(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  377. buf := ctx.Buf
  378. cursor = skipWhiteSpace(buf, cursor)
  379. switch buf[cursor] {
  380. case '{':
  381. var v map[string]interface{}
  382. ptr := unsafe.Pointer(&v)
  383. cursor, err := d.mapDecoder.Decode(ctx, cursor, depth, ptr)
  384. if err != nil {
  385. return 0, err
  386. }
  387. **(**interface{})(unsafe.Pointer(&p)) = v
  388. return cursor, nil
  389. case '[':
  390. var v []interface{}
  391. ptr := unsafe.Pointer(&v)
  392. cursor, err := d.sliceDecoder.Decode(ctx, cursor, depth, ptr)
  393. if err != nil {
  394. return 0, err
  395. }
  396. **(**interface{})(unsafe.Pointer(&p)) = v
  397. return cursor, nil
  398. case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  399. return d.floatDecoder.Decode(ctx, cursor, depth, p)
  400. case '"':
  401. var v string
  402. ptr := unsafe.Pointer(&v)
  403. cursor, err := d.stringDecoder.Decode(ctx, cursor, depth, ptr)
  404. if err != nil {
  405. return 0, err
  406. }
  407. **(**interface{})(unsafe.Pointer(&p)) = v
  408. return cursor, nil
  409. case 't':
  410. if err := validateTrue(buf, cursor); err != nil {
  411. return 0, err
  412. }
  413. cursor += 4
  414. **(**interface{})(unsafe.Pointer(&p)) = true
  415. return cursor, nil
  416. case 'f':
  417. if err := validateFalse(buf, cursor); err != nil {
  418. return 0, err
  419. }
  420. cursor += 5
  421. **(**interface{})(unsafe.Pointer(&p)) = false
  422. return cursor, nil
  423. case 'n':
  424. if err := validateNull(buf, cursor); err != nil {
  425. return 0, err
  426. }
  427. cursor += 4
  428. **(**interface{})(unsafe.Pointer(&p)) = nil
  429. return cursor, nil
  430. }
  431. return cursor, errors.ErrInvalidBeginningOfValue(buf[cursor], cursor)
  432. }