feature_reflect.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. package jsoniter
  2. import (
  3. "encoding"
  4. "encoding/json"
  5. "fmt"
  6. "reflect"
  7. "time"
  8. "unsafe"
  9. )
  10. // ValDecoder is an internal type registered to cache as needed.
  11. // Don't confuse jsoniter.ValDecoder with json.Decoder.
  12. // For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link).
  13. //
  14. // Reflection on type to create decoders, which is then cached
  15. // Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
  16. // 1. create instance of new value, for example *int will need a int to be allocated
  17. // 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
  18. // 3. assignment to map, both key and value will be reflect.Value
  19. // For a simple struct binding, it will be reflect.Value free and allocation free
  20. type ValDecoder interface {
  21. Decode(ptr unsafe.Pointer, iter *Iterator)
  22. }
  23. // ValEncoder is an internal type registered to cache as needed.
  24. // Don't confuse jsoniter.ValEncoder with json.Encoder.
  25. // For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link).
  26. type ValEncoder interface {
  27. IsEmpty(ptr unsafe.Pointer) bool
  28. Encode(ptr unsafe.Pointer, stream *Stream)
  29. EncodeInterface(val interface{}, stream *Stream)
  30. }
  31. type checkIsEmpty interface {
  32. IsEmpty(ptr unsafe.Pointer) bool
  33. }
  34. // WriteToStream the default implementation for TypeEncoder method EncodeInterface
  35. func WriteToStream(val interface{}, stream *Stream, encoder ValEncoder) {
  36. e := (*emptyInterface)(unsafe.Pointer(&val))
  37. if e.word == nil {
  38. stream.WriteNil()
  39. return
  40. }
  41. if reflect.TypeOf(val).Kind() == reflect.Ptr {
  42. encoder.Encode(unsafe.Pointer(&e.word), stream)
  43. } else {
  44. encoder.Encode(e.word, stream)
  45. }
  46. }
  47. var jsonNumberType reflect.Type
  48. var jsoniterNumberType reflect.Type
  49. var jsonRawMessageType reflect.Type
  50. var jsoniterRawMessageType reflect.Type
  51. var anyType reflect.Type
  52. var marshalerType reflect.Type
  53. var unmarshalerType reflect.Type
  54. var textMarshalerType reflect.Type
  55. var textUnmarshalerType reflect.Type
  56. func init() {
  57. jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
  58. jsoniterNumberType = reflect.TypeOf((*Number)(nil)).Elem()
  59. jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
  60. jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
  61. anyType = reflect.TypeOf((*Any)(nil)).Elem()
  62. marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
  63. unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
  64. textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
  65. textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
  66. }
  67. // ReadVal copy the underlying JSON into go interface, same as json.Unmarshal
  68. func (iter *Iterator) ReadVal(obj interface{}) {
  69. typ := reflect.TypeOf(obj)
  70. cacheKey := typ.Elem()
  71. decoder := decoderOfType(iter.cfg, "", cacheKey)
  72. e := (*emptyInterface)(unsafe.Pointer(&obj))
  73. if e.word == nil {
  74. iter.ReportError("ReadVal", "can not read into nil pointer")
  75. return
  76. }
  77. decoder.Decode(e.word, iter)
  78. }
  79. // WriteVal copy the go interface into underlying JSON, same as json.Marshal
  80. func (stream *Stream) WriteVal(val interface{}) {
  81. if nil == val {
  82. stream.WriteNil()
  83. return
  84. }
  85. typ := reflect.TypeOf(val)
  86. cacheKey := typ
  87. encoder := encoderOfType(stream.cfg, "", cacheKey)
  88. encoder.EncodeInterface(val, stream)
  89. }
  90. func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
  91. cacheKey := typ
  92. decoder := cfg.getDecoderFromCache(cacheKey)
  93. if decoder != nil {
  94. return decoder
  95. }
  96. decoder = getTypeDecoderFromExtension(cfg, typ)
  97. if decoder != nil {
  98. cfg.addDecoderToCache(cacheKey, decoder)
  99. return decoder
  100. }
  101. decoder = &placeholderDecoder{cfg: cfg, cacheKey: cacheKey}
  102. cfg.addDecoderToCache(cacheKey, decoder)
  103. decoder = createDecoderOfType(cfg, prefix, typ)
  104. for _, extension := range extensions {
  105. decoder = extension.DecorateDecoder(typ, decoder)
  106. }
  107. for _, extension := range cfg.extensions {
  108. decoder = extension.DecorateDecoder(typ, decoder)
  109. }
  110. cfg.addDecoderToCache(cacheKey, decoder)
  111. return decoder
  112. }
  113. func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
  114. typeName := typ.String()
  115. if typ == jsonRawMessageType {
  116. return &jsonRawMessageCodec{}
  117. }
  118. if typ == jsoniterRawMessageType {
  119. return &jsoniterRawMessageCodec{}
  120. }
  121. if typ.AssignableTo(jsonNumberType) {
  122. return &jsonNumberCodec{}
  123. }
  124. if typ.AssignableTo(jsoniterNumberType) {
  125. return &jsoniterNumberCodec{}
  126. }
  127. if typ.Implements(unmarshalerType) {
  128. templateInterface := reflect.New(typ).Elem().Interface()
  129. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  130. if typ.Kind() == reflect.Ptr {
  131. decoder = &OptionalDecoder{typ.Elem(), decoder}
  132. }
  133. return decoder
  134. }
  135. if reflect.PtrTo(typ).Implements(unmarshalerType) {
  136. templateInterface := reflect.New(typ).Interface()
  137. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  138. return decoder
  139. }
  140. if typ.Implements(textUnmarshalerType) {
  141. templateInterface := reflect.New(typ).Elem().Interface()
  142. var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)}
  143. if typ.Kind() == reflect.Ptr {
  144. decoder = &OptionalDecoder{typ.Elem(), decoder}
  145. }
  146. return decoder
  147. }
  148. if reflect.PtrTo(typ).Implements(textUnmarshalerType) {
  149. templateInterface := reflect.New(typ).Interface()
  150. var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)}
  151. return decoder
  152. }
  153. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  154. sliceDecoder := decoderOfSlice(cfg, prefix, typ)
  155. return &base64Codec{sliceDecoder: sliceDecoder}
  156. }
  157. if typ.Implements(anyType) {
  158. return &anyCodec{}
  159. }
  160. switch typ.Kind() {
  161. case reflect.String:
  162. if typeName != "string" {
  163. return decoderOfType(cfg, prefix, reflect.TypeOf((*string)(nil)).Elem())
  164. }
  165. return &stringCodec{}
  166. case reflect.Int:
  167. if typeName != "int" {
  168. return decoderOfType(cfg, prefix, reflect.TypeOf((*int)(nil)).Elem())
  169. }
  170. return &intCodec{}
  171. case reflect.Int8:
  172. if typeName != "int8" {
  173. return decoderOfType(cfg, prefix, reflect.TypeOf((*int8)(nil)).Elem())
  174. }
  175. return &int8Codec{}
  176. case reflect.Int16:
  177. if typeName != "int16" {
  178. return decoderOfType(cfg, prefix, reflect.TypeOf((*int16)(nil)).Elem())
  179. }
  180. return &int16Codec{}
  181. case reflect.Int32:
  182. if typeName != "int32" {
  183. return decoderOfType(cfg, prefix, reflect.TypeOf((*int32)(nil)).Elem())
  184. }
  185. return &int32Codec{}
  186. case reflect.Int64:
  187. if typeName != "int64" {
  188. return decoderOfType(cfg, prefix, reflect.TypeOf((*int64)(nil)).Elem())
  189. }
  190. return &int64Codec{}
  191. case reflect.Uint:
  192. if typeName != "uint" {
  193. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint)(nil)).Elem())
  194. }
  195. return &uintCodec{}
  196. case reflect.Uint8:
  197. if typeName != "uint8" {
  198. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint8)(nil)).Elem())
  199. }
  200. return &uint8Codec{}
  201. case reflect.Uint16:
  202. if typeName != "uint16" {
  203. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint16)(nil)).Elem())
  204. }
  205. return &uint16Codec{}
  206. case reflect.Uint32:
  207. if typeName != "uint32" {
  208. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint32)(nil)).Elem())
  209. }
  210. return &uint32Codec{}
  211. case reflect.Uintptr:
  212. if typeName != "uintptr" {
  213. return decoderOfType(cfg, prefix, reflect.TypeOf((*uintptr)(nil)).Elem())
  214. }
  215. return &uintptrCodec{}
  216. case reflect.Uint64:
  217. if typeName != "uint64" {
  218. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint64)(nil)).Elem())
  219. }
  220. return &uint64Codec{}
  221. case reflect.Float32:
  222. if typeName != "float32" {
  223. return decoderOfType(cfg, prefix, reflect.TypeOf((*float32)(nil)).Elem())
  224. }
  225. return &float32Codec{}
  226. case reflect.Float64:
  227. if typeName != "float64" {
  228. return decoderOfType(cfg, prefix, reflect.TypeOf((*float64)(nil)).Elem())
  229. }
  230. return &float64Codec{}
  231. case reflect.Bool:
  232. if typeName != "bool" {
  233. return decoderOfType(cfg, prefix, reflect.TypeOf((*bool)(nil)).Elem())
  234. }
  235. return &boolCodec{}
  236. case reflect.Interface:
  237. if typ.NumMethod() == 0 {
  238. return &emptyInterfaceCodec{}
  239. }
  240. return &nonEmptyInterfaceCodec{}
  241. case reflect.Struct:
  242. return decoderOfStruct(cfg, prefix, typ)
  243. case reflect.Array:
  244. return decoderOfArray(cfg, prefix, typ)
  245. case reflect.Slice:
  246. return decoderOfSlice(cfg, prefix, typ)
  247. case reflect.Map:
  248. return decoderOfMap(cfg, prefix, typ)
  249. case reflect.Ptr:
  250. return decoderOfOptional(cfg, prefix, typ)
  251. default:
  252. return &lazyErrorDecoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
  253. }
  254. }
  255. func encoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  256. cacheKey := typ
  257. encoder := cfg.getEncoderFromCache(cacheKey)
  258. if encoder != nil {
  259. return encoder
  260. }
  261. encoder = getTypeEncoderFromExtension(cfg, typ)
  262. if encoder != nil {
  263. cfg.addEncoderToCache(cacheKey, encoder)
  264. return encoder
  265. }
  266. encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey}
  267. cfg.addEncoderToCache(cacheKey, encoder)
  268. encoder = createEncoderOfType(cfg, prefix, typ)
  269. for _, extension := range extensions {
  270. encoder = extension.DecorateEncoder(typ, encoder)
  271. }
  272. for _, extension := range cfg.extensions {
  273. encoder = extension.DecorateEncoder(typ, encoder)
  274. }
  275. cfg.addEncoderToCache(cacheKey, encoder)
  276. return encoder
  277. }
  278. func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  279. if typ == jsonRawMessageType {
  280. return &jsonRawMessageCodec{}
  281. }
  282. if typ == jsoniterRawMessageType {
  283. return &jsoniterRawMessageCodec{}
  284. }
  285. if typ.AssignableTo(jsonNumberType) {
  286. return &jsonNumberCodec{}
  287. }
  288. if typ.AssignableTo(jsoniterNumberType) {
  289. return &jsoniterNumberCodec{}
  290. }
  291. if typ.Implements(marshalerType) {
  292. checkIsEmpty := createCheckIsEmpty(cfg, typ)
  293. templateInterface := reflect.New(typ).Elem().Interface()
  294. var encoder ValEncoder = &marshalerEncoder{
  295. templateInterface: extractInterface(templateInterface),
  296. checkIsEmpty: checkIsEmpty,
  297. }
  298. if typ.Kind() == reflect.Ptr {
  299. encoder = &OptionalEncoder{encoder}
  300. }
  301. return encoder
  302. }
  303. if reflect.PtrTo(typ).Implements(marshalerType) {
  304. checkIsEmpty := createCheckIsEmpty(cfg, reflect.PtrTo(typ))
  305. templateInterface := reflect.New(typ).Interface()
  306. var encoder ValEncoder = &marshalerEncoder{
  307. templateInterface: extractInterface(templateInterface),
  308. checkIsEmpty: checkIsEmpty,
  309. }
  310. return encoder
  311. }
  312. if typ.Implements(textMarshalerType) {
  313. checkIsEmpty := createCheckIsEmpty(cfg, typ)
  314. templateInterface := reflect.New(typ).Elem().Interface()
  315. var encoder ValEncoder = &textMarshalerEncoder{
  316. templateInterface: extractInterface(templateInterface),
  317. checkIsEmpty: checkIsEmpty,
  318. }
  319. if typ.Kind() == reflect.Ptr {
  320. encoder = &OptionalEncoder{encoder}
  321. }
  322. return encoder
  323. }
  324. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  325. return &base64Codec{}
  326. }
  327. if typ.Implements(anyType) {
  328. return &anyCodec{}
  329. }
  330. return createEncoderOfSimpleType(cfg, prefix, typ)
  331. }
  332. func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
  333. kind := typ.Kind()
  334. switch kind {
  335. case reflect.String:
  336. return &stringCodec{}
  337. case reflect.Int:
  338. return &intCodec{}
  339. case reflect.Int8:
  340. return &int8Codec{}
  341. case reflect.Int16:
  342. return &int16Codec{}
  343. case reflect.Int32:
  344. return &int32Codec{}
  345. case reflect.Int64:
  346. return &int64Codec{}
  347. case reflect.Uint:
  348. return &uintCodec{}
  349. case reflect.Uint8:
  350. return &uint8Codec{}
  351. case reflect.Uint16:
  352. return &uint16Codec{}
  353. case reflect.Uint32:
  354. return &uint32Codec{}
  355. case reflect.Uintptr:
  356. return &uintptrCodec{}
  357. case reflect.Uint64:
  358. return &uint64Codec{}
  359. case reflect.Float32:
  360. return &float32Codec{}
  361. case reflect.Float64:
  362. return &float64Codec{}
  363. case reflect.Bool:
  364. return &boolCodec{}
  365. case reflect.Interface:
  366. if typ.NumMethod() == 0 {
  367. return &emptyInterfaceCodec{}
  368. }
  369. return &nonEmptyInterfaceCodec{}
  370. case reflect.Struct:
  371. return &structEncoder{typ: typ}
  372. case reflect.Array:
  373. return &arrayEncoder{}
  374. case reflect.Slice:
  375. return &sliceEncoder{}
  376. case reflect.Map:
  377. return encoderOfMap(cfg, "", typ)
  378. case reflect.Ptr:
  379. return &OptionalEncoder{}
  380. default:
  381. return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)}
  382. }
  383. }
  384. func createEncoderOfSimpleType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  385. typeName := typ.String()
  386. kind := typ.Kind()
  387. switch kind {
  388. case reflect.String:
  389. if typeName != "string" {
  390. return encoderOfType(cfg, prefix, reflect.TypeOf((*string)(nil)).Elem())
  391. }
  392. return &stringCodec{}
  393. case reflect.Int:
  394. if typeName != "int" {
  395. return encoderOfType(cfg, prefix, reflect.TypeOf((*int)(nil)).Elem())
  396. }
  397. return &intCodec{}
  398. case reflect.Int8:
  399. if typeName != "int8" {
  400. return encoderOfType(cfg, prefix, reflect.TypeOf((*int8)(nil)).Elem())
  401. }
  402. return &int8Codec{}
  403. case reflect.Int16:
  404. if typeName != "int16" {
  405. return encoderOfType(cfg, prefix, reflect.TypeOf((*int16)(nil)).Elem())
  406. }
  407. return &int16Codec{}
  408. case reflect.Int32:
  409. if typeName != "int32" {
  410. return encoderOfType(cfg, prefix, reflect.TypeOf((*int32)(nil)).Elem())
  411. }
  412. return &int32Codec{}
  413. case reflect.Int64:
  414. if typeName != "int64" {
  415. return encoderOfType(cfg, prefix, reflect.TypeOf((*int64)(nil)).Elem())
  416. }
  417. return &int64Codec{}
  418. case reflect.Uint:
  419. if typeName != "uint" {
  420. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint)(nil)).Elem())
  421. }
  422. return &uintCodec{}
  423. case reflect.Uint8:
  424. if typeName != "uint8" {
  425. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint8)(nil)).Elem())
  426. }
  427. return &uint8Codec{}
  428. case reflect.Uint16:
  429. if typeName != "uint16" {
  430. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint16)(nil)).Elem())
  431. }
  432. return &uint16Codec{}
  433. case reflect.Uint32:
  434. if typeName != "uint32" {
  435. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint32)(nil)).Elem())
  436. }
  437. return &uint32Codec{}
  438. case reflect.Uintptr:
  439. if typeName != "uintptr" {
  440. return encoderOfType(cfg, prefix, reflect.TypeOf((*uintptr)(nil)).Elem())
  441. }
  442. return &uintptrCodec{}
  443. case reflect.Uint64:
  444. if typeName != "uint64" {
  445. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint64)(nil)).Elem())
  446. }
  447. return &uint64Codec{}
  448. case reflect.Float32:
  449. if typeName != "float32" {
  450. return encoderOfType(cfg, prefix, reflect.TypeOf((*float32)(nil)).Elem())
  451. }
  452. return &float32Codec{}
  453. case reflect.Float64:
  454. if typeName != "float64" {
  455. return encoderOfType(cfg, prefix, reflect.TypeOf((*float64)(nil)).Elem())
  456. }
  457. return &float64Codec{}
  458. case reflect.Bool:
  459. if typeName != "bool" {
  460. return encoderOfType(cfg, prefix, reflect.TypeOf((*bool)(nil)).Elem())
  461. }
  462. return &boolCodec{}
  463. case reflect.Interface:
  464. if typ.NumMethod() == 0 {
  465. return &emptyInterfaceCodec{}
  466. }
  467. return &nonEmptyInterfaceCodec{}
  468. case reflect.Struct:
  469. return encoderOfStruct(cfg, prefix, typ)
  470. case reflect.Array:
  471. return encoderOfArray(cfg, prefix, typ)
  472. case reflect.Slice:
  473. return encoderOfSlice(cfg, prefix, typ)
  474. case reflect.Map:
  475. return encoderOfMap(cfg, prefix, typ)
  476. case reflect.Ptr:
  477. return encoderOfOptional(cfg, prefix, typ)
  478. default:
  479. return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
  480. }
  481. }
  482. type placeholderEncoder struct {
  483. cfg *frozenConfig
  484. cacheKey reflect.Type
  485. }
  486. func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  487. encoder.getRealEncoder().Encode(ptr, stream)
  488. }
  489. func (encoder *placeholderEncoder) EncodeInterface(val interface{}, stream *Stream) {
  490. encoder.getRealEncoder().EncodeInterface(val, stream)
  491. }
  492. func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  493. return encoder.getRealEncoder().IsEmpty(ptr)
  494. }
  495. func (encoder *placeholderEncoder) getRealEncoder() ValEncoder {
  496. for i := 0; i < 500; i++ {
  497. realDecoder := encoder.cfg.getEncoderFromCache(encoder.cacheKey)
  498. _, isPlaceholder := realDecoder.(*placeholderEncoder)
  499. if isPlaceholder {
  500. time.Sleep(10 * time.Millisecond)
  501. } else {
  502. return realDecoder
  503. }
  504. }
  505. panic(fmt.Sprintf("real encoder not found for cache key: %v", encoder.cacheKey))
  506. }
  507. type placeholderDecoder struct {
  508. cfg *frozenConfig
  509. cacheKey reflect.Type
  510. }
  511. func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  512. for i := 0; i < 500; i++ {
  513. realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
  514. _, isPlaceholder := realDecoder.(*placeholderDecoder)
  515. if isPlaceholder {
  516. time.Sleep(10 * time.Millisecond)
  517. } else {
  518. realDecoder.Decode(ptr, iter)
  519. return
  520. }
  521. }
  522. panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey))
  523. }
  524. type lazyErrorDecoder struct {
  525. err error
  526. }
  527. func (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  528. if iter.WhatIsNext() != NilValue {
  529. if iter.Error == nil {
  530. iter.Error = decoder.err
  531. }
  532. } else {
  533. iter.Skip()
  534. }
  535. }
  536. type lazyErrorEncoder struct {
  537. err error
  538. }
  539. func (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  540. if ptr == nil {
  541. stream.WriteNil()
  542. } else if stream.Error == nil {
  543. stream.Error = encoder.err
  544. }
  545. }
  546. func (encoder *lazyErrorEncoder) EncodeInterface(val interface{}, stream *Stream) {
  547. if val == nil {
  548. stream.WriteNil()
  549. } else if stream.Error == nil {
  550. stream.Error = encoder.err
  551. }
  552. }
  553. func (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  554. return false
  555. }
  556. func extractInterface(val interface{}) emptyInterface {
  557. return *((*emptyInterface)(unsafe.Pointer(&val)))
  558. }
  559. // emptyInterface is the header for an interface{} value.
  560. type emptyInterface struct {
  561. typ unsafe.Pointer
  562. word unsafe.Pointer
  563. }
  564. // emptyInterface is the header for an interface with method (not interface{})
  565. type nonEmptyInterface struct {
  566. // see ../runtime/iface.go:/Itab
  567. itab *struct {
  568. ityp unsafe.Pointer // static interface type
  569. typ unsafe.Pointer // dynamic concrete type
  570. link unsafe.Pointer
  571. bad int32
  572. unused int32
  573. fun [100000]unsafe.Pointer // method table
  574. }
  575. word unsafe.Pointer
  576. }