feature_reflect.go 17 KB

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