proto, internal/impl: make IsInitialized more consistent
Make the fast-path and slow-path versions of IsInitialized report
exactly the same errors: An errors.RequiredNotSet containing the
full name of one of the unset required fields.
Bugfix: Fast-path IsInitialized on a nil message reports an error only
when the message directly contains required fields.
Bugfix: Include fast-path IsInitialized in legacy messageIfaceWrapper.
Fixes golang/protobuf#887
Change-Id: Ia5e4b386f8c23f6f855d995f4a098b1338acbae3
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/185397
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/message.go b/internal/impl/message.go
index ec9be4e..e9a38c2 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -517,6 +517,7 @@
Flags: piface.MethodFlagDeterministicMarshal,
MarshalAppend: m.marshalAppend,
Size: m.size,
+ IsInitialized: m.isInitialized,
}
}
func (m *messageIfaceWrapper) ProtoUnwrap() interface{} {
@@ -528,3 +529,6 @@
func (m *messageIfaceWrapper) size(msg pref.ProtoMessage) (size int) {
return m.mi.sizePointer(m.p, 0)
}
+func (m *messageIfaceWrapper) isInitialized(msg pref.ProtoMessage) error {
+ return m.mi.isInitializedPointer(m.p)
+}