anonymous_field.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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. }
  32. func (d *anonymousFieldDecoder) DecodePath(ctx *RuntimeContext, cursor, depth int64) ([][]byte, int64, error) {
  33. return d.dec.DecodePath(ctx, cursor, depth)
  34. }