Skip to content

Commit 76c9e09

Browse files
committed
all: avoid accessing ExtensionField.Desc directly
CL/180538 adds methods to ExtensionFieldV1 to provide the illusion that it only operates with protoreflect.ExtensionType. Use that instead of touching the Desc field directly. Change-Id: If6770920707ea3f277c6cfd7caf40c7ca3b0aa6f Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/180577 Reviewed-by: Damien Neil <[email protected]>
1 parent a1331f0 commit 76c9e09

File tree

14 files changed

+79
-32
lines changed

14 files changed

+79
-32
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ module github.com/golang/protobuf
22

33
go 1.9
44

5-
require google.golang.org/protobuf v0.0.0-20190522194032-21ade498bd69
5+
require google.golang.org/protobuf v0.0.0-20190605195314-89d49632e5cf

go.sum

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ github.com/golang/protobuf v1.2.1-0.20190514181236-7800af189d76/go.mod h1:Zfz6qc
22
github.com/golang/protobuf v1.2.1-0.20190515194842-7574ba03306e/go.mod h1:GjgUz9uwrRQmdPBBrFqiVbojAmlpy6ryM6DCzC+20rE=
33
github.com/golang/protobuf v1.2.1-0.20190516201927-a2cd3ac1b343/go.mod h1:PScGDF2x230A126tLt9Ol9RjhXzbiPJrt/CogooD2mE=
44
github.com/golang/protobuf v1.2.1-0.20190516215712-ae2eaafab405/go.mod h1:UmP8hhPKR5WWIjbT9v0JEVT+U0DBSjbW8KaZVeyFfRE=
5+
github.com/golang/protobuf v1.2.1-0.20190523175523-a1331f0b4ab4/go.mod h1:G+fNMoyvKWZDB7PCDHF+dXbH9OeE3+JoozCd9V7i66U=
56
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
67
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
78
google.golang.org/protobuf v0.0.0-20190514172829-e89e6244e0e8/go.mod h1:791zQGC15vDqjpmPRn1uGPu5oHy/Jzw/Q1n5JsgIIcY=
89
google.golang.org/protobuf v0.0.0-20190514231807-cdb777356907/go.mod h1:HeRLsKXv4+wE27dOIGwnqcOgq6a1O/GJ7mGhiEPnBrU=
910
google.golang.org/protobuf v0.0.0-20190516201745-40b83d67fc75/go.mod h1:jf+u8AHuKtkib+0J4/bQXPNzCmT3V9a02hVzYKtatuw=
1011
google.golang.org/protobuf v0.0.0-20190516215540-a95b29fbf623/go.mod h1:cWWmz5lsCWIcqGLROrKq5Lu231IJw2PzqOZ8cgspbfY=
11-
google.golang.org/protobuf v0.0.0-20190522194032-21ade498bd69 h1:C4vak6RNv+6SZeonQPm8QpfDoEd2jwk0zmv/XjuhaXc=
1212
google.golang.org/protobuf v0.0.0-20190522194032-21ade498bd69/go.mod h1:cJytyYi/6qdwy/+gD49hmgHcwD7zhWxE/1KPEslaZ3M=
13+
google.golang.org/protobuf v0.0.0-20190605195314-89d49632e5cf h1:O9EJAZHrXZ8fKtT5e+sEc2u/izLtNaXiwHhthZEtsSs=
14+
google.golang.org/protobuf v0.0.0-20190605195314-89d49632e5cf/go.mod h1:Btug4TBaP5wNYcb2zGKDTS7WMcaPPLuqEAKfEAZWYbo=

proto/clone.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) {
208208

209209
func mergeExtension(out, in *extensionMap) {
210210
in.Range(func(extNum protoreflect.FieldNumber, eIn Extension) bool {
211-
eOut := Extension{Desc: eIn.Desc}
211+
var eOut Extension
212+
eOut.SetType(eIn.GetType())
212213
if eIn.HasValue() {
213214
v := reflect.New(reflect.TypeOf(eIn.GetValue())).Elem()
214215
mergeAny(v, reflect.ValueOf(eIn.GetValue()), false, nil)

proto/extensions.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
270270
e := epb.Get(protoreflect.FieldNumber(extension.Field))
271271
if e.HasValue() {
272272
// Already decoded. Check the descriptor, though.
273-
if e.Desc != extension {
273+
if protoimpl.X.ExtensionDescFromType(e.GetType()) != extension {
274274
// This shouldn't happen. If it does, it means that
275275
// GetExtension was called twice with two different
276276
// descriptors with the same field number.
@@ -292,7 +292,7 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
292292

293293
// Remember the decoded version and drop the encoded version.
294294
// That way it is safe to mutate what we return.
295-
e.Desc = extension
295+
e.SetType(protoimpl.X.ExtensionTypeFromDesc(extension))
296296
e.SetEagerValue(extensionAsStorageType(v))
297297
unrecognized.SetBytes(removeRawFields(unrecognized.Bytes(), fnum))
298298
epb.Set(protoreflect.FieldNumber(extension.Field), e)
@@ -404,7 +404,7 @@ func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) {
404404
}
405405
extensions := make([]*ExtensionDesc, 0, epb.Len())
406406
epb.Range(func(extid protoreflect.FieldNumber, e Extension) bool {
407-
desc := e.Desc
407+
desc := protoimpl.X.ExtensionDescFromType(e.GetType())
408408
if desc == nil {
409409
desc = registeredExtensions[int32(extid)]
410410
if desc == nil {
@@ -461,7 +461,8 @@ func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error
461461
return fmt.Errorf("proto: SetExtension called with nil value of type %T", value)
462462
}
463463

464-
x := Extension{Desc: extension}
464+
var x Extension
465+
x.SetType(protoimpl.X.ExtensionTypeFromDesc(extension))
465466
x.SetEagerValue(extensionAsStorageType(value))
466467
epb.Set(protoreflect.FieldNumber(extension.Field), x)
467468
return nil

proto/table_marshal.go

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818

1919
"github.com/golang/protobuf/internal/wire"
2020
"google.golang.org/protobuf/reflect/protoreflect"
21+
"google.golang.org/protobuf/runtime/protoimpl"
2122
)
2223

2324
// a sizer takes a pointer to a field and the size of its tag, computes the size of
@@ -2373,14 +2374,14 @@ func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int {
23732374

23742375
n := 0
23752376
m.Range(func(_ protoreflect.FieldNumber, e Extension) bool {
2376-
if e.Desc == nil || !e.HasValue() {
2377+
if !e.HasType() || !e.HasValue() {
23772378
return true // should never happen
23782379
}
23792380

23802381
// We don't skip extensions that have an encoded form set,
23812382
// because the extension value may have been mutated after
23822383
// the last time this function was called.
2383-
ei := u.getExtElemInfo(e.Desc)
2384+
ei := u.getExtElemInfo(protoimpl.X.ExtensionDescFromType(e.GetType()))
23842385
v := e.GetValue()
23852386
p := toAddrPointer(&v, ei.isptr, ei.deref)
23862387
n += ei.sizer(p, ei.tagsize)
@@ -2403,15 +2404,15 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
24032404
// Don't bother sorting the keys.
24042405
if m.Len() <= 1 {
24052406
m.Range(func(_ protoreflect.FieldNumber, e Extension) bool {
2406-
if e.Desc == nil || !e.HasValue() {
2407+
if !e.HasType() || !e.HasValue() {
24072408
return true // should never happen
24082409
}
24092410

24102411
// We don't skip extensions that have an encoded form set,
24112412
// because the extension value may have been mutated after
24122413
// the last time this function was called.
24132414

2414-
ei := u.getExtElemInfo(e.Desc)
2415+
ei := u.getExtElemInfo(protoimpl.X.ExtensionDescFromType(e.GetType()))
24152416
v := e.GetValue()
24162417
p := toAddrPointer(&v, ei.isptr, ei.deref)
24172418
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
@@ -2435,15 +2436,15 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
24352436

24362437
for _, k := range keys {
24372438
e := m.Get(protoreflect.FieldNumber(k))
2438-
if e.Desc == nil || !e.HasValue() {
2439+
if !e.HasType() || !e.HasValue() {
24392440
continue // should never happen
24402441
}
24412442

24422443
// We don't skip extensions that have an encoded form set,
24432444
// because the extension value may have been mutated after
24442445
// the last time this function was called.
24452446

2446-
ei := u.getExtElemInfo(e.Desc)
2447+
ei := u.getExtElemInfo(protoimpl.X.ExtensionDescFromType(e.GetType()))
24472448
v := e.GetValue()
24482449
p := toAddrPointer(&v, ei.isptr, ei.deref)
24492450
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
@@ -2475,15 +2476,15 @@ func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions, unk []byte) in
24752476
n += 2 // start group, end group. tag = 1 (size=1)
24762477
n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1)
24772478

2478-
if e.Desc == nil || !e.HasValue() {
2479+
if !e.HasType() || !e.HasValue() {
24792480
return true // should never happen
24802481
}
24812482

24822483
// We don't skip extensions that have an encoded form set,
24832484
// because the extension value may have been mutated after
24842485
// the last time this function was called.
24852486

2486-
ei := u.getExtElemInfo(e.Desc)
2487+
ei := u.getExtElemInfo(protoimpl.X.ExtensionDescFromType(e.GetType()))
24872488
v := e.GetValue()
24882489
p := toAddrPointer(&v, ei.isptr, ei.deref)
24892490
n += ei.sizer(p, 1) // message, tag = 3 (size=1)
@@ -2528,15 +2529,15 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
25282529
b = append(b, 2<<3|WireVarint)
25292530
b = appendVarint(b, uint64(id))
25302531

2531-
if e.Desc == nil || !e.HasValue() {
2532+
if !e.HasType() || !e.HasValue() {
25322533
return true // should never happen
25332534
}
25342535

25352536
// We don't skip extensions that have an encoded form set,
25362537
// because the extension value may have been mutated after
25372538
// the last time this function was called.
25382539

2539-
ei := u.getExtElemInfo(e.Desc)
2540+
ei := u.getExtElemInfo(protoimpl.X.ExtensionDescFromType(e.GetType()))
25402541
v := e.GetValue()
25412542
p := toAddrPointer(&v, ei.isptr, ei.deref)
25422543
b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
@@ -2583,15 +2584,15 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
25832584
b = append(b, 2<<3|WireVarint)
25842585
b = appendVarint(b, uint64(id))
25852586

2586-
if e.Desc == nil || !e.HasValue() {
2587+
if !e.HasType() || !e.HasValue() {
25872588
continue // should never happen
25882589
}
25892590

25902591
// We don't skip extensions that have an encoded form set,
25912592
// because the extension value may have been mutated after
25922593
// the last time this function was called.
25932594

2594-
ei := u.getExtElemInfo(e.Desc)
2595+
ei := u.getExtElemInfo(protoimpl.X.ExtensionDescFromType(e.GetType()))
25952596
v := e.GetValue()
25962597
p := toAddrPointer(&v, ei.isptr, ei.deref)
25972598
b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
@@ -2630,15 +2631,15 @@ func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int {
26302631

26312632
n := 0
26322633
for _, e := range m {
2633-
if e.Desc == nil || !e.HasValue() {
2634+
if !e.HasType() || !e.HasValue() {
26342635
continue // should never happen
26352636
}
26362637

26372638
// We don't skip extensions that have an encoded form set,
26382639
// because the extension value may have been mutated after
26392640
// the last time this function was called.
26402641

2641-
ei := u.getExtElemInfo(e.Desc)
2642+
ei := u.getExtElemInfo(protoimpl.X.ExtensionDescFromType(e.GetType()))
26422643
v := e.GetValue()
26432644
p := toAddrPointer(&v, ei.isptr, ei.deref)
26442645
n += ei.sizer(p, ei.tagsize)
@@ -2663,15 +2664,15 @@ func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, determ
26632664
var nerr nonFatal
26642665
for _, k := range keys {
26652666
e := m[int32(k)]
2666-
if e.Desc == nil || !e.HasValue() {
2667+
if !e.HasType() || !e.HasValue() {
26672668
continue // should never happen
26682669
}
26692670

26702671
// We don't skip extensions that have an encoded form set,
26712672
// because the extension value may have been mutated after
26722673
// the last time this function was called.
26732674

2674-
ei := u.getExtElemInfo(e.Desc)
2675+
ei := u.getExtElemInfo(protoimpl.X.ExtensionDescFromType(e.GetType()))
26752676
v := e.GetValue()
26762677
p := toAddrPointer(&v, ei.isptr, ei.deref)
26772678
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)

proto/table_unmarshal.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"unicode/utf8"
1818

1919
"github.com/golang/protobuf/internal/wire"
20+
"google.golang.org/protobuf/runtime/protoimpl"
2021
)
2122

2223
// Unmarshal is the entry point from the generated .pb.go files.
@@ -274,7 +275,8 @@ func unmarshalExtensions(mi Message, unrecognized *[]byte) error {
274275
}
275276

276277
// Store the value into the extension field.
277-
x := Extension{Desc: extDesc}
278+
var x Extension
279+
x.SetType(protoimpl.X.ExtensionTypeFromDesc(extDesc))
278280
x.SetEagerValue(extensionAsStorageType(fieldVal.Interface()))
279281
extFields.Set(fieldNum, x)
280282
}

protoc-gen-go/descriptor/descriptor.pb.go

Lines changed: 6 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

protoc-gen-go/plugin/plugin.pb.go

Lines changed: 6 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ptypes/any/any.pb.go

Lines changed: 6 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ptypes/duration/duration.pb.go

Lines changed: 6 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)