Skip to content

Commit a2cd3ac

Browse files
committed
proto: use opaque GetValue and SetEagerValue extension methods
CL/177619 adds scaffolding to support lazy extensions. This CL changes the v1 logic to call the equivalent opaque methods. This CL does not add lazy extension support. Change-Id: I7954f87a6ec59b06ad2e034f625bb4fc40c8aefd Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/177620 Reviewed-by: Damien Neil <[email protected]>
1 parent 7574ba0 commit a2cd3ac

File tree

8 files changed

+41
-41
lines changed

8 files changed

+41
-41
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-20190514231807-cdb777356907
5+
require google.golang.org/protobuf v0.0.0-20190516201745-40b83d67fc75

go.sum

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
github.com/golang/protobuf v1.2.1-0.20190514181236-7800af189d76/go.mod h1:Zfz6qcDoDBESdv6JsKsGpgNHnkvwJAJwcA9eL+mOkgc=
2+
github.com/golang/protobuf v1.2.1-0.20190515194842-7574ba03306e/go.mod h1:GjgUz9uwrRQmdPBBrFqiVbojAmlpy6ryM6DCzC+20rE=
3+
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
24
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
3-
google.golang.org/protobuf v0.0.0-20190514172829-e89e6244e0e8 h1:W21IHLlUZTOSWPAugb7YF/zA4lu4QlPm7T5JwlKYstQ=
45
google.golang.org/protobuf v0.0.0-20190514172829-e89e6244e0e8/go.mod h1:791zQGC15vDqjpmPRn1uGPu5oHy/Jzw/Q1n5JsgIIcY=
5-
google.golang.org/protobuf v0.0.0-20190514231807-cdb777356907 h1:KmA4pf+bs1ucZ/8YCj/VXK0/mkK1olh/jzYhKYiebFE=
66
google.golang.org/protobuf v0.0.0-20190514231807-cdb777356907/go.mod h1:HeRLsKXv4+wE27dOIGwnqcOgq6a1O/GJ7mGhiEPnBrU=
7+
google.golang.org/protobuf v0.0.0-20190516201745-40b83d67fc75 h1:A9hovAkRmyzyLP+RCw0M+tVW0Ku3SZlCPLiABrEQJW0=
8+
google.golang.org/protobuf v0.0.0-20190516201745-40b83d67fc75/go.mod h1:jf+u8AHuKtkib+0J4/bQXPNzCmT3V9a02hVzYKtatuw=

proto/clone.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,10 @@ func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) {
209209
func mergeExtension(out, in *extensionMap) {
210210
in.Range(func(extNum protoreflect.FieldNumber, eIn Extension) bool {
211211
eOut := Extension{Desc: eIn.Desc}
212-
if eIn.Value != nil {
213-
v := reflect.New(reflect.TypeOf(eIn.Value)).Elem()
214-
mergeAny(v, reflect.ValueOf(eIn.Value), false, nil)
215-
eOut.Value = v.Interface()
212+
if eIn.HasValue() {
213+
v := reflect.New(reflect.TypeOf(eIn.GetValue())).Elem()
214+
mergeAny(v, reflect.ValueOf(eIn.GetValue()), false, nil)
215+
eOut.SetEagerValue(v.Interface())
216216
}
217217

218218
out.Set(extNum, eOut)

proto/discard.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func (di *discardInfo) discard(src pointer) {
104104
// that have been accessed via GetExtension.
105105
if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil {
106106
em.Range(func(_ protoreflect.FieldNumber, mx Extension) bool {
107-
if m, ok := mx.Value.(Message); ok {
107+
if m, ok := mx.GetValue().(Message); ok {
108108
DiscardUnknown(m)
109109
}
110110
return true
@@ -319,7 +319,7 @@ func discardLegacy(m Message) {
319319
// that have been accessed via GetExtension.
320320
if em, err := extendable(m); err == nil {
321321
em.Range(func(_ protoreflect.FieldNumber, mx Extension) bool {
322-
if m, ok := mx.Value.(Message); ok {
322+
if m, ok := mx.GetValue().(Message); ok {
323323
discardLegacy(m)
324324
}
325325
return true

proto/equal.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ func equalExtensions(base reflect.Type, em1, em2 *extensionMap) bool {
219219
}
220220
e2 := em2.Get(extNum)
221221

222-
m1 := extensionAsLegacyType(e1.Value)
223-
m2 := extensionAsLegacyType(e2.Value)
222+
m1 := extensionAsLegacyType(e1.GetValue())
223+
m2 := extensionAsLegacyType(e2.GetValue())
224224

225225
if m1 == nil && m2 == nil {
226226
return true

proto/extensions.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -268,15 +268,15 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
268268
}
269269

270270
e := epb.Get(protoreflect.FieldNumber(extension.Field))
271-
if e.Value != nil {
271+
if e.HasValue() {
272272
// Already decoded. Check the descriptor, though.
273273
if e.Desc != 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.
277277
return nil, errors.New("proto: descriptor conflict")
278278
}
279-
return extensionAsLegacyType(e.Value), nil
279+
return extensionAsLegacyType(e.GetValue()), nil
280280
}
281281

282282
// Descriptor without type information.
@@ -292,11 +292,11 @@ 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.Value = extensionAsStorageType(v)
296295
e.Desc = extension
296+
e.SetEagerValue(extensionAsStorageType(v))
297297
unrecognized.SetBytes(removeRawFields(unrecognized.Bytes(), fnum))
298298
epb.Set(protoreflect.FieldNumber(extension.Field), e)
299-
return extensionAsLegacyType(e.Value), nil
299+
return extensionAsLegacyType(e.GetValue()), nil
300300
}
301301

302302
// defaultExtensionValue returns the default value for extension.
@@ -461,10 +461,9 @@ 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-
epb.Set(protoreflect.FieldNumber(extension.Field), Extension{
465-
Desc: extension,
466-
Value: extensionAsStorageType(value),
467-
})
464+
x := Extension{Desc: extension}
465+
x.SetEagerValue(extensionAsStorageType(value))
466+
epb.Set(protoreflect.FieldNumber(extension.Field), x)
468467
return nil
469468
}
470469

proto/table_marshal.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2373,15 +2373,15 @@ func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int {
23732373

23742374
n := 0
23752375
m.Range(func(_ protoreflect.FieldNumber, e Extension) bool {
2376-
if e.Value == nil || e.Desc == nil {
2376+
if e.Desc == nil || !e.HasValue() {
23772377
return true // should never happen
23782378
}
23792379

23802380
// We don't skip extensions that have an encoded form set,
23812381
// because the extension value may have been mutated after
23822382
// the last time this function was called.
23832383
ei := u.getExtElemInfo(e.Desc)
2384-
v := e.Value
2384+
v := e.GetValue()
23852385
p := toAddrPointer(&v, ei.isptr, ei.deref)
23862386
n += ei.sizer(p, ei.tagsize)
23872387
return true
@@ -2403,7 +2403,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
24032403
// Don't bother sorting the keys.
24042404
if m.Len() <= 1 {
24052405
m.Range(func(_ protoreflect.FieldNumber, e Extension) bool {
2406-
if e.Value == nil || e.Desc == nil {
2406+
if e.Desc == nil || !e.HasValue() {
24072407
return true // should never happen
24082408
}
24092409

@@ -2412,7 +2412,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
24122412
// the last time this function was called.
24132413

24142414
ei := u.getExtElemInfo(e.Desc)
2415-
v := e.Value
2415+
v := e.GetValue()
24162416
p := toAddrPointer(&v, ei.isptr, ei.deref)
24172417
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
24182418
if !nerr.Merge(err) {
@@ -2435,7 +2435,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
24352435

24362436
for _, k := range keys {
24372437
e := m.Get(protoreflect.FieldNumber(k))
2438-
if e.Value == nil || e.Desc == nil {
2438+
if e.Desc == nil || !e.HasValue() {
24392439
continue // should never happen
24402440
}
24412441

@@ -2444,7 +2444,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
24442444
// the last time this function was called.
24452445

24462446
ei := u.getExtElemInfo(e.Desc)
2447-
v := e.Value
2447+
v := e.GetValue()
24482448
p := toAddrPointer(&v, ei.isptr, ei.deref)
24492449
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
24502450
if !nerr.Merge(err) {
@@ -2475,7 +2475,7 @@ func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions, unk []byte) in
24752475
n += 2 // start group, end group. tag = 1 (size=1)
24762476
n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1)
24772477

2478-
if e.Value == nil || e.Desc == nil {
2478+
if e.Desc == nil || !e.HasValue() {
24792479
return true // should never happen
24802480
}
24812481

@@ -2484,7 +2484,7 @@ func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions, unk []byte) in
24842484
// the last time this function was called.
24852485

24862486
ei := u.getExtElemInfo(e.Desc)
2487-
v := e.Value
2487+
v := e.GetValue()
24882488
p := toAddrPointer(&v, ei.isptr, ei.deref)
24892489
n += ei.sizer(p, 1) // message, tag = 3 (size=1)
24902490
return true
@@ -2528,7 +2528,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
25282528
b = append(b, 2<<3|WireVarint)
25292529
b = appendVarint(b, uint64(id))
25302530

2531-
if e.Value == nil || e.Desc == nil {
2531+
if e.Desc == nil || !e.HasValue() {
25322532
return true // should never happen
25332533
}
25342534

@@ -2537,7 +2537,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
25372537
// the last time this function was called.
25382538

25392539
ei := u.getExtElemInfo(e.Desc)
2540-
v := e.Value
2540+
v := e.GetValue()
25412541
p := toAddrPointer(&v, ei.isptr, ei.deref)
25422542
b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
25432543
if !nerr.Merge(err) {
@@ -2583,7 +2583,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
25832583
b = append(b, 2<<3|WireVarint)
25842584
b = appendVarint(b, uint64(id))
25852585

2586-
if e.Value == nil || e.Desc == nil {
2586+
if e.Desc == nil || !e.HasValue() {
25872587
continue // should never happen
25882588
}
25892589

@@ -2592,7 +2592,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
25922592
// the last time this function was called.
25932593

25942594
ei := u.getExtElemInfo(e.Desc)
2595-
v := e.Value
2595+
v := e.GetValue()
25962596
p := toAddrPointer(&v, ei.isptr, ei.deref)
25972597
b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
25982598
b = append(b, 1<<3|WireEndGroup)
@@ -2630,7 +2630,7 @@ func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int {
26302630

26312631
n := 0
26322632
for _, e := range m {
2633-
if e.Value == nil || e.Desc == nil {
2633+
if e.Desc == nil || !e.HasValue() {
26342634
continue // should never happen
26352635
}
26362636

@@ -2639,7 +2639,7 @@ func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int {
26392639
// the last time this function was called.
26402640

26412641
ei := u.getExtElemInfo(e.Desc)
2642-
v := e.Value
2642+
v := e.GetValue()
26432643
p := toAddrPointer(&v, ei.isptr, ei.deref)
26442644
n += ei.sizer(p, ei.tagsize)
26452645
}
@@ -2663,7 +2663,7 @@ func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, determ
26632663
var nerr nonFatal
26642664
for _, k := range keys {
26652665
e := m[int32(k)]
2666-
if e.Value == nil || e.Desc == nil {
2666+
if e.Desc == nil || !e.HasValue() {
26672667
continue // should never happen
26682668
}
26692669

@@ -2672,7 +2672,7 @@ func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, determ
26722672
// the last time this function was called.
26732673

26742674
ei := u.getExtElemInfo(e.Desc)
2675-
v := e.Value
2675+
v := e.GetValue()
26762676
p := toAddrPointer(&v, ei.isptr, ei.deref)
26772677
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
26782678
if !nerr.Merge(err) {

proto/table_unmarshal.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,8 @@ func unmarshalExtensions(mi Message, unrecognized *[]byte) error {
261261
// Create a new value or reuse an existing one.
262262
fieldType := reflect.TypeOf(extDesc.ExtensionType)
263263
fieldVal := reflect.New(fieldType).Elem() // E.g., *int32, *Message, []T
264-
if extField := extFields.Get(fieldNum); extField.Value != nil {
265-
fieldVal.Set(reflect.ValueOf(extensionAsLegacyType(extField.Value)))
264+
if extField := extFields.Get(fieldNum); extField.HasValue() {
265+
fieldVal.Set(reflect.ValueOf(extensionAsLegacyType(extField.GetValue())))
266266
}
267267

268268
// Unmarshal the value.
@@ -274,10 +274,9 @@ func unmarshalExtensions(mi Message, unrecognized *[]byte) error {
274274
}
275275

276276
// Store the value into the extension field.
277-
extFields.Set(fieldNum, Extension{
278-
Desc: extDesc,
279-
Value: extensionAsStorageType(fieldVal.Interface()),
280-
})
277+
x := Extension{Desc: extDesc}
278+
x.SetEagerValue(extensionAsStorageType(fieldVal.Interface()))
279+
extFields.Set(fieldNum, x)
281280
}
282281

283282
if len(newUnknownFields) == 0 {

0 commit comments

Comments
 (0)