internal/impl: preserve nil in ProtoMessageVXOf
ProtoMessageV1(nil) now returns nil.
ProtoMessageV2(nil) now returns nil.
Note that the following continue to panic:
MessageOf(nil)
MessageDescriptorOf(nil)
MessageTypeOf(nil)
It may be reasonable for them to also return nil in the future.
Change-Id: Icc14857252d844eb6d4dbfe0c248cef22023e930
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/193758
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/impl/api_export.go b/internal/impl/api_export.go
index 52403cf..3cb2ada 100644
--- a/internal/impl/api_export.go
+++ b/internal/impl/api_export.go
@@ -71,6 +71,8 @@
// ProtoMessageV1Of converts either a v1 or v2 message to a v1 message.
func (Export) ProtoMessageV1Of(m message) piface.MessageV1 {
switch mv := m.(type) {
+ case nil:
+ return nil
case piface.MessageV1:
return mv
case unwrapper:
@@ -84,6 +86,8 @@
func (Export) protoMessageV2Of(m message) pref.ProtoMessage {
switch mv := m.(type) {
+ case nil:
+ return nil
case pref.ProtoMessage:
return mv
case legacyMessageWrapper:
@@ -97,7 +101,7 @@
// ProtoMessageV2Of converts either a v1 or v2 message to a v2 message.
func (Export) ProtoMessageV2Of(m message) pref.ProtoMessage {
- if mv := (Export{}).protoMessageV2Of(m); mv != nil {
+ if mv := (Export{}).protoMessageV2Of(m); mv != nil || m == nil {
return mv
}
return legacyWrapMessage(reflect.ValueOf(m))