anonymous_field.go 1005 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package decoder
  2. import (
  3. "unsafe"
  4. "github.com/goccy/go-json/internal/runtime"
  5. )
  6. type anonymousFieldDecoder struct {
  7. structType *runtime.Type
  8. offset uintptr
  9. dec Decoder
  10. }
  11. func newAnonymousFieldDecoder(structType *runtime.Type, offset uintptr, dec Decoder) *anonymousFieldDecoder {
  12. return &anonymousFieldDecoder{
  13. structType: structType,
  14. offset: offset,
  15. dec: dec,
  16. }
  17. }
  18. func (d *anonymousFieldDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
  19. if *(*unsafe.Pointer)(p) == nil {
  20. *(*unsafe.Pointer)(p) = unsafe_New(d.structType)
  21. }
  22. p = *(*unsafe.Pointer)(p)
  23. return d.dec.DecodeStream(s, depth, unsafe.Pointer(uintptr(p)+d.offset))
  24. }
  25. func (d *anonymousFieldDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  26. if *(*unsafe.Pointer)(p) == nil {
  27. *(*unsafe.Pointer)(p) = unsafe_New(d.structType)
  28. }
  29. p = *(*unsafe.Pointer)(p)
  30. return d.dec.Decode(ctx, cursor, depth, unsafe.Pointer(uintptr(p)+d.offset))
  31. }