| 844 | } |
| 845 | |
| 846 | func (dec *Decoder) DecodeCPtr(cptr uintptr, dest any) (err error) { |
| 847 | |
| 848 | pl := &payloadIface{p: cptr, t: &dec.state.payloadType} |
| 849 | |
| 850 | dec.state.lock.RLock() |
| 851 | defer dec.state.lock.RUnlock() |
| 852 | |
| 853 | tuple := pl.getBytes(0, 0) |
| 854 | ser := &Serializer{buf: tuple} |
| 855 | |
| 856 | defer func() { |
| 857 | if ret := recover(); ret != nil { |
| 858 | if dec.loggerOwner != nil { |
| 859 | if logger := dec.loggerOwner.GetLogger(); logger != nil { |
| 860 | logger.Printf(bindings.ERROR, |
| 861 | "Interface: %#v\nRead position: %d\nTags(v%d): %v\nPayload Type: %+v\nPayload Value: %v\nTags cache: %+v\nData dump:\n%s\nError: %v\nTagsMatcher: { state_token: 0x%08X, version: %d }\n", |
| 862 | dest, |
| 863 | ser.Pos(), |
| 864 | dec.state.Version, |
| 865 | dec.state.tagsMatcher.Names, |
| 866 | dec.state.payloadType.Fields, |
| 867 | pl.getAsMap(), |
| 868 | dec.state.structCache, |
| 869 | hex.Dump(ser.Bytes()), |
| 870 | ret, |
| 871 | uint32(dec.state.StateToken), |
| 872 | dec.state.Version, |
| 873 | ) |
| 874 | } |
| 875 | } |
| 876 | switch v := ret.(type) { |
| 877 | case error: |
| 878 | err = v |
| 879 | default: |
| 880 | err = fmt.Errorf("rq: DecodeCPtr error: %v", ret) |
| 881 | } |
| 882 | } |
| 883 | }() |
| 884 | |
| 885 | fieldsoutcnt := make([]int, MaxIndexes) |
| 886 | ctagsPath := make([]int16, 0, 16) |
| 887 | |
| 888 | dec.decodeValue(pl, ser, reflect.ValueOf(dest), fieldsoutcnt, ctagsPath) |
| 889 | if !ser.Eof() { |
| 890 | panic(fmt.Errorf("internal error - left unparsed data")) |
| 891 | } |
| 892 | return err |
| 893 | } |
| 894 | |
| 895 | func (dec *Decoder) Finalize() { |
| 896 | if dec.ser != nil { |