mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-01-01 03:14:16 +00:00
f6cf4925a9
TestNil checks for panic behavior for all top-level functions that accept messages to ensure that we can detect when behavior changes whether accidentally or deliberately. This test discovered that the pure protobuf reflect behavior differs with the fast-path implementation for a few cases. For the protobuf reflection implementation, we explicitly check for invalid messages in Merge and Reset. Previously, these would not panic if the message was already empty (i.e., had no need to actually set/clear any fields in the receiver message). Change-Id: I571c0a819366bae993ce7c99b05fb4707e55cd3e Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/220958 Reviewed-by: Damien Neil <dneil@google.com>
40 lines
962 B
Go
40 lines
962 B
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package proto
|
|
|
|
import "google.golang.org/protobuf/reflect/protoreflect"
|
|
|
|
// Reset clears every field in the message.
|
|
// The resulting message shares no observable memory with its previous state
|
|
// other than the memory for the message itself.
|
|
func Reset(m Message) {
|
|
if mr, ok := m.(interface{ Reset() }); ok && hasProtoMethods {
|
|
mr.Reset()
|
|
return
|
|
}
|
|
resetMessage(m.ProtoReflect())
|
|
}
|
|
|
|
func resetMessage(m protoreflect.Message) {
|
|
if !m.IsValid() {
|
|
panic("cannot reset invalid message")
|
|
}
|
|
|
|
// Clear all known fields.
|
|
fds := m.Descriptor().Fields()
|
|
for i := 0; i < fds.Len(); i++ {
|
|
m.Clear(fds.Get(i))
|
|
}
|
|
|
|
// Clear extension fields.
|
|
m.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool {
|
|
m.Clear(fd)
|
|
return true
|
|
})
|
|
|
|
// Clear unknown fields.
|
|
m.SetUnknown(nil)
|
|
}
|