summaryrefslogtreecommitdiff
path: root/vendor/k8s.io/apimachinery/pkg/runtime/types_proto.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/k8s.io/apimachinery/pkg/runtime/types_proto.go')
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/types_proto.go90
1 files changed, 55 insertions, 35 deletions
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/types_proto.go b/vendor/k8s.io/apimachinery/pkg/runtime/types_proto.go
index ead96ee05..a82227b23 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/types_proto.go
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/types_proto.go
@@ -24,46 +24,66 @@ type ProtobufMarshaller interface {
MarshalTo(data []byte) (int, error)
}
+type ProtobufReverseMarshaller interface {
+ MarshalToSizedBuffer(data []byte) (int, error)
+}
+
// NestedMarshalTo allows a caller to avoid extra allocations during serialization of an Unknown
-// that will contain an object that implements ProtobufMarshaller.
+// that will contain an object that implements ProtobufMarshaller or ProtobufReverseMarshaller.
func (m *Unknown) NestedMarshalTo(data []byte, b ProtobufMarshaller, size uint64) (int, error) {
- var i int
- _ = i
- var l int
- _ = l
- data[i] = 0xa
- i++
- i = encodeVarintGenerated(data, i, uint64(m.TypeMeta.Size()))
- n1, err := m.TypeMeta.MarshalTo(data[i:])
- if err != nil {
- return 0, err
+ // Calculate the full size of the message.
+ msgSize := m.Size()
+ if b != nil {
+ msgSize += int(size) + sovGenerated(size) + 1
}
- i += n1
+ // Reverse marshal the fields of m.
+ i := msgSize
+ i -= len(m.ContentType)
+ copy(data[i:], m.ContentType)
+ i = encodeVarintGenerated(data, i, uint64(len(m.ContentType)))
+ i--
+ data[i] = 0x22
+ i -= len(m.ContentEncoding)
+ copy(data[i:], m.ContentEncoding)
+ i = encodeVarintGenerated(data, i, uint64(len(m.ContentEncoding)))
+ i--
+ data[i] = 0x1a
if b != nil {
- data[i] = 0x12
- i++
- i = encodeVarintGenerated(data, i, size)
- n2, err := b.MarshalTo(data[i:])
- if err != nil {
- return 0, err
- }
- if uint64(n2) != size {
- // programmer error: the Size() method for protobuf does not match the results of MarshalTo, which means the proto
- // struct returned would be wrong.
- return 0, fmt.Errorf("the Size() value of %T was %d, but NestedMarshalTo wrote %d bytes to data", b, size, n2)
+ if r, ok := b.(ProtobufReverseMarshaller); ok {
+ n1, err := r.MarshalToSizedBuffer(data[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= int(size)
+ if uint64(n1) != size {
+ // programmer error: the Size() method for protobuf does not match the results of LashramOt, which means the proto
+ // struct returned would be wrong.
+ return 0, fmt.Errorf("the Size() value of %T was %d, but NestedMarshalTo wrote %d bytes to data", b, size, n1)
+ }
+ } else {
+ i -= int(size)
+ n1, err := b.MarshalTo(data[i:])
+ if err != nil {
+ return 0, err
+ }
+ if uint64(n1) != size {
+ // programmer error: the Size() method for protobuf does not match the results of MarshalTo, which means the proto
+ // struct returned would be wrong.
+ return 0, fmt.Errorf("the Size() value of %T was %d, but NestedMarshalTo wrote %d bytes to data", b, size, n1)
+ }
}
- i += n2
+ i = encodeVarintGenerated(data, i, size)
+ i--
+ data[i] = 0x12
}
-
- data[i] = 0x1a
- i++
- i = encodeVarintGenerated(data, i, uint64(len(m.ContentEncoding)))
- i += copy(data[i:], m.ContentEncoding)
-
- data[i] = 0x22
- i++
- i = encodeVarintGenerated(data, i, uint64(len(m.ContentType)))
- i += copy(data[i:], m.ContentType)
- return i, nil
+ n2, err := m.TypeMeta.MarshalToSizedBuffer(data[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= n2
+ i = encodeVarintGenerated(data, i, uint64(n2))
+ i--
+ data[i] = 0xa
+ return msgSize - i, nil
}