feature_reflect.go 17 KB

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