Explorar o código

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 <dneil@google.com>
Joe Tsai %!s(int64=6) %!d(string=hai) anos
pai
achega
a2cd3ac1b3
Modificáronse 8 ficheiros con 41 adicións e 41 borrados
  1. 1 1
      go.mod
  2. 4 2
      go.sum
  3. 4 4
      proto/clone.go
  4. 2 2
      proto/discard.go
  5. 2 2
      proto/equal.go
  6. 7 8
      proto/extensions.go
  7. 16 16
      proto/table_marshal.go
  8. 5 6
      proto/table_unmarshal.go

+ 1 - 1
go.mod

@@ -2,4 +2,4 @@ module github.com/golang/protobuf
 
 go 1.9
 
-require google.golang.org/protobuf v0.0.0-20190514231807-cdb777356907
+require google.golang.org/protobuf v0.0.0-20190516201745-40b83d67fc75

+ 4 - 2
go.sum

@@ -1,6 +1,8 @@
 github.com/golang/protobuf v1.2.1-0.20190514181236-7800af189d76/go.mod h1:Zfz6qcDoDBESdv6JsKsGpgNHnkvwJAJwcA9eL+mOkgc=
+github.com/golang/protobuf v1.2.1-0.20190515194842-7574ba03306e/go.mod h1:GjgUz9uwrRQmdPBBrFqiVbojAmlpy6ryM6DCzC+20rE=
+github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-google.golang.org/protobuf v0.0.0-20190514172829-e89e6244e0e8 h1:W21IHLlUZTOSWPAugb7YF/zA4lu4QlPm7T5JwlKYstQ=
 google.golang.org/protobuf v0.0.0-20190514172829-e89e6244e0e8/go.mod h1:791zQGC15vDqjpmPRn1uGPu5oHy/Jzw/Q1n5JsgIIcY=
-google.golang.org/protobuf v0.0.0-20190514231807-cdb777356907 h1:KmA4pf+bs1ucZ/8YCj/VXK0/mkK1olh/jzYhKYiebFE=
 google.golang.org/protobuf v0.0.0-20190514231807-cdb777356907/go.mod h1:HeRLsKXv4+wE27dOIGwnqcOgq6a1O/GJ7mGhiEPnBrU=
+google.golang.org/protobuf v0.0.0-20190516201745-40b83d67fc75 h1:A9hovAkRmyzyLP+RCw0M+tVW0Ku3SZlCPLiABrEQJW0=
+google.golang.org/protobuf v0.0.0-20190516201745-40b83d67fc75/go.mod h1:jf+u8AHuKtkib+0J4/bQXPNzCmT3V9a02hVzYKtatuw=

+ 4 - 4
proto/clone.go

@@ -209,10 +209,10 @@ func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) {
 func mergeExtension(out, in *extensionMap) {
 	in.Range(func(extNum protoreflect.FieldNumber, eIn Extension) bool {
 		eOut := Extension{Desc: eIn.Desc}
-		if eIn.Value != nil {
-			v := reflect.New(reflect.TypeOf(eIn.Value)).Elem()
-			mergeAny(v, reflect.ValueOf(eIn.Value), false, nil)
-			eOut.Value = v.Interface()
+		if eIn.HasValue() {
+			v := reflect.New(reflect.TypeOf(eIn.GetValue())).Elem()
+			mergeAny(v, reflect.ValueOf(eIn.GetValue()), false, nil)
+			eOut.SetEagerValue(v.Interface())
 		}
 
 		out.Set(extNum, eOut)

+ 2 - 2
proto/discard.go

@@ -104,7 +104,7 @@ func (di *discardInfo) discard(src pointer) {
 	// that have been accessed via GetExtension.
 	if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil {
 		em.Range(func(_ protoreflect.FieldNumber, mx Extension) bool {
-			if m, ok := mx.Value.(Message); ok {
+			if m, ok := mx.GetValue().(Message); ok {
 				DiscardUnknown(m)
 			}
 			return true
@@ -319,7 +319,7 @@ func discardLegacy(m Message) {
 	// that have been accessed via GetExtension.
 	if em, err := extendable(m); err == nil {
 		em.Range(func(_ protoreflect.FieldNumber, mx Extension) bool {
-			if m, ok := mx.Value.(Message); ok {
+			if m, ok := mx.GetValue().(Message); ok {
 				discardLegacy(m)
 			}
 			return true

+ 2 - 2
proto/equal.go

@@ -219,8 +219,8 @@ func equalExtensions(base reflect.Type, em1, em2 *extensionMap) bool {
 		}
 		e2 := em2.Get(extNum)
 
-		m1 := extensionAsLegacyType(e1.Value)
-		m2 := extensionAsLegacyType(e2.Value)
+		m1 := extensionAsLegacyType(e1.GetValue())
+		m2 := extensionAsLegacyType(e2.GetValue())
 
 		if m1 == nil && m2 == nil {
 			return true

+ 7 - 8
proto/extensions.go

@@ -268,7 +268,7 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
 	}
 
 	e := epb.Get(protoreflect.FieldNumber(extension.Field))
-	if e.Value != nil {
+	if e.HasValue() {
 		// Already decoded. Check the descriptor, though.
 		if e.Desc != extension {
 			// This shouldn't happen. If it does, it means that
@@ -276,7 +276,7 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
 			// descriptors with the same field number.
 			return nil, errors.New("proto: descriptor conflict")
 		}
-		return extensionAsLegacyType(e.Value), nil
+		return extensionAsLegacyType(e.GetValue()), nil
 	}
 
 	// Descriptor without type information.
@@ -292,11 +292,11 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
 
 	// Remember the decoded version and drop the encoded version.
 	// That way it is safe to mutate what we return.
-	e.Value = extensionAsStorageType(v)
 	e.Desc = extension
+	e.SetEagerValue(extensionAsStorageType(v))
 	unrecognized.SetBytes(removeRawFields(unrecognized.Bytes(), fnum))
 	epb.Set(protoreflect.FieldNumber(extension.Field), e)
-	return extensionAsLegacyType(e.Value), nil
+	return extensionAsLegacyType(e.GetValue()), nil
 }
 
 // defaultExtensionValue returns the default value for extension.
@@ -461,10 +461,9 @@ func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error
 		return fmt.Errorf("proto: SetExtension called with nil value of type %T", value)
 	}
 
-	epb.Set(protoreflect.FieldNumber(extension.Field), Extension{
-		Desc:  extension,
-		Value: extensionAsStorageType(value),
-	})
+	x := Extension{Desc: extension}
+	x.SetEagerValue(extensionAsStorageType(value))
+	epb.Set(protoreflect.FieldNumber(extension.Field), x)
 	return nil
 }
 

+ 16 - 16
proto/table_marshal.go

@@ -2373,7 +2373,7 @@ func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int {
 
 	n := 0
 	m.Range(func(_ protoreflect.FieldNumber, e Extension) bool {
-		if e.Value == nil || e.Desc == nil {
+		if e.Desc == nil || !e.HasValue() {
 			return true // should never happen
 		}
 
@@ -2381,7 +2381,7 @@ func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int {
 		// because the extension value may have been mutated after
 		// the last time this function was called.
 		ei := u.getExtElemInfo(e.Desc)
-		v := e.Value
+		v := e.GetValue()
 		p := toAddrPointer(&v, ei.isptr, ei.deref)
 		n += ei.sizer(p, ei.tagsize)
 		return true
@@ -2403,7 +2403,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
 	// Don't bother sorting the keys.
 	if m.Len() <= 1 {
 		m.Range(func(_ protoreflect.FieldNumber, e Extension) bool {
-			if e.Value == nil || e.Desc == nil {
+			if e.Desc == nil || !e.HasValue() {
 				return true // should never happen
 			}
 
@@ -2412,7 +2412,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
 			// the last time this function was called.
 
 			ei := u.getExtElemInfo(e.Desc)
-			v := e.Value
+			v := e.GetValue()
 			p := toAddrPointer(&v, ei.isptr, ei.deref)
 			b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
 			if !nerr.Merge(err) {
@@ -2435,7 +2435,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
 
 	for _, k := range keys {
 		e := m.Get(protoreflect.FieldNumber(k))
-		if e.Value == nil || e.Desc == nil {
+		if e.Desc == nil || !e.HasValue() {
 			continue // should never happen
 		}
 
@@ -2444,7 +2444,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
 		// the last time this function was called.
 
 		ei := u.getExtElemInfo(e.Desc)
-		v := e.Value
+		v := e.GetValue()
 		p := toAddrPointer(&v, ei.isptr, ei.deref)
 		b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
 		if !nerr.Merge(err) {
@@ -2475,7 +2475,7 @@ func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions, unk []byte) in
 		n += 2                          // start group, end group. tag = 1 (size=1)
 		n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1)
 
-		if e.Value == nil || e.Desc == nil {
+		if e.Desc == nil || !e.HasValue() {
 			return true // should never happen
 		}
 
@@ -2484,7 +2484,7 @@ func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions, unk []byte) in
 		// the last time this function was called.
 
 		ei := u.getExtElemInfo(e.Desc)
-		v := e.Value
+		v := e.GetValue()
 		p := toAddrPointer(&v, ei.isptr, ei.deref)
 		n += ei.sizer(p, 1) // message, tag = 3 (size=1)
 		return true
@@ -2528,7 +2528,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
 			b = append(b, 2<<3|WireVarint)
 			b = appendVarint(b, uint64(id))
 
-			if e.Value == nil || e.Desc == nil {
+			if e.Desc == nil || !e.HasValue() {
 				return true // should never happen
 			}
 
@@ -2537,7 +2537,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
 			// the last time this function was called.
 
 			ei := u.getExtElemInfo(e.Desc)
-			v := e.Value
+			v := e.GetValue()
 			p := toAddrPointer(&v, ei.isptr, ei.deref)
 			b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
 			if !nerr.Merge(err) {
@@ -2583,7 +2583,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
 		b = append(b, 2<<3|WireVarint)
 		b = appendVarint(b, uint64(id))
 
-		if e.Value == nil || e.Desc == nil {
+		if e.Desc == nil || !e.HasValue() {
 			continue // should never happen
 		}
 
@@ -2592,7 +2592,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, un
 		// the last time this function was called.
 
 		ei := u.getExtElemInfo(e.Desc)
-		v := e.Value
+		v := e.GetValue()
 		p := toAddrPointer(&v, ei.isptr, ei.deref)
 		b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
 		b = append(b, 1<<3|WireEndGroup)
@@ -2630,7 +2630,7 @@ func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int {
 
 	n := 0
 	for _, e := range m {
-		if e.Value == nil || e.Desc == nil {
+		if e.Desc == nil || !e.HasValue() {
 			continue // should never happen
 		}
 
@@ -2639,7 +2639,7 @@ func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int {
 		// the last time this function was called.
 
 		ei := u.getExtElemInfo(e.Desc)
-		v := e.Value
+		v := e.GetValue()
 		p := toAddrPointer(&v, ei.isptr, ei.deref)
 		n += ei.sizer(p, ei.tagsize)
 	}
@@ -2663,7 +2663,7 @@ func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, determ
 	var nerr nonFatal
 	for _, k := range keys {
 		e := m[int32(k)]
-		if e.Value == nil || e.Desc == nil {
+		if e.Desc == nil || !e.HasValue() {
 			continue // should never happen
 		}
 
@@ -2672,7 +2672,7 @@ func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, determ
 		// the last time this function was called.
 
 		ei := u.getExtElemInfo(e.Desc)
-		v := e.Value
+		v := e.GetValue()
 		p := toAddrPointer(&v, ei.isptr, ei.deref)
 		b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
 		if !nerr.Merge(err) {

+ 5 - 6
proto/table_unmarshal.go

@@ -261,8 +261,8 @@ func unmarshalExtensions(mi Message, unrecognized *[]byte) error {
 		// Create a new value or reuse an existing one.
 		fieldType := reflect.TypeOf(extDesc.ExtensionType)
 		fieldVal := reflect.New(fieldType).Elem() // E.g., *int32, *Message, []T
-		if extField := extFields.Get(fieldNum); extField.Value != nil {
-			fieldVal.Set(reflect.ValueOf(extensionAsLegacyType(extField.Value)))
+		if extField := extFields.Get(fieldNum); extField.HasValue() {
+			fieldVal.Set(reflect.ValueOf(extensionAsLegacyType(extField.GetValue())))
 		}
 
 		// Unmarshal the value.
@@ -274,10 +274,9 @@ func unmarshalExtensions(mi Message, unrecognized *[]byte) error {
 		}
 
 		// Store the value into the extension field.
-		extFields.Set(fieldNum, Extension{
-			Desc:  extDesc,
-			Value: extensionAsStorageType(fieldVal.Interface()),
-		})
+		x := Extension{Desc: extDesc}
+		x.SetEagerValue(extensionAsStorageType(fieldVal.Interface()))
+		extFields.Set(fieldNum, x)
 	}
 
 	if len(newUnknownFields) == 0 {