feature_reflect.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  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(reflect2.PtrOf(val), 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 == anyType {
  144. return &directAnyCodec{}
  145. }
  146. if typ.Implements(anyType) {
  147. return &anyCodec{}
  148. }
  149. switch typ.Kind() {
  150. case reflect.String:
  151. if typeName != "string" {
  152. return decoderOfType(cfg, prefix, reflect.TypeOf((*string)(nil)).Elem())
  153. }
  154. return &stringCodec{}
  155. case reflect.Int:
  156. if typeName != "int" {
  157. return decoderOfType(cfg, prefix, reflect.TypeOf((*int)(nil)).Elem())
  158. }
  159. return &intCodec{}
  160. case reflect.Int8:
  161. if typeName != "int8" {
  162. return decoderOfType(cfg, prefix, reflect.TypeOf((*int8)(nil)).Elem())
  163. }
  164. return &int8Codec{}
  165. case reflect.Int16:
  166. if typeName != "int16" {
  167. return decoderOfType(cfg, prefix, reflect.TypeOf((*int16)(nil)).Elem())
  168. }
  169. return &int16Codec{}
  170. case reflect.Int32:
  171. if typeName != "int32" {
  172. return decoderOfType(cfg, prefix, reflect.TypeOf((*int32)(nil)).Elem())
  173. }
  174. return &int32Codec{}
  175. case reflect.Int64:
  176. if typeName != "int64" {
  177. return decoderOfType(cfg, prefix, reflect.TypeOf((*int64)(nil)).Elem())
  178. }
  179. return &int64Codec{}
  180. case reflect.Uint:
  181. if typeName != "uint" {
  182. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint)(nil)).Elem())
  183. }
  184. return &uintCodec{}
  185. case reflect.Uint8:
  186. if typeName != "uint8" {
  187. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint8)(nil)).Elem())
  188. }
  189. return &uint8Codec{}
  190. case reflect.Uint16:
  191. if typeName != "uint16" {
  192. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint16)(nil)).Elem())
  193. }
  194. return &uint16Codec{}
  195. case reflect.Uint32:
  196. if typeName != "uint32" {
  197. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint32)(nil)).Elem())
  198. }
  199. return &uint32Codec{}
  200. case reflect.Uintptr:
  201. if typeName != "uintptr" {
  202. return decoderOfType(cfg, prefix, reflect.TypeOf((*uintptr)(nil)).Elem())
  203. }
  204. return &uintptrCodec{}
  205. case reflect.Uint64:
  206. if typeName != "uint64" {
  207. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint64)(nil)).Elem())
  208. }
  209. return &uint64Codec{}
  210. case reflect.Float32:
  211. if typeName != "float32" {
  212. return decoderOfType(cfg, prefix, reflect.TypeOf((*float32)(nil)).Elem())
  213. }
  214. return &float32Codec{}
  215. case reflect.Float64:
  216. if typeName != "float64" {
  217. return decoderOfType(cfg, prefix, reflect.TypeOf((*float64)(nil)).Elem())
  218. }
  219. return &float64Codec{}
  220. case reflect.Bool:
  221. if typeName != "bool" {
  222. return decoderOfType(cfg, prefix, reflect.TypeOf((*bool)(nil)).Elem())
  223. }
  224. return &boolCodec{}
  225. case reflect.Interface:
  226. if typ.NumMethod() == 0 {
  227. return &emptyInterfaceCodec{}
  228. }
  229. return &nonEmptyInterfaceCodec{}
  230. case reflect.Struct:
  231. return decoderOfStruct(cfg, prefix, typ)
  232. case reflect.Array:
  233. return decoderOfArray(cfg, prefix, typ)
  234. case reflect.Slice:
  235. return decoderOfSlice(cfg, prefix, typ)
  236. case reflect.Map:
  237. return decoderOfMap(cfg, prefix, typ)
  238. case reflect.Ptr:
  239. return decoderOfOptional(cfg, prefix, typ)
  240. default:
  241. return &lazyErrorDecoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
  242. }
  243. }
  244. func (cfg *frozenConfig) EncoderOf(typ reflect.Type) ValEncoder {
  245. cacheKey := typ
  246. encoder := cfg.getEncoderFromCache(cacheKey)
  247. if encoder != nil {
  248. return encoder
  249. }
  250. encoder = encoderOfType(cfg, "", typ)
  251. if shouldFixOnePtr(typ) {
  252. encoder = &onePtrEncoder{encoder}
  253. }
  254. cfg.addEncoderToCache(cacheKey, encoder)
  255. return encoder
  256. }
  257. type onePtrEncoder struct {
  258. encoder ValEncoder
  259. }
  260. func (encoder *onePtrEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  261. return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr))
  262. }
  263. func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  264. encoder.encoder.Encode(unsafe.Pointer(&ptr), stream)
  265. }
  266. func shouldFixOnePtr(typ reflect.Type) bool {
  267. if isPtrKind(typ.Kind()) {
  268. return true
  269. }
  270. if typ.Kind() == reflect.Struct {
  271. if typ.NumField() != 1 {
  272. return false
  273. }
  274. return shouldFixOnePtr(typ.Field(0).Type)
  275. }
  276. if typ.Kind() == reflect.Array {
  277. if typ.Len() != 1 {
  278. return false
  279. }
  280. return shouldFixOnePtr(typ.Elem())
  281. }
  282. return false
  283. }
  284. func isPtrKind(kind reflect.Kind) bool {
  285. switch kind {
  286. case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func:
  287. return true
  288. }
  289. return false
  290. }
  291. func encoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  292. encoder := getTypeEncoderFromExtension(cfg, typ)
  293. if encoder != nil {
  294. return encoder
  295. }
  296. encoder = createEncoderOfType(cfg, prefix, typ)
  297. for _, extension := range extensions {
  298. encoder = extension.DecorateEncoder(typ, encoder)
  299. }
  300. for _, extension := range cfg.extensions {
  301. encoder = extension.DecorateEncoder(typ, encoder)
  302. }
  303. return encoder
  304. }
  305. func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  306. if typ == jsonRawMessageType {
  307. return &jsonRawMessageCodec{}
  308. }
  309. if typ == jsoniterRawMessageType {
  310. return &jsoniterRawMessageCodec{}
  311. }
  312. if typ.AssignableTo(jsonNumberType) {
  313. return &jsonNumberCodec{}
  314. }
  315. if typ.AssignableTo(jsoniterNumberType) {
  316. return &jsoniterNumberCodec{}
  317. }
  318. if typ == marshalerType {
  319. checkIsEmpty := createCheckIsEmpty(cfg, typ)
  320. var encoder ValEncoder = &directMarshalerEncoder{
  321. checkIsEmpty: checkIsEmpty,
  322. }
  323. return encoder
  324. }
  325. if typ.Implements(marshalerType) {
  326. checkIsEmpty := createCheckIsEmpty(cfg, typ)
  327. var encoder ValEncoder = &marshalerEncoder{
  328. valType: reflect2.Type2(typ),
  329. checkIsEmpty: checkIsEmpty,
  330. }
  331. return encoder
  332. }
  333. ptrType := reflect.PtrTo(typ)
  334. if ptrType.Implements(marshalerType) {
  335. checkIsEmpty := createCheckIsEmpty(cfg, ptrType)
  336. var encoder ValEncoder = &marshalerEncoder{
  337. valType: reflect2.Type2(ptrType),
  338. checkIsEmpty: checkIsEmpty,
  339. }
  340. return &referenceEncoder{encoder}
  341. }
  342. if typ == textMarshalerType {
  343. checkIsEmpty := createCheckIsEmpty(cfg, typ)
  344. var encoder ValEncoder = &directTextMarshalerEncoder{
  345. checkIsEmpty: checkIsEmpty,
  346. stringEncoder: cfg.EncoderOf(reflect.TypeOf("")),
  347. }
  348. return encoder
  349. }
  350. if typ.Implements(textMarshalerType) {
  351. checkIsEmpty := createCheckIsEmpty(cfg, typ)
  352. var encoder ValEncoder = &textMarshalerEncoder{
  353. valType: reflect2.Type2(typ),
  354. stringEncoder: cfg.EncoderOf(reflect.TypeOf("")),
  355. checkIsEmpty: checkIsEmpty,
  356. }
  357. return encoder
  358. }
  359. if typ.Kind() == reflect.Map && ptrType.Implements(textMarshalerType) {
  360. checkIsEmpty := createCheckIsEmpty(cfg, ptrType)
  361. var encoder ValEncoder = &textMarshalerEncoder{
  362. valType: reflect2.Type2(ptrType),
  363. stringEncoder: cfg.EncoderOf(reflect.TypeOf("")),
  364. checkIsEmpty: checkIsEmpty,
  365. }
  366. return &referenceEncoder{encoder}
  367. }
  368. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  369. return &base64Codec{}
  370. }
  371. if typ == anyType {
  372. return &directAnyCodec{}
  373. }
  374. if typ.Implements(anyType) {
  375. return &anyCodec{
  376. valType: reflect2.Type2(typ),
  377. }
  378. }
  379. return createEncoderOfSimpleType(cfg, prefix, typ)
  380. }
  381. func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
  382. kind := typ.Kind()
  383. switch kind {
  384. case reflect.String:
  385. return &stringCodec{}
  386. case reflect.Int:
  387. return &intCodec{}
  388. case reflect.Int8:
  389. return &int8Codec{}
  390. case reflect.Int16:
  391. return &int16Codec{}
  392. case reflect.Int32:
  393. return &int32Codec{}
  394. case reflect.Int64:
  395. return &int64Codec{}
  396. case reflect.Uint:
  397. return &uintCodec{}
  398. case reflect.Uint8:
  399. return &uint8Codec{}
  400. case reflect.Uint16:
  401. return &uint16Codec{}
  402. case reflect.Uint32:
  403. return &uint32Codec{}
  404. case reflect.Uintptr:
  405. return &uintptrCodec{}
  406. case reflect.Uint64:
  407. return &uint64Codec{}
  408. case reflect.Float32:
  409. return &float32Codec{}
  410. case reflect.Float64:
  411. return &float64Codec{}
  412. case reflect.Bool:
  413. return &boolCodec{}
  414. case reflect.Interface:
  415. return &dynamicEncoder{reflect2.Type2(typ)}
  416. case reflect.Struct:
  417. return &structEncoder{typ: typ}
  418. case reflect.Array:
  419. return &arrayEncoder{}
  420. case reflect.Slice:
  421. return &sliceEncoder{}
  422. case reflect.Map:
  423. return encoderOfMap(cfg, "", typ)
  424. case reflect.Ptr:
  425. return &OptionalEncoder{}
  426. default:
  427. return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)}
  428. }
  429. }
  430. func createEncoderOfSimpleType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  431. typeName := typ.String()
  432. kind := typ.Kind()
  433. switch kind {
  434. case reflect.String:
  435. if typeName != "string" {
  436. return encoderOfType(cfg, prefix, reflect.TypeOf((*string)(nil)).Elem())
  437. }
  438. return &stringCodec{}
  439. case reflect.Int:
  440. if typeName != "int" {
  441. return encoderOfType(cfg, prefix, reflect.TypeOf((*int)(nil)).Elem())
  442. }
  443. return &intCodec{}
  444. case reflect.Int8:
  445. if typeName != "int8" {
  446. return encoderOfType(cfg, prefix, reflect.TypeOf((*int8)(nil)).Elem())
  447. }
  448. return &int8Codec{}
  449. case reflect.Int16:
  450. if typeName != "int16" {
  451. return encoderOfType(cfg, prefix, reflect.TypeOf((*int16)(nil)).Elem())
  452. }
  453. return &int16Codec{}
  454. case reflect.Int32:
  455. if typeName != "int32" {
  456. return encoderOfType(cfg, prefix, reflect.TypeOf((*int32)(nil)).Elem())
  457. }
  458. return &int32Codec{}
  459. case reflect.Int64:
  460. if typeName != "int64" {
  461. return encoderOfType(cfg, prefix, reflect.TypeOf((*int64)(nil)).Elem())
  462. }
  463. return &int64Codec{}
  464. case reflect.Uint:
  465. if typeName != "uint" {
  466. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint)(nil)).Elem())
  467. }
  468. return &uintCodec{}
  469. case reflect.Uint8:
  470. if typeName != "uint8" {
  471. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint8)(nil)).Elem())
  472. }
  473. return &uint8Codec{}
  474. case reflect.Uint16:
  475. if typeName != "uint16" {
  476. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint16)(nil)).Elem())
  477. }
  478. return &uint16Codec{}
  479. case reflect.Uint32:
  480. if typeName != "uint32" {
  481. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint32)(nil)).Elem())
  482. }
  483. return &uint32Codec{}
  484. case reflect.Uintptr:
  485. if typeName != "uintptr" {
  486. return encoderOfType(cfg, prefix, reflect.TypeOf((*uintptr)(nil)).Elem())
  487. }
  488. return &uintptrCodec{}
  489. case reflect.Uint64:
  490. if typeName != "uint64" {
  491. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint64)(nil)).Elem())
  492. }
  493. return &uint64Codec{}
  494. case reflect.Float32:
  495. if typeName != "float32" {
  496. return encoderOfType(cfg, prefix, reflect.TypeOf((*float32)(nil)).Elem())
  497. }
  498. return &float32Codec{}
  499. case reflect.Float64:
  500. if typeName != "float64" {
  501. return encoderOfType(cfg, prefix, reflect.TypeOf((*float64)(nil)).Elem())
  502. }
  503. return &float64Codec{}
  504. case reflect.Bool:
  505. if typeName != "bool" {
  506. return encoderOfType(cfg, prefix, reflect.TypeOf((*bool)(nil)).Elem())
  507. }
  508. return &boolCodec{}
  509. case reflect.Interface:
  510. return &dynamicEncoder{reflect2.Type2(typ)}
  511. case reflect.Struct:
  512. return encoderOfStruct(cfg, prefix, typ)
  513. case reflect.Array:
  514. return encoderOfArray(cfg, prefix, typ)
  515. case reflect.Slice:
  516. return encoderOfSlice(cfg, prefix, typ)
  517. case reflect.Map:
  518. return encoderOfMap(cfg, prefix, typ)
  519. case reflect.Ptr:
  520. return encoderOfOptional(cfg, prefix, typ)
  521. default:
  522. return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
  523. }
  524. }
  525. type placeholderDecoder struct {
  526. cfg *frozenConfig
  527. cacheKey reflect.Type
  528. }
  529. func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  530. for i := 0; i < 500; i++ {
  531. realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
  532. _, isPlaceholder := realDecoder.(*placeholderDecoder)
  533. if isPlaceholder {
  534. time.Sleep(10 * time.Millisecond)
  535. } else {
  536. realDecoder.Decode(ptr, iter)
  537. return
  538. }
  539. }
  540. panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey))
  541. }
  542. type lazyErrorDecoder struct {
  543. err error
  544. }
  545. func (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  546. if iter.WhatIsNext() != NilValue {
  547. if iter.Error == nil {
  548. iter.Error = decoder.err
  549. }
  550. } else {
  551. iter.Skip()
  552. }
  553. }
  554. type lazyErrorEncoder struct {
  555. err error
  556. }
  557. func (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  558. if ptr == nil {
  559. stream.WriteNil()
  560. } else if stream.Error == nil {
  561. stream.Error = encoder.err
  562. }
  563. }
  564. func (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  565. return false
  566. }
  567. func extractInterface(val interface{}) emptyInterface {
  568. return *((*emptyInterface)(unsafe.Pointer(&val)))
  569. }
  570. // emptyInterface is the header for an interface{} value.
  571. type emptyInterface struct {
  572. typ unsafe.Pointer
  573. word unsafe.Pointer
  574. }
  575. // emptyInterface is the header for an interface with method (not interface{})
  576. type nonEmptyInterface struct {
  577. // see ../runtime/iface.go:/Itab
  578. itab *struct {
  579. ityp unsafe.Pointer // static interface type
  580. typ unsafe.Pointer // dynamic concrete type
  581. link unsafe.Pointer
  582. bad int32
  583. unused int32
  584. fun [100000]unsafe.Pointer // method table
  585. }
  586. word unsafe.Pointer
  587. }