internal/impl: weak field bugfixes
Fix a reversed error check in impl.Export{}.WeakNil.
Check to see if we have a type for the weak field on marshal/size.
Treat a typed nil valued in XXX_Weak as not indicating presence for
the field.
Change-Id: Id667ac7eb4f53236be9e181017082bd8cd21d115
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/198717
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/message_reflect_field.go b/internal/impl/message_reflect_field.go
index 63b4055..8d4e6ae 100644
--- a/internal/impl/message_reflect_field.go
+++ b/internal/impl/message_reflect_field.go
@@ -13,7 +13,6 @@
"google.golang.org/protobuf/internal/flags"
pref "google.golang.org/protobuf/reflect/protoreflect"
preg "google.golang.org/protobuf/reflect/protoregistry"
- piface "google.golang.org/protobuf/runtime/protoiface"
)
type fieldInfo struct {
@@ -306,32 +305,29 @@
})
}
- num := int32(fd.Number())
+ num := fd.Number()
return fieldInfo{
fieldDesc: fd,
has: func(p pointer) bool {
if p.IsNil() {
return false
}
- fs := p.Apply(weakOffset).WeakFields()
- _, ok := (*fs)[num]
+ _, ok := p.Apply(weakOffset).WeakFields().get(num)
return ok
},
clear: func(p pointer) {
- fs := p.Apply(weakOffset).WeakFields()
- delete(*fs, num)
+ p.Apply(weakOffset).WeakFields().clear(num)
},
get: func(p pointer) pref.Value {
lazyInit()
if p.IsNil() {
return pref.ValueOfMessage(messageType.Zero())
}
- fs := p.Apply(weakOffset).WeakFields()
- m, ok := (*fs)[num]
+ m, ok := p.Apply(weakOffset).WeakFields().get(num)
if !ok {
return pref.ValueOfMessage(messageType.Zero())
}
- return pref.ValueOfMessage(m.(pref.ProtoMessage).ProtoReflect())
+ return pref.ValueOfMessage(m.ProtoReflect())
},
set: func(p pointer, v pref.Value) {
lazyInit()
@@ -339,24 +335,17 @@
if m.Descriptor() != messageType.Descriptor() {
panic("mismatching message descriptor")
}
- fs := p.Apply(weakOffset).WeakFields()
- if *fs == nil {
- *fs = make(WeakFields)
- }
- (*fs)[num] = m.Interface().(piface.MessageV1)
+ p.Apply(weakOffset).WeakFields().set(num, m.Interface())
},
mutable: func(p pointer) pref.Value {
lazyInit()
fs := p.Apply(weakOffset).WeakFields()
- if *fs == nil {
- *fs = make(WeakFields)
- }
- m, ok := (*fs)[num]
+ m, ok := fs.get(num)
if !ok {
- m = messageType.New().Interface().(piface.MessageV1)
- (*fs)[num] = m
+ m = messageType.New().Interface()
+ fs.set(num, m)
}
- return pref.ValueOfMessage(m.(pref.ProtoMessage).ProtoReflect())
+ return pref.ValueOfMessage(m.ProtoReflect())
},
newMessage: func() pref.Message {
lazyInit()