proto, internal/impl: implement support for weak fields
Change-Id: I0a3ff79542a3316295fd6c58e1447e597be97ab9
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/189923
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/impl/codec_message.go b/internal/impl/codec_message.go
index 92f38e9..d7235a2 100644
--- a/internal/impl/codec_message.go
+++ b/internal/impl/codec_message.go
@@ -65,15 +65,22 @@
} else {
wiretag = wire.EncodeTag(fd.Number(), wire.BytesType)
}
+ var fieldOffset offset
var funcs pointerCoderFuncs
- if fd.ContainingOneof() != nil {
- funcs = makeOneofFieldCoder(si, fd)
- } else {
+ switch {
+ case fd.ContainingOneof() != nil:
+ fieldOffset = offsetOf(fs, mi.Exporter)
+ funcs = makeOneofFieldCoder(fd, si)
+ case fd.IsWeak():
+ fieldOffset = si.weakOffset
+ funcs = makeWeakMessageFieldCoder(fd)
+ default:
+ fieldOffset = offsetOf(fs, mi.Exporter)
funcs = fieldCoder(fd, ft)
}
cf := &coderFieldInfo{
num: fd.Number(),
- offset: offsetOf(fs, mi.Exporter),
+ offset: fieldOffset,
wiretag: wiretag,
tagsize: wire.SizeVarint(wiretag),
funcs: funcs,