5
5
package proto
6
6
7
7
import (
8
+ "github.com/golang/protobuf/internal/wire"
8
9
pref "google.golang.org/protobuf/reflect/protoreflect"
9
10
"google.golang.org/protobuf/runtime/protoimpl"
10
11
)
@@ -28,32 +29,25 @@ func DiscardUnknown(m Message) {
28
29
}
29
30
30
31
func discardUnknown (m pref.Message ) {
31
- fieldDescs := m .Descriptor ().Fields ()
32
- knownFields := m .KnownFields ()
33
- knownFields .Range (func (num pref.FieldNumber , val pref.Value ) bool {
34
- fd := fieldDescs .ByNumber (num )
35
- if fd == nil {
36
- fd = knownFields .ExtensionTypes ().ByNumber (num ).Descriptor ()
37
- }
32
+ m .Range (func (fd pref.FieldDescriptor , val pref.Value ) bool {
38
33
switch {
39
34
// Handle singular message.
40
35
case fd .Cardinality () != pref .Repeated :
41
- if k := fd .Kind (); k == pref . MessageKind || k == pref . GroupKind {
42
- discardUnknown (knownFields .Get (num ).Message ())
36
+ if fd .Message () != nil {
37
+ discardUnknown (m .Get (fd ).Message ())
43
38
}
44
39
// Handle list of messages.
45
- case ! fd .IsMap ():
46
- if k := fd .Kind (); k == pref . MessageKind || k == pref . GroupKind {
47
- ls := knownFields .Get (num ).List ()
40
+ case fd .IsList ():
41
+ if fd .Message () != nil {
42
+ ls := m .Get (fd ).List ()
48
43
for i := 0 ; i < ls .Len (); i ++ {
49
44
discardUnknown (ls .Get (i ).Message ())
50
45
}
51
46
}
52
47
// Handle map of messages.
53
- default :
54
- k := fd .Message ().Fields ().ByNumber (2 ).Kind ()
55
- if k == pref .MessageKind || k == pref .GroupKind {
56
- ms := knownFields .Get (num ).Map ()
48
+ case fd .IsMap ():
49
+ if fd .MapValue ().Message () != nil {
50
+ ms := m .Get (fd ).Map ()
57
51
ms .Range (func (_ pref.MapKey , v pref.Value ) bool {
58
52
discardUnknown (v .Message ())
59
53
return true
@@ -63,14 +57,19 @@ func discardUnknown(m pref.Message) {
63
57
return true
64
58
})
65
59
60
+ // Discard unknown fields.
61
+ var bo pref.RawFields
66
62
extRanges := m .Descriptor ().ExtensionRanges ()
67
- unknownFields := m .UnknownFields ()
68
- unknownFields .Range (func (num pref.FieldNumber , _ pref.RawFields ) bool {
63
+ for bi := m .GetUnknown (); len (bi ) > 0 ; {
69
64
// NOTE: Historically, this function did not discard unknown fields
70
65
// that were within the extension field ranges.
71
- if ! extRanges .Has (num ) {
72
- unknownFields .Set (num , nil )
66
+ num , _ , n := wire .ConsumeField (bi )
67
+ if extRanges .Has (num ) {
68
+ bo = append (bo , bi [:n ]... )
73
69
}
74
- return true
75
- })
70
+ bi = bi [n :]
71
+ }
72
+ if bi := m .GetUnknown (); len (bi ) != len (bo ) {
73
+ m .SetUnknown (bo )
74
+ }
76
75
}
0 commit comments