blob: 9b1538d0559b27765e64160ec28ec55bb192a0c7 [file] [log] [blame]
Scott Bakereee8dd82019-09-24 12:52:34 -07001// Go support for Protocol Buffers - Google's data interchange format
2//
3// Copyright 2016 The Go Authors. All rights reserved.
4// https://github.com/golang/protobuf
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
9//
10// * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12// * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16// * Neither the name of Google Inc. nor the names of its
17// contributors may be used to endorse or promote products derived from
18// this software without specific prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32package proto
33
34import (
35 "errors"
36 "fmt"
37 "math"
38 "reflect"
39 "sort"
40 "strconv"
41 "strings"
42 "sync"
43 "sync/atomic"
44 "unicode/utf8"
45)
46
47// a sizer takes a pointer to a field and the size of its tag, computes the size of
48// the encoded data.
49type sizer func(pointer, int) int
50
51// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format),
52// marshals the field to the end of the slice, returns the slice and error (if any).
53type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error)
54
55// marshalInfo is the information used for marshaling a message.
56type marshalInfo struct {
57 typ reflect.Type
58 fields []*marshalFieldInfo
59 unrecognized field // offset of XXX_unrecognized
60 extensions field // offset of XXX_InternalExtensions
61 v1extensions field // offset of XXX_extensions
62 sizecache field // offset of XXX_sizecache
63 initialized int32 // 0 -- only typ is set, 1 -- fully initialized
64 messageset bool // uses message set wire format
65 hasmarshaler bool // has custom marshaler
66 sync.RWMutex // protect extElems map, also for initialization
67 extElems map[int32]*marshalElemInfo // info of extension elements
68
69 hassizer bool // has custom sizer
70 hasprotosizer bool // has custom protosizer
71
72 bytesExtensions field // offset of XXX_extensions where the field type is []byte
73}
74
75// marshalFieldInfo is the information used for marshaling a field of a message.
76type marshalFieldInfo struct {
77 field field
78 wiretag uint64 // tag in wire format
79 tagsize int // size of tag in wire format
80 sizer sizer
81 marshaler marshaler
82 isPointer bool
83 required bool // field is required
84 name string // name of the field, for error reporting
85 oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements
86}
87
88// marshalElemInfo is the information used for marshaling an extension or oneof element.
89type marshalElemInfo struct {
90 wiretag uint64 // tag in wire format
91 tagsize int // size of tag in wire format
92 sizer sizer
93 marshaler marshaler
94 isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only)
95}
96
97var (
98 marshalInfoMap = map[reflect.Type]*marshalInfo{}
99 marshalInfoLock sync.Mutex
100
101 uint8SliceType = reflect.TypeOf(([]uint8)(nil)).Kind()
102)
103
104// getMarshalInfo returns the information to marshal a given type of message.
105// The info it returns may not necessarily initialized.
106// t is the type of the message (NOT the pointer to it).
107func getMarshalInfo(t reflect.Type) *marshalInfo {
108 marshalInfoLock.Lock()
109 u, ok := marshalInfoMap[t]
110 if !ok {
111 u = &marshalInfo{typ: t}
112 marshalInfoMap[t] = u
113 }
114 marshalInfoLock.Unlock()
115 return u
116}
117
118// Size is the entry point from generated code,
119// and should be ONLY called by generated code.
120// It computes the size of encoded data of msg.
121// a is a pointer to a place to store cached marshal info.
122func (a *InternalMessageInfo) Size(msg Message) int {
123 u := getMessageMarshalInfo(msg, a)
124 ptr := toPointer(&msg)
125 if ptr.isNil() {
126 // We get here if msg is a typed nil ((*SomeMessage)(nil)),
127 // so it satisfies the interface, and msg == nil wouldn't
128 // catch it. We don't want crash in this case.
129 return 0
130 }
131 return u.size(ptr)
132}
133
134// Marshal is the entry point from generated code,
135// and should be ONLY called by generated code.
136// It marshals msg to the end of b.
137// a is a pointer to a place to store cached marshal info.
138func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) {
139 u := getMessageMarshalInfo(msg, a)
140 ptr := toPointer(&msg)
141 if ptr.isNil() {
142 // We get here if msg is a typed nil ((*SomeMessage)(nil)),
143 // so it satisfies the interface, and msg == nil wouldn't
144 // catch it. We don't want crash in this case.
145 return b, ErrNil
146 }
147 return u.marshal(b, ptr, deterministic)
148}
149
150func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo {
151 // u := a.marshal, but atomically.
152 // We use an atomic here to ensure memory consistency.
153 u := atomicLoadMarshalInfo(&a.marshal)
154 if u == nil {
155 // Get marshal information from type of message.
156 t := reflect.ValueOf(msg).Type()
157 if t.Kind() != reflect.Ptr {
158 panic(fmt.Sprintf("cannot handle non-pointer message type %v", t))
159 }
160 u = getMarshalInfo(t.Elem())
161 // Store it in the cache for later users.
162 // a.marshal = u, but atomically.
163 atomicStoreMarshalInfo(&a.marshal, u)
164 }
165 return u
166}
167
168// size is the main function to compute the size of the encoded data of a message.
169// ptr is the pointer to the message.
170func (u *marshalInfo) size(ptr pointer) int {
171 if atomic.LoadInt32(&u.initialized) == 0 {
172 u.computeMarshalInfo()
173 }
174
175 // If the message can marshal itself, let it do it, for compatibility.
176 // NOTE: This is not efficient.
177 if u.hasmarshaler {
178 // Uses the message's Size method if available
179 if u.hassizer {
180 s := ptr.asPointerTo(u.typ).Interface().(Sizer)
181 return s.Size()
182 }
183 // Uses the message's ProtoSize method if available
184 if u.hasprotosizer {
185 s := ptr.asPointerTo(u.typ).Interface().(ProtoSizer)
186 return s.ProtoSize()
187 }
188
189 m := ptr.asPointerTo(u.typ).Interface().(Marshaler)
190 b, _ := m.Marshal()
191 return len(b)
192 }
193
194 n := 0
195 for _, f := range u.fields {
196 if f.isPointer && ptr.offset(f.field).getPointer().isNil() {
197 // nil pointer always marshals to nothing
198 continue
199 }
200 n += f.sizer(ptr.offset(f.field), f.tagsize)
201 }
202 if u.extensions.IsValid() {
203 e := ptr.offset(u.extensions).toExtensions()
204 if u.messageset {
205 n += u.sizeMessageSet(e)
206 } else {
207 n += u.sizeExtensions(e)
208 }
209 }
210 if u.v1extensions.IsValid() {
211 m := *ptr.offset(u.v1extensions).toOldExtensions()
212 n += u.sizeV1Extensions(m)
213 }
214 if u.bytesExtensions.IsValid() {
215 s := *ptr.offset(u.bytesExtensions).toBytes()
216 n += len(s)
217 }
218 if u.unrecognized.IsValid() {
219 s := *ptr.offset(u.unrecognized).toBytes()
220 n += len(s)
221 }
222
223 // cache the result for use in marshal
224 if u.sizecache.IsValid() {
225 atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n))
226 }
227 return n
228}
229
230// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated),
231// fall back to compute the size.
232func (u *marshalInfo) cachedsize(ptr pointer) int {
233 if u.sizecache.IsValid() {
234 return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32()))
235 }
236 return u.size(ptr)
237}
238
239// marshal is the main function to marshal a message. It takes a byte slice and appends
240// the encoded data to the end of the slice, returns the slice and error (if any).
241// ptr is the pointer to the message.
242// If deterministic is true, map is marshaled in deterministic order.
243func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) {
244 if atomic.LoadInt32(&u.initialized) == 0 {
245 u.computeMarshalInfo()
246 }
247
248 // If the message can marshal itself, let it do it, for compatibility.
249 // NOTE: This is not efficient.
250 if u.hasmarshaler {
251 m := ptr.asPointerTo(u.typ).Interface().(Marshaler)
252 b1, err := m.Marshal()
253 b = append(b, b1...)
254 return b, err
255 }
256
257 var err, errLater error
258 // The old marshaler encodes extensions at beginning.
259 if u.extensions.IsValid() {
260 e := ptr.offset(u.extensions).toExtensions()
261 if u.messageset {
262 b, err = u.appendMessageSet(b, e, deterministic)
263 } else {
264 b, err = u.appendExtensions(b, e, deterministic)
265 }
266 if err != nil {
267 return b, err
268 }
269 }
270 if u.v1extensions.IsValid() {
271 m := *ptr.offset(u.v1extensions).toOldExtensions()
272 b, err = u.appendV1Extensions(b, m, deterministic)
273 if err != nil {
274 return b, err
275 }
276 }
277 if u.bytesExtensions.IsValid() {
278 s := *ptr.offset(u.bytesExtensions).toBytes()
279 b = append(b, s...)
280 }
281 for _, f := range u.fields {
282 if f.required {
283 if f.isPointer && ptr.offset(f.field).getPointer().isNil() {
284 // Required field is not set.
285 // We record the error but keep going, to give a complete marshaling.
286 if errLater == nil {
287 errLater = &RequiredNotSetError{f.name}
288 }
289 continue
290 }
291 }
292 if f.isPointer && ptr.offset(f.field).getPointer().isNil() {
293 // nil pointer always marshals to nothing
294 continue
295 }
296 b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic)
297 if err != nil {
298 if err1, ok := err.(*RequiredNotSetError); ok {
299 // Required field in submessage is not set.
300 // We record the error but keep going, to give a complete marshaling.
301 if errLater == nil {
302 errLater = &RequiredNotSetError{f.name + "." + err1.field}
303 }
304 continue
305 }
306 if err == errRepeatedHasNil {
307 err = errors.New("proto: repeated field " + f.name + " has nil element")
308 }
309 if err == errInvalidUTF8 {
310 if errLater == nil {
311 fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name
312 errLater = &invalidUTF8Error{fullName}
313 }
314 continue
315 }
316 return b, err
317 }
318 }
319 if u.unrecognized.IsValid() {
320 s := *ptr.offset(u.unrecognized).toBytes()
321 b = append(b, s...)
322 }
323 return b, errLater
324}
325
326// computeMarshalInfo initializes the marshal info.
327func (u *marshalInfo) computeMarshalInfo() {
328 u.Lock()
329 defer u.Unlock()
330 if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock
331 return
332 }
333
334 t := u.typ
335 u.unrecognized = invalidField
336 u.extensions = invalidField
337 u.v1extensions = invalidField
338 u.bytesExtensions = invalidField
339 u.sizecache = invalidField
340 isOneofMessage := false
341
342 if reflect.PtrTo(t).Implements(sizerType) {
343 u.hassizer = true
344 }
345 if reflect.PtrTo(t).Implements(protosizerType) {
346 u.hasprotosizer = true
347 }
348 // If the message can marshal itself, let it do it, for compatibility.
349 // NOTE: This is not efficient.
350 if reflect.PtrTo(t).Implements(marshalerType) {
351 u.hasmarshaler = true
352 atomic.StoreInt32(&u.initialized, 1)
353 return
354 }
355
356 n := t.NumField()
357
358 // deal with XXX fields first
359 for i := 0; i < t.NumField(); i++ {
360 f := t.Field(i)
361 if f.Tag.Get("protobuf_oneof") != "" {
362 isOneofMessage = true
363 }
364 if !strings.HasPrefix(f.Name, "XXX_") {
365 continue
366 }
367 switch f.Name {
368 case "XXX_sizecache":
369 u.sizecache = toField(&f)
370 case "XXX_unrecognized":
371 u.unrecognized = toField(&f)
372 case "XXX_InternalExtensions":
373 u.extensions = toField(&f)
374 u.messageset = f.Tag.Get("protobuf_messageset") == "1"
375 case "XXX_extensions":
376 if f.Type.Kind() == reflect.Map {
377 u.v1extensions = toField(&f)
378 } else {
379 u.bytesExtensions = toField(&f)
380 }
381 case "XXX_NoUnkeyedLiteral":
382 // nothing to do
383 default:
384 panic("unknown XXX field: " + f.Name)
385 }
386 n--
387 }
388
389 // get oneof implementers
390 var oneofImplementers []interface{}
391 // gogo: isOneofMessage is needed for embedded oneof messages, without a marshaler and unmarshaler
392 if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok && isOneofMessage {
393 _, _, _, oneofImplementers = m.XXX_OneofFuncs()
394 }
395
396 // normal fields
397 fields := make([]marshalFieldInfo, n) // batch allocation
398 u.fields = make([]*marshalFieldInfo, 0, n)
399 for i, j := 0, 0; i < t.NumField(); i++ {
400 f := t.Field(i)
401
402 if strings.HasPrefix(f.Name, "XXX_") {
403 continue
404 }
405 field := &fields[j]
406 j++
407 field.name = f.Name
408 u.fields = append(u.fields, field)
409 if f.Tag.Get("protobuf_oneof") != "" {
410 field.computeOneofFieldInfo(&f, oneofImplementers)
411 continue
412 }
413 if f.Tag.Get("protobuf") == "" {
414 // field has no tag (not in generated message), ignore it
415 u.fields = u.fields[:len(u.fields)-1]
416 j--
417 continue
418 }
419 field.computeMarshalFieldInfo(&f)
420 }
421
422 // fields are marshaled in tag order on the wire.
423 sort.Sort(byTag(u.fields))
424
425 atomic.StoreInt32(&u.initialized, 1)
426}
427
428// helper for sorting fields by tag
429type byTag []*marshalFieldInfo
430
431func (a byTag) Len() int { return len(a) }
432func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
433func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag }
434
435// getExtElemInfo returns the information to marshal an extension element.
436// The info it returns is initialized.
437func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo {
438 // get from cache first
439 u.RLock()
440 e, ok := u.extElems[desc.Field]
441 u.RUnlock()
442 if ok {
443 return e
444 }
445
446 t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct
447 tags := strings.Split(desc.Tag, ",")
448 tag, err := strconv.Atoi(tags[1])
449 if err != nil {
450 panic("tag is not an integer")
451 }
452 wt := wiretype(tags[0])
453 sizr, marshalr := typeMarshaler(t, tags, false, false)
454 e = &marshalElemInfo{
455 wiretag: uint64(tag)<<3 | wt,
456 tagsize: SizeVarint(uint64(tag) << 3),
457 sizer: sizr,
458 marshaler: marshalr,
459 isptr: t.Kind() == reflect.Ptr,
460 }
461
462 // update cache
463 u.Lock()
464 if u.extElems == nil {
465 u.extElems = make(map[int32]*marshalElemInfo)
466 }
467 u.extElems[desc.Field] = e
468 u.Unlock()
469 return e
470}
471
472// computeMarshalFieldInfo fills up the information to marshal a field.
473func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) {
474 // parse protobuf tag of the field.
475 // tag has format of "bytes,49,opt,name=foo,def=hello!"
476 tags := strings.Split(f.Tag.Get("protobuf"), ",")
477 if tags[0] == "" {
478 return
479 }
480 tag, err := strconv.Atoi(tags[1])
481 if err != nil {
482 panic("tag is not an integer")
483 }
484 wt := wiretype(tags[0])
485 if tags[2] == "req" {
486 fi.required = true
487 }
488 fi.setTag(f, tag, wt)
489 fi.setMarshaler(f, tags)
490}
491
492func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) {
493 fi.field = toField(f)
494 fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire.
495 fi.isPointer = true
496 fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f)
497 fi.oneofElems = make(map[reflect.Type]*marshalElemInfo)
498
499 ityp := f.Type // interface type
500 for _, o := range oneofImplementers {
501 t := reflect.TypeOf(o)
502 if !t.Implements(ityp) {
503 continue
504 }
505 sf := t.Elem().Field(0) // oneof implementer is a struct with a single field
506 tags := strings.Split(sf.Tag.Get("protobuf"), ",")
507 tag, err := strconv.Atoi(tags[1])
508 if err != nil {
509 panic("tag is not an integer")
510 }
511 wt := wiretype(tags[0])
512 sizr, marshalr := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value
513 fi.oneofElems[t.Elem()] = &marshalElemInfo{
514 wiretag: uint64(tag)<<3 | wt,
515 tagsize: SizeVarint(uint64(tag) << 3),
516 sizer: sizr,
517 marshaler: marshalr,
518 }
519 }
520}
521
522type oneofMessage interface {
523 XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{})
524}
525
526// wiretype returns the wire encoding of the type.
527func wiretype(encoding string) uint64 {
528 switch encoding {
529 case "fixed32":
530 return WireFixed32
531 case "fixed64":
532 return WireFixed64
533 case "varint", "zigzag32", "zigzag64":
534 return WireVarint
535 case "bytes":
536 return WireBytes
537 case "group":
538 return WireStartGroup
539 }
540 panic("unknown wire type " + encoding)
541}
542
543// setTag fills up the tag (in wire format) and its size in the info of a field.
544func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) {
545 fi.field = toField(f)
546 fi.wiretag = uint64(tag)<<3 | wt
547 fi.tagsize = SizeVarint(uint64(tag) << 3)
548}
549
550// setMarshaler fills up the sizer and marshaler in the info of a field.
551func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) {
552 switch f.Type.Kind() {
553 case reflect.Map:
554 // map field
555 fi.isPointer = true
556 fi.sizer, fi.marshaler = makeMapMarshaler(f)
557 return
558 case reflect.Ptr, reflect.Slice:
559 fi.isPointer = true
560 }
561 fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false)
562}
563
564// typeMarshaler returns the sizer and marshaler of a given field.
565// t is the type of the field.
566// tags is the generated "protobuf" tag of the field.
567// If nozero is true, zero value is not marshaled to the wire.
568// If oneof is true, it is a oneof field.
569func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) {
570 encoding := tags[0]
571
572 pointer := false
573 slice := false
574 if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
575 slice = true
576 t = t.Elem()
577 }
578 if t.Kind() == reflect.Ptr {
579 pointer = true
580 t = t.Elem()
581 }
582
583 packed := false
584 proto3 := false
585 ctype := false
586 isTime := false
587 isDuration := false
588 isWktPointer := false
589 validateUTF8 := true
590 for i := 2; i < len(tags); i++ {
591 if tags[i] == "packed" {
592 packed = true
593 }
594 if tags[i] == "proto3" {
595 proto3 = true
596 }
597 if strings.HasPrefix(tags[i], "customtype=") {
598 ctype = true
599 }
600 if tags[i] == "stdtime" {
601 isTime = true
602 }
603 if tags[i] == "stdduration" {
604 isDuration = true
605 }
606 if tags[i] == "wktptr" {
607 isWktPointer = true
608 }
609 }
610 validateUTF8 = validateUTF8 && proto3
611 if !proto3 && !pointer && !slice {
612 nozero = false
613 }
614
615 if ctype {
616 if reflect.PtrTo(t).Implements(customType) {
617 if slice {
618 return makeMessageRefSliceMarshaler(getMarshalInfo(t))
619 }
620 if pointer {
621 return makeCustomPtrMarshaler(getMarshalInfo(t))
622 }
623 return makeCustomMarshaler(getMarshalInfo(t))
624 } else {
625 panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t))
626 }
627 }
628
629 if isTime {
630 if pointer {
631 if slice {
632 return makeTimePtrSliceMarshaler(getMarshalInfo(t))
633 }
634 return makeTimePtrMarshaler(getMarshalInfo(t))
635 }
636 if slice {
637 return makeTimeSliceMarshaler(getMarshalInfo(t))
638 }
639 return makeTimeMarshaler(getMarshalInfo(t))
640 }
641
642 if isDuration {
643 if pointer {
644 if slice {
645 return makeDurationPtrSliceMarshaler(getMarshalInfo(t))
646 }
647 return makeDurationPtrMarshaler(getMarshalInfo(t))
648 }
649 if slice {
650 return makeDurationSliceMarshaler(getMarshalInfo(t))
651 }
652 return makeDurationMarshaler(getMarshalInfo(t))
653 }
654
655 if isWktPointer {
656 switch t.Kind() {
657 case reflect.Float64:
658 if pointer {
659 if slice {
660 return makeStdDoubleValuePtrSliceMarshaler(getMarshalInfo(t))
661 }
662 return makeStdDoubleValuePtrMarshaler(getMarshalInfo(t))
663 }
664 if slice {
665 return makeStdDoubleValueSliceMarshaler(getMarshalInfo(t))
666 }
667 return makeStdDoubleValueMarshaler(getMarshalInfo(t))
668 case reflect.Float32:
669 if pointer {
670 if slice {
671 return makeStdFloatValuePtrSliceMarshaler(getMarshalInfo(t))
672 }
673 return makeStdFloatValuePtrMarshaler(getMarshalInfo(t))
674 }
675 if slice {
676 return makeStdFloatValueSliceMarshaler(getMarshalInfo(t))
677 }
678 return makeStdFloatValueMarshaler(getMarshalInfo(t))
679 case reflect.Int64:
680 if pointer {
681 if slice {
682 return makeStdInt64ValuePtrSliceMarshaler(getMarshalInfo(t))
683 }
684 return makeStdInt64ValuePtrMarshaler(getMarshalInfo(t))
685 }
686 if slice {
687 return makeStdInt64ValueSliceMarshaler(getMarshalInfo(t))
688 }
689 return makeStdInt64ValueMarshaler(getMarshalInfo(t))
690 case reflect.Uint64:
691 if pointer {
692 if slice {
693 return makeStdUInt64ValuePtrSliceMarshaler(getMarshalInfo(t))
694 }
695 return makeStdUInt64ValuePtrMarshaler(getMarshalInfo(t))
696 }
697 if slice {
698 return makeStdUInt64ValueSliceMarshaler(getMarshalInfo(t))
699 }
700 return makeStdUInt64ValueMarshaler(getMarshalInfo(t))
701 case reflect.Int32:
702 if pointer {
703 if slice {
704 return makeStdInt32ValuePtrSliceMarshaler(getMarshalInfo(t))
705 }
706 return makeStdInt32ValuePtrMarshaler(getMarshalInfo(t))
707 }
708 if slice {
709 return makeStdInt32ValueSliceMarshaler(getMarshalInfo(t))
710 }
711 return makeStdInt32ValueMarshaler(getMarshalInfo(t))
712 case reflect.Uint32:
713 if pointer {
714 if slice {
715 return makeStdUInt32ValuePtrSliceMarshaler(getMarshalInfo(t))
716 }
717 return makeStdUInt32ValuePtrMarshaler(getMarshalInfo(t))
718 }
719 if slice {
720 return makeStdUInt32ValueSliceMarshaler(getMarshalInfo(t))
721 }
722 return makeStdUInt32ValueMarshaler(getMarshalInfo(t))
723 case reflect.Bool:
724 if pointer {
725 if slice {
726 return makeStdBoolValuePtrSliceMarshaler(getMarshalInfo(t))
727 }
728 return makeStdBoolValuePtrMarshaler(getMarshalInfo(t))
729 }
730 if slice {
731 return makeStdBoolValueSliceMarshaler(getMarshalInfo(t))
732 }
733 return makeStdBoolValueMarshaler(getMarshalInfo(t))
734 case reflect.String:
735 if pointer {
736 if slice {
737 return makeStdStringValuePtrSliceMarshaler(getMarshalInfo(t))
738 }
739 return makeStdStringValuePtrMarshaler(getMarshalInfo(t))
740 }
741 if slice {
742 return makeStdStringValueSliceMarshaler(getMarshalInfo(t))
743 }
744 return makeStdStringValueMarshaler(getMarshalInfo(t))
745 case uint8SliceType:
746 if pointer {
747 if slice {
748 return makeStdBytesValuePtrSliceMarshaler(getMarshalInfo(t))
749 }
750 return makeStdBytesValuePtrMarshaler(getMarshalInfo(t))
751 }
752 if slice {
753 return makeStdBytesValueSliceMarshaler(getMarshalInfo(t))
754 }
755 return makeStdBytesValueMarshaler(getMarshalInfo(t))
756 default:
757 panic(fmt.Sprintf("unknown wktpointer type %#v", t))
758 }
759 }
760
761 switch t.Kind() {
762 case reflect.Bool:
763 if pointer {
764 return sizeBoolPtr, appendBoolPtr
765 }
766 if slice {
767 if packed {
768 return sizeBoolPackedSlice, appendBoolPackedSlice
769 }
770 return sizeBoolSlice, appendBoolSlice
771 }
772 if nozero {
773 return sizeBoolValueNoZero, appendBoolValueNoZero
774 }
775 return sizeBoolValue, appendBoolValue
776 case reflect.Uint32:
777 switch encoding {
778 case "fixed32":
779 if pointer {
780 return sizeFixed32Ptr, appendFixed32Ptr
781 }
782 if slice {
783 if packed {
784 return sizeFixed32PackedSlice, appendFixed32PackedSlice
785 }
786 return sizeFixed32Slice, appendFixed32Slice
787 }
788 if nozero {
789 return sizeFixed32ValueNoZero, appendFixed32ValueNoZero
790 }
791 return sizeFixed32Value, appendFixed32Value
792 case "varint":
793 if pointer {
794 return sizeVarint32Ptr, appendVarint32Ptr
795 }
796 if slice {
797 if packed {
798 return sizeVarint32PackedSlice, appendVarint32PackedSlice
799 }
800 return sizeVarint32Slice, appendVarint32Slice
801 }
802 if nozero {
803 return sizeVarint32ValueNoZero, appendVarint32ValueNoZero
804 }
805 return sizeVarint32Value, appendVarint32Value
806 }
807 case reflect.Int32:
808 switch encoding {
809 case "fixed32":
810 if pointer {
811 return sizeFixedS32Ptr, appendFixedS32Ptr
812 }
813 if slice {
814 if packed {
815 return sizeFixedS32PackedSlice, appendFixedS32PackedSlice
816 }
817 return sizeFixedS32Slice, appendFixedS32Slice
818 }
819 if nozero {
820 return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero
821 }
822 return sizeFixedS32Value, appendFixedS32Value
823 case "varint":
824 if pointer {
825 return sizeVarintS32Ptr, appendVarintS32Ptr
826 }
827 if slice {
828 if packed {
829 return sizeVarintS32PackedSlice, appendVarintS32PackedSlice
830 }
831 return sizeVarintS32Slice, appendVarintS32Slice
832 }
833 if nozero {
834 return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero
835 }
836 return sizeVarintS32Value, appendVarintS32Value
837 case "zigzag32":
838 if pointer {
839 return sizeZigzag32Ptr, appendZigzag32Ptr
840 }
841 if slice {
842 if packed {
843 return sizeZigzag32PackedSlice, appendZigzag32PackedSlice
844 }
845 return sizeZigzag32Slice, appendZigzag32Slice
846 }
847 if nozero {
848 return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero
849 }
850 return sizeZigzag32Value, appendZigzag32Value
851 }
852 case reflect.Uint64:
853 switch encoding {
854 case "fixed64":
855 if pointer {
856 return sizeFixed64Ptr, appendFixed64Ptr
857 }
858 if slice {
859 if packed {
860 return sizeFixed64PackedSlice, appendFixed64PackedSlice
861 }
862 return sizeFixed64Slice, appendFixed64Slice
863 }
864 if nozero {
865 return sizeFixed64ValueNoZero, appendFixed64ValueNoZero
866 }
867 return sizeFixed64Value, appendFixed64Value
868 case "varint":
869 if pointer {
870 return sizeVarint64Ptr, appendVarint64Ptr
871 }
872 if slice {
873 if packed {
874 return sizeVarint64PackedSlice, appendVarint64PackedSlice
875 }
876 return sizeVarint64Slice, appendVarint64Slice
877 }
878 if nozero {
879 return sizeVarint64ValueNoZero, appendVarint64ValueNoZero
880 }
881 return sizeVarint64Value, appendVarint64Value
882 }
883 case reflect.Int64:
884 switch encoding {
885 case "fixed64":
886 if pointer {
887 return sizeFixedS64Ptr, appendFixedS64Ptr
888 }
889 if slice {
890 if packed {
891 return sizeFixedS64PackedSlice, appendFixedS64PackedSlice
892 }
893 return sizeFixedS64Slice, appendFixedS64Slice
894 }
895 if nozero {
896 return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero
897 }
898 return sizeFixedS64Value, appendFixedS64Value
899 case "varint":
900 if pointer {
901 return sizeVarintS64Ptr, appendVarintS64Ptr
902 }
903 if slice {
904 if packed {
905 return sizeVarintS64PackedSlice, appendVarintS64PackedSlice
906 }
907 return sizeVarintS64Slice, appendVarintS64Slice
908 }
909 if nozero {
910 return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero
911 }
912 return sizeVarintS64Value, appendVarintS64Value
913 case "zigzag64":
914 if pointer {
915 return sizeZigzag64Ptr, appendZigzag64Ptr
916 }
917 if slice {
918 if packed {
919 return sizeZigzag64PackedSlice, appendZigzag64PackedSlice
920 }
921 return sizeZigzag64Slice, appendZigzag64Slice
922 }
923 if nozero {
924 return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero
925 }
926 return sizeZigzag64Value, appendZigzag64Value
927 }
928 case reflect.Float32:
929 if pointer {
930 return sizeFloat32Ptr, appendFloat32Ptr
931 }
932 if slice {
933 if packed {
934 return sizeFloat32PackedSlice, appendFloat32PackedSlice
935 }
936 return sizeFloat32Slice, appendFloat32Slice
937 }
938 if nozero {
939 return sizeFloat32ValueNoZero, appendFloat32ValueNoZero
940 }
941 return sizeFloat32Value, appendFloat32Value
942 case reflect.Float64:
943 if pointer {
944 return sizeFloat64Ptr, appendFloat64Ptr
945 }
946 if slice {
947 if packed {
948 return sizeFloat64PackedSlice, appendFloat64PackedSlice
949 }
950 return sizeFloat64Slice, appendFloat64Slice
951 }
952 if nozero {
953 return sizeFloat64ValueNoZero, appendFloat64ValueNoZero
954 }
955 return sizeFloat64Value, appendFloat64Value
956 case reflect.String:
957 if validateUTF8 {
958 if pointer {
959 return sizeStringPtr, appendUTF8StringPtr
960 }
961 if slice {
962 return sizeStringSlice, appendUTF8StringSlice
963 }
964 if nozero {
965 return sizeStringValueNoZero, appendUTF8StringValueNoZero
966 }
967 return sizeStringValue, appendUTF8StringValue
968 }
969 if pointer {
970 return sizeStringPtr, appendStringPtr
971 }
972 if slice {
973 return sizeStringSlice, appendStringSlice
974 }
975 if nozero {
976 return sizeStringValueNoZero, appendStringValueNoZero
977 }
978 return sizeStringValue, appendStringValue
979 case reflect.Slice:
980 if slice {
981 return sizeBytesSlice, appendBytesSlice
982 }
983 if oneof {
984 // Oneof bytes field may also have "proto3" tag.
985 // We want to marshal it as a oneof field. Do this
986 // check before the proto3 check.
987 return sizeBytesOneof, appendBytesOneof
988 }
989 if proto3 {
990 return sizeBytes3, appendBytes3
991 }
992 return sizeBytes, appendBytes
993 case reflect.Struct:
994 switch encoding {
995 case "group":
996 if slice {
997 return makeGroupSliceMarshaler(getMarshalInfo(t))
998 }
999 return makeGroupMarshaler(getMarshalInfo(t))
1000 case "bytes":
1001 if pointer {
1002 if slice {
1003 return makeMessageSliceMarshaler(getMarshalInfo(t))
1004 }
1005 return makeMessageMarshaler(getMarshalInfo(t))
1006 } else {
1007 if slice {
1008 return makeMessageRefSliceMarshaler(getMarshalInfo(t))
1009 }
1010 return makeMessageRefMarshaler(getMarshalInfo(t))
1011 }
1012 }
1013 }
1014 panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding))
1015}
1016
1017// Below are functions to size/marshal a specific type of a field.
1018// They are stored in the field's info, and called by function pointers.
1019// They have type sizer or marshaler.
1020
1021func sizeFixed32Value(_ pointer, tagsize int) int {
1022 return 4 + tagsize
1023}
1024func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int {
1025 v := *ptr.toUint32()
1026 if v == 0 {
1027 return 0
1028 }
1029 return 4 + tagsize
1030}
1031func sizeFixed32Ptr(ptr pointer, tagsize int) int {
1032 p := *ptr.toUint32Ptr()
1033 if p == nil {
1034 return 0
1035 }
1036 return 4 + tagsize
1037}
1038func sizeFixed32Slice(ptr pointer, tagsize int) int {
1039 s := *ptr.toUint32Slice()
1040 return (4 + tagsize) * len(s)
1041}
1042func sizeFixed32PackedSlice(ptr pointer, tagsize int) int {
1043 s := *ptr.toUint32Slice()
1044 if len(s) == 0 {
1045 return 0
1046 }
1047 return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize
1048}
1049func sizeFixedS32Value(_ pointer, tagsize int) int {
1050 return 4 + tagsize
1051}
1052func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int {
1053 v := *ptr.toInt32()
1054 if v == 0 {
1055 return 0
1056 }
1057 return 4 + tagsize
1058}
1059func sizeFixedS32Ptr(ptr pointer, tagsize int) int {
1060 p := ptr.getInt32Ptr()
1061 if p == nil {
1062 return 0
1063 }
1064 return 4 + tagsize
1065}
1066func sizeFixedS32Slice(ptr pointer, tagsize int) int {
1067 s := ptr.getInt32Slice()
1068 return (4 + tagsize) * len(s)
1069}
1070func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int {
1071 s := ptr.getInt32Slice()
1072 if len(s) == 0 {
1073 return 0
1074 }
1075 return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize
1076}
1077func sizeFloat32Value(_ pointer, tagsize int) int {
1078 return 4 + tagsize
1079}
1080func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int {
1081 v := math.Float32bits(*ptr.toFloat32())
1082 if v == 0 {
1083 return 0
1084 }
1085 return 4 + tagsize
1086}
1087func sizeFloat32Ptr(ptr pointer, tagsize int) int {
1088 p := *ptr.toFloat32Ptr()
1089 if p == nil {
1090 return 0
1091 }
1092 return 4 + tagsize
1093}
1094func sizeFloat32Slice(ptr pointer, tagsize int) int {
1095 s := *ptr.toFloat32Slice()
1096 return (4 + tagsize) * len(s)
1097}
1098func sizeFloat32PackedSlice(ptr pointer, tagsize int) int {
1099 s := *ptr.toFloat32Slice()
1100 if len(s) == 0 {
1101 return 0
1102 }
1103 return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize
1104}
1105func sizeFixed64Value(_ pointer, tagsize int) int {
1106 return 8 + tagsize
1107}
1108func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int {
1109 v := *ptr.toUint64()
1110 if v == 0 {
1111 return 0
1112 }
1113 return 8 + tagsize
1114}
1115func sizeFixed64Ptr(ptr pointer, tagsize int) int {
1116 p := *ptr.toUint64Ptr()
1117 if p == nil {
1118 return 0
1119 }
1120 return 8 + tagsize
1121}
1122func sizeFixed64Slice(ptr pointer, tagsize int) int {
1123 s := *ptr.toUint64Slice()
1124 return (8 + tagsize) * len(s)
1125}
1126func sizeFixed64PackedSlice(ptr pointer, tagsize int) int {
1127 s := *ptr.toUint64Slice()
1128 if len(s) == 0 {
1129 return 0
1130 }
1131 return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize
1132}
1133func sizeFixedS64Value(_ pointer, tagsize int) int {
1134 return 8 + tagsize
1135}
1136func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int {
1137 v := *ptr.toInt64()
1138 if v == 0 {
1139 return 0
1140 }
1141 return 8 + tagsize
1142}
1143func sizeFixedS64Ptr(ptr pointer, tagsize int) int {
1144 p := *ptr.toInt64Ptr()
1145 if p == nil {
1146 return 0
1147 }
1148 return 8 + tagsize
1149}
1150func sizeFixedS64Slice(ptr pointer, tagsize int) int {
1151 s := *ptr.toInt64Slice()
1152 return (8 + tagsize) * len(s)
1153}
1154func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int {
1155 s := *ptr.toInt64Slice()
1156 if len(s) == 0 {
1157 return 0
1158 }
1159 return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize
1160}
1161func sizeFloat64Value(_ pointer, tagsize int) int {
1162 return 8 + tagsize
1163}
1164func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int {
1165 v := math.Float64bits(*ptr.toFloat64())
1166 if v == 0 {
1167 return 0
1168 }
1169 return 8 + tagsize
1170}
1171func sizeFloat64Ptr(ptr pointer, tagsize int) int {
1172 p := *ptr.toFloat64Ptr()
1173 if p == nil {
1174 return 0
1175 }
1176 return 8 + tagsize
1177}
1178func sizeFloat64Slice(ptr pointer, tagsize int) int {
1179 s := *ptr.toFloat64Slice()
1180 return (8 + tagsize) * len(s)
1181}
1182func sizeFloat64PackedSlice(ptr pointer, tagsize int) int {
1183 s := *ptr.toFloat64Slice()
1184 if len(s) == 0 {
1185 return 0
1186 }
1187 return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize
1188}
1189func sizeVarint32Value(ptr pointer, tagsize int) int {
1190 v := *ptr.toUint32()
1191 return SizeVarint(uint64(v)) + tagsize
1192}
1193func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int {
1194 v := *ptr.toUint32()
1195 if v == 0 {
1196 return 0
1197 }
1198 return SizeVarint(uint64(v)) + tagsize
1199}
1200func sizeVarint32Ptr(ptr pointer, tagsize int) int {
1201 p := *ptr.toUint32Ptr()
1202 if p == nil {
1203 return 0
1204 }
1205 return SizeVarint(uint64(*p)) + tagsize
1206}
1207func sizeVarint32Slice(ptr pointer, tagsize int) int {
1208 s := *ptr.toUint32Slice()
1209 n := 0
1210 for _, v := range s {
1211 n += SizeVarint(uint64(v)) + tagsize
1212 }
1213 return n
1214}
1215func sizeVarint32PackedSlice(ptr pointer, tagsize int) int {
1216 s := *ptr.toUint32Slice()
1217 if len(s) == 0 {
1218 return 0
1219 }
1220 n := 0
1221 for _, v := range s {
1222 n += SizeVarint(uint64(v))
1223 }
1224 return n + SizeVarint(uint64(n)) + tagsize
1225}
1226func sizeVarintS32Value(ptr pointer, tagsize int) int {
1227 v := *ptr.toInt32()
1228 return SizeVarint(uint64(v)) + tagsize
1229}
1230func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int {
1231 v := *ptr.toInt32()
1232 if v == 0 {
1233 return 0
1234 }
1235 return SizeVarint(uint64(v)) + tagsize
1236}
1237func sizeVarintS32Ptr(ptr pointer, tagsize int) int {
1238 p := ptr.getInt32Ptr()
1239 if p == nil {
1240 return 0
1241 }
1242 return SizeVarint(uint64(*p)) + tagsize
1243}
1244func sizeVarintS32Slice(ptr pointer, tagsize int) int {
1245 s := ptr.getInt32Slice()
1246 n := 0
1247 for _, v := range s {
1248 n += SizeVarint(uint64(v)) + tagsize
1249 }
1250 return n
1251}
1252func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int {
1253 s := ptr.getInt32Slice()
1254 if len(s) == 0 {
1255 return 0
1256 }
1257 n := 0
1258 for _, v := range s {
1259 n += SizeVarint(uint64(v))
1260 }
1261 return n + SizeVarint(uint64(n)) + tagsize
1262}
1263func sizeVarint64Value(ptr pointer, tagsize int) int {
1264 v := *ptr.toUint64()
1265 return SizeVarint(v) + tagsize
1266}
1267func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int {
1268 v := *ptr.toUint64()
1269 if v == 0 {
1270 return 0
1271 }
1272 return SizeVarint(v) + tagsize
1273}
1274func sizeVarint64Ptr(ptr pointer, tagsize int) int {
1275 p := *ptr.toUint64Ptr()
1276 if p == nil {
1277 return 0
1278 }
1279 return SizeVarint(*p) + tagsize
1280}
1281func sizeVarint64Slice(ptr pointer, tagsize int) int {
1282 s := *ptr.toUint64Slice()
1283 n := 0
1284 for _, v := range s {
1285 n += SizeVarint(v) + tagsize
1286 }
1287 return n
1288}
1289func sizeVarint64PackedSlice(ptr pointer, tagsize int) int {
1290 s := *ptr.toUint64Slice()
1291 if len(s) == 0 {
1292 return 0
1293 }
1294 n := 0
1295 for _, v := range s {
1296 n += SizeVarint(v)
1297 }
1298 return n + SizeVarint(uint64(n)) + tagsize
1299}
1300func sizeVarintS64Value(ptr pointer, tagsize int) int {
1301 v := *ptr.toInt64()
1302 return SizeVarint(uint64(v)) + tagsize
1303}
1304func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int {
1305 v := *ptr.toInt64()
1306 if v == 0 {
1307 return 0
1308 }
1309 return SizeVarint(uint64(v)) + tagsize
1310}
1311func sizeVarintS64Ptr(ptr pointer, tagsize int) int {
1312 p := *ptr.toInt64Ptr()
1313 if p == nil {
1314 return 0
1315 }
1316 return SizeVarint(uint64(*p)) + tagsize
1317}
1318func sizeVarintS64Slice(ptr pointer, tagsize int) int {
1319 s := *ptr.toInt64Slice()
1320 n := 0
1321 for _, v := range s {
1322 n += SizeVarint(uint64(v)) + tagsize
1323 }
1324 return n
1325}
1326func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int {
1327 s := *ptr.toInt64Slice()
1328 if len(s) == 0 {
1329 return 0
1330 }
1331 n := 0
1332 for _, v := range s {
1333 n += SizeVarint(uint64(v))
1334 }
1335 return n + SizeVarint(uint64(n)) + tagsize
1336}
1337func sizeZigzag32Value(ptr pointer, tagsize int) int {
1338 v := *ptr.toInt32()
1339 return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize
1340}
1341func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int {
1342 v := *ptr.toInt32()
1343 if v == 0 {
1344 return 0
1345 }
1346 return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize
1347}
1348func sizeZigzag32Ptr(ptr pointer, tagsize int) int {
1349 p := ptr.getInt32Ptr()
1350 if p == nil {
1351 return 0
1352 }
1353 v := *p
1354 return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize
1355}
1356func sizeZigzag32Slice(ptr pointer, tagsize int) int {
1357 s := ptr.getInt32Slice()
1358 n := 0
1359 for _, v := range s {
1360 n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize
1361 }
1362 return n
1363}
1364func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int {
1365 s := ptr.getInt32Slice()
1366 if len(s) == 0 {
1367 return 0
1368 }
1369 n := 0
1370 for _, v := range s {
1371 n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31))))
1372 }
1373 return n + SizeVarint(uint64(n)) + tagsize
1374}
1375func sizeZigzag64Value(ptr pointer, tagsize int) int {
1376 v := *ptr.toInt64()
1377 return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize
1378}
1379func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int {
1380 v := *ptr.toInt64()
1381 if v == 0 {
1382 return 0
1383 }
1384 return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize
1385}
1386func sizeZigzag64Ptr(ptr pointer, tagsize int) int {
1387 p := *ptr.toInt64Ptr()
1388 if p == nil {
1389 return 0
1390 }
1391 v := *p
1392 return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize
1393}
1394func sizeZigzag64Slice(ptr pointer, tagsize int) int {
1395 s := *ptr.toInt64Slice()
1396 n := 0
1397 for _, v := range s {
1398 n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize
1399 }
1400 return n
1401}
1402func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int {
1403 s := *ptr.toInt64Slice()
1404 if len(s) == 0 {
1405 return 0
1406 }
1407 n := 0
1408 for _, v := range s {
1409 n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63)))
1410 }
1411 return n + SizeVarint(uint64(n)) + tagsize
1412}
1413func sizeBoolValue(_ pointer, tagsize int) int {
1414 return 1 + tagsize
1415}
1416func sizeBoolValueNoZero(ptr pointer, tagsize int) int {
1417 v := *ptr.toBool()
1418 if !v {
1419 return 0
1420 }
1421 return 1 + tagsize
1422}
1423func sizeBoolPtr(ptr pointer, tagsize int) int {
1424 p := *ptr.toBoolPtr()
1425 if p == nil {
1426 return 0
1427 }
1428 return 1 + tagsize
1429}
1430func sizeBoolSlice(ptr pointer, tagsize int) int {
1431 s := *ptr.toBoolSlice()
1432 return (1 + tagsize) * len(s)
1433}
1434func sizeBoolPackedSlice(ptr pointer, tagsize int) int {
1435 s := *ptr.toBoolSlice()
1436 if len(s) == 0 {
1437 return 0
1438 }
1439 return len(s) + SizeVarint(uint64(len(s))) + tagsize
1440}
1441func sizeStringValue(ptr pointer, tagsize int) int {
1442 v := *ptr.toString()
1443 return len(v) + SizeVarint(uint64(len(v))) + tagsize
1444}
1445func sizeStringValueNoZero(ptr pointer, tagsize int) int {
1446 v := *ptr.toString()
1447 if v == "" {
1448 return 0
1449 }
1450 return len(v) + SizeVarint(uint64(len(v))) + tagsize
1451}
1452func sizeStringPtr(ptr pointer, tagsize int) int {
1453 p := *ptr.toStringPtr()
1454 if p == nil {
1455 return 0
1456 }
1457 v := *p
1458 return len(v) + SizeVarint(uint64(len(v))) + tagsize
1459}
1460func sizeStringSlice(ptr pointer, tagsize int) int {
1461 s := *ptr.toStringSlice()
1462 n := 0
1463 for _, v := range s {
1464 n += len(v) + SizeVarint(uint64(len(v))) + tagsize
1465 }
1466 return n
1467}
1468func sizeBytes(ptr pointer, tagsize int) int {
1469 v := *ptr.toBytes()
1470 if v == nil {
1471 return 0
1472 }
1473 return len(v) + SizeVarint(uint64(len(v))) + tagsize
1474}
1475func sizeBytes3(ptr pointer, tagsize int) int {
1476 v := *ptr.toBytes()
1477 if len(v) == 0 {
1478 return 0
1479 }
1480 return len(v) + SizeVarint(uint64(len(v))) + tagsize
1481}
1482func sizeBytesOneof(ptr pointer, tagsize int) int {
1483 v := *ptr.toBytes()
1484 return len(v) + SizeVarint(uint64(len(v))) + tagsize
1485}
1486func sizeBytesSlice(ptr pointer, tagsize int) int {
1487 s := *ptr.toBytesSlice()
1488 n := 0
1489 for _, v := range s {
1490 n += len(v) + SizeVarint(uint64(len(v))) + tagsize
1491 }
1492 return n
1493}
1494
1495// appendFixed32 appends an encoded fixed32 to b.
1496func appendFixed32(b []byte, v uint32) []byte {
1497 b = append(b,
1498 byte(v),
1499 byte(v>>8),
1500 byte(v>>16),
1501 byte(v>>24))
1502 return b
1503}
1504
1505// appendFixed64 appends an encoded fixed64 to b.
1506func appendFixed64(b []byte, v uint64) []byte {
1507 b = append(b,
1508 byte(v),
1509 byte(v>>8),
1510 byte(v>>16),
1511 byte(v>>24),
1512 byte(v>>32),
1513 byte(v>>40),
1514 byte(v>>48),
1515 byte(v>>56))
1516 return b
1517}
1518
1519// appendVarint appends an encoded varint to b.
1520func appendVarint(b []byte, v uint64) []byte {
1521 // TODO: make 1-byte (maybe 2-byte) case inline-able, once we
1522 // have non-leaf inliner.
1523 switch {
1524 case v < 1<<7:
1525 b = append(b, byte(v))
1526 case v < 1<<14:
1527 b = append(b,
1528 byte(v&0x7f|0x80),
1529 byte(v>>7))
1530 case v < 1<<21:
1531 b = append(b,
1532 byte(v&0x7f|0x80),
1533 byte((v>>7)&0x7f|0x80),
1534 byte(v>>14))
1535 case v < 1<<28:
1536 b = append(b,
1537 byte(v&0x7f|0x80),
1538 byte((v>>7)&0x7f|0x80),
1539 byte((v>>14)&0x7f|0x80),
1540 byte(v>>21))
1541 case v < 1<<35:
1542 b = append(b,
1543 byte(v&0x7f|0x80),
1544 byte((v>>7)&0x7f|0x80),
1545 byte((v>>14)&0x7f|0x80),
1546 byte((v>>21)&0x7f|0x80),
1547 byte(v>>28))
1548 case v < 1<<42:
1549 b = append(b,
1550 byte(v&0x7f|0x80),
1551 byte((v>>7)&0x7f|0x80),
1552 byte((v>>14)&0x7f|0x80),
1553 byte((v>>21)&0x7f|0x80),
1554 byte((v>>28)&0x7f|0x80),
1555 byte(v>>35))
1556 case v < 1<<49:
1557 b = append(b,
1558 byte(v&0x7f|0x80),
1559 byte((v>>7)&0x7f|0x80),
1560 byte((v>>14)&0x7f|0x80),
1561 byte((v>>21)&0x7f|0x80),
1562 byte((v>>28)&0x7f|0x80),
1563 byte((v>>35)&0x7f|0x80),
1564 byte(v>>42))
1565 case v < 1<<56:
1566 b = append(b,
1567 byte(v&0x7f|0x80),
1568 byte((v>>7)&0x7f|0x80),
1569 byte((v>>14)&0x7f|0x80),
1570 byte((v>>21)&0x7f|0x80),
1571 byte((v>>28)&0x7f|0x80),
1572 byte((v>>35)&0x7f|0x80),
1573 byte((v>>42)&0x7f|0x80),
1574 byte(v>>49))
1575 case v < 1<<63:
1576 b = append(b,
1577 byte(v&0x7f|0x80),
1578 byte((v>>7)&0x7f|0x80),
1579 byte((v>>14)&0x7f|0x80),
1580 byte((v>>21)&0x7f|0x80),
1581 byte((v>>28)&0x7f|0x80),
1582 byte((v>>35)&0x7f|0x80),
1583 byte((v>>42)&0x7f|0x80),
1584 byte((v>>49)&0x7f|0x80),
1585 byte(v>>56))
1586 default:
1587 b = append(b,
1588 byte(v&0x7f|0x80),
1589 byte((v>>7)&0x7f|0x80),
1590 byte((v>>14)&0x7f|0x80),
1591 byte((v>>21)&0x7f|0x80),
1592 byte((v>>28)&0x7f|0x80),
1593 byte((v>>35)&0x7f|0x80),
1594 byte((v>>42)&0x7f|0x80),
1595 byte((v>>49)&0x7f|0x80),
1596 byte((v>>56)&0x7f|0x80),
1597 1)
1598 }
1599 return b
1600}
1601
1602func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1603 v := *ptr.toUint32()
1604 b = appendVarint(b, wiretag)
1605 b = appendFixed32(b, v)
1606 return b, nil
1607}
1608func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1609 v := *ptr.toUint32()
1610 if v == 0 {
1611 return b, nil
1612 }
1613 b = appendVarint(b, wiretag)
1614 b = appendFixed32(b, v)
1615 return b, nil
1616}
1617func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1618 p := *ptr.toUint32Ptr()
1619 if p == nil {
1620 return b, nil
1621 }
1622 b = appendVarint(b, wiretag)
1623 b = appendFixed32(b, *p)
1624 return b, nil
1625}
1626func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1627 s := *ptr.toUint32Slice()
1628 for _, v := range s {
1629 b = appendVarint(b, wiretag)
1630 b = appendFixed32(b, v)
1631 }
1632 return b, nil
1633}
1634func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1635 s := *ptr.toUint32Slice()
1636 if len(s) == 0 {
1637 return b, nil
1638 }
1639 b = appendVarint(b, wiretag&^7|WireBytes)
1640 b = appendVarint(b, uint64(4*len(s)))
1641 for _, v := range s {
1642 b = appendFixed32(b, v)
1643 }
1644 return b, nil
1645}
1646func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1647 v := *ptr.toInt32()
1648 b = appendVarint(b, wiretag)
1649 b = appendFixed32(b, uint32(v))
1650 return b, nil
1651}
1652func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1653 v := *ptr.toInt32()
1654 if v == 0 {
1655 return b, nil
1656 }
1657 b = appendVarint(b, wiretag)
1658 b = appendFixed32(b, uint32(v))
1659 return b, nil
1660}
1661func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1662 p := ptr.getInt32Ptr()
1663 if p == nil {
1664 return b, nil
1665 }
1666 b = appendVarint(b, wiretag)
1667 b = appendFixed32(b, uint32(*p))
1668 return b, nil
1669}
1670func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1671 s := ptr.getInt32Slice()
1672 for _, v := range s {
1673 b = appendVarint(b, wiretag)
1674 b = appendFixed32(b, uint32(v))
1675 }
1676 return b, nil
1677}
1678func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1679 s := ptr.getInt32Slice()
1680 if len(s) == 0 {
1681 return b, nil
1682 }
1683 b = appendVarint(b, wiretag&^7|WireBytes)
1684 b = appendVarint(b, uint64(4*len(s)))
1685 for _, v := range s {
1686 b = appendFixed32(b, uint32(v))
1687 }
1688 return b, nil
1689}
1690func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1691 v := math.Float32bits(*ptr.toFloat32())
1692 b = appendVarint(b, wiretag)
1693 b = appendFixed32(b, v)
1694 return b, nil
1695}
1696func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1697 v := math.Float32bits(*ptr.toFloat32())
1698 if v == 0 {
1699 return b, nil
1700 }
1701 b = appendVarint(b, wiretag)
1702 b = appendFixed32(b, v)
1703 return b, nil
1704}
1705func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1706 p := *ptr.toFloat32Ptr()
1707 if p == nil {
1708 return b, nil
1709 }
1710 b = appendVarint(b, wiretag)
1711 b = appendFixed32(b, math.Float32bits(*p))
1712 return b, nil
1713}
1714func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1715 s := *ptr.toFloat32Slice()
1716 for _, v := range s {
1717 b = appendVarint(b, wiretag)
1718 b = appendFixed32(b, math.Float32bits(v))
1719 }
1720 return b, nil
1721}
1722func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1723 s := *ptr.toFloat32Slice()
1724 if len(s) == 0 {
1725 return b, nil
1726 }
1727 b = appendVarint(b, wiretag&^7|WireBytes)
1728 b = appendVarint(b, uint64(4*len(s)))
1729 for _, v := range s {
1730 b = appendFixed32(b, math.Float32bits(v))
1731 }
1732 return b, nil
1733}
1734func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1735 v := *ptr.toUint64()
1736 b = appendVarint(b, wiretag)
1737 b = appendFixed64(b, v)
1738 return b, nil
1739}
1740func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1741 v := *ptr.toUint64()
1742 if v == 0 {
1743 return b, nil
1744 }
1745 b = appendVarint(b, wiretag)
1746 b = appendFixed64(b, v)
1747 return b, nil
1748}
1749func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1750 p := *ptr.toUint64Ptr()
1751 if p == nil {
1752 return b, nil
1753 }
1754 b = appendVarint(b, wiretag)
1755 b = appendFixed64(b, *p)
1756 return b, nil
1757}
1758func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1759 s := *ptr.toUint64Slice()
1760 for _, v := range s {
1761 b = appendVarint(b, wiretag)
1762 b = appendFixed64(b, v)
1763 }
1764 return b, nil
1765}
1766func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1767 s := *ptr.toUint64Slice()
1768 if len(s) == 0 {
1769 return b, nil
1770 }
1771 b = appendVarint(b, wiretag&^7|WireBytes)
1772 b = appendVarint(b, uint64(8*len(s)))
1773 for _, v := range s {
1774 b = appendFixed64(b, v)
1775 }
1776 return b, nil
1777}
1778func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1779 v := *ptr.toInt64()
1780 b = appendVarint(b, wiretag)
1781 b = appendFixed64(b, uint64(v))
1782 return b, nil
1783}
1784func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1785 v := *ptr.toInt64()
1786 if v == 0 {
1787 return b, nil
1788 }
1789 b = appendVarint(b, wiretag)
1790 b = appendFixed64(b, uint64(v))
1791 return b, nil
1792}
1793func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1794 p := *ptr.toInt64Ptr()
1795 if p == nil {
1796 return b, nil
1797 }
1798 b = appendVarint(b, wiretag)
1799 b = appendFixed64(b, uint64(*p))
1800 return b, nil
1801}
1802func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1803 s := *ptr.toInt64Slice()
1804 for _, v := range s {
1805 b = appendVarint(b, wiretag)
1806 b = appendFixed64(b, uint64(v))
1807 }
1808 return b, nil
1809}
1810func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1811 s := *ptr.toInt64Slice()
1812 if len(s) == 0 {
1813 return b, nil
1814 }
1815 b = appendVarint(b, wiretag&^7|WireBytes)
1816 b = appendVarint(b, uint64(8*len(s)))
1817 for _, v := range s {
1818 b = appendFixed64(b, uint64(v))
1819 }
1820 return b, nil
1821}
1822func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1823 v := math.Float64bits(*ptr.toFloat64())
1824 b = appendVarint(b, wiretag)
1825 b = appendFixed64(b, v)
1826 return b, nil
1827}
1828func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1829 v := math.Float64bits(*ptr.toFloat64())
1830 if v == 0 {
1831 return b, nil
1832 }
1833 b = appendVarint(b, wiretag)
1834 b = appendFixed64(b, v)
1835 return b, nil
1836}
1837func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1838 p := *ptr.toFloat64Ptr()
1839 if p == nil {
1840 return b, nil
1841 }
1842 b = appendVarint(b, wiretag)
1843 b = appendFixed64(b, math.Float64bits(*p))
1844 return b, nil
1845}
1846func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1847 s := *ptr.toFloat64Slice()
1848 for _, v := range s {
1849 b = appendVarint(b, wiretag)
1850 b = appendFixed64(b, math.Float64bits(v))
1851 }
1852 return b, nil
1853}
1854func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1855 s := *ptr.toFloat64Slice()
1856 if len(s) == 0 {
1857 return b, nil
1858 }
1859 b = appendVarint(b, wiretag&^7|WireBytes)
1860 b = appendVarint(b, uint64(8*len(s)))
1861 for _, v := range s {
1862 b = appendFixed64(b, math.Float64bits(v))
1863 }
1864 return b, nil
1865}
1866func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1867 v := *ptr.toUint32()
1868 b = appendVarint(b, wiretag)
1869 b = appendVarint(b, uint64(v))
1870 return b, nil
1871}
1872func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1873 v := *ptr.toUint32()
1874 if v == 0 {
1875 return b, nil
1876 }
1877 b = appendVarint(b, wiretag)
1878 b = appendVarint(b, uint64(v))
1879 return b, nil
1880}
1881func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1882 p := *ptr.toUint32Ptr()
1883 if p == nil {
1884 return b, nil
1885 }
1886 b = appendVarint(b, wiretag)
1887 b = appendVarint(b, uint64(*p))
1888 return b, nil
1889}
1890func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1891 s := *ptr.toUint32Slice()
1892 for _, v := range s {
1893 b = appendVarint(b, wiretag)
1894 b = appendVarint(b, uint64(v))
1895 }
1896 return b, nil
1897}
1898func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1899 s := *ptr.toUint32Slice()
1900 if len(s) == 0 {
1901 return b, nil
1902 }
1903 b = appendVarint(b, wiretag&^7|WireBytes)
1904 // compute size
1905 n := 0
1906 for _, v := range s {
1907 n += SizeVarint(uint64(v))
1908 }
1909 b = appendVarint(b, uint64(n))
1910 for _, v := range s {
1911 b = appendVarint(b, uint64(v))
1912 }
1913 return b, nil
1914}
1915func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1916 v := *ptr.toInt32()
1917 b = appendVarint(b, wiretag)
1918 b = appendVarint(b, uint64(v))
1919 return b, nil
1920}
1921func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1922 v := *ptr.toInt32()
1923 if v == 0 {
1924 return b, nil
1925 }
1926 b = appendVarint(b, wiretag)
1927 b = appendVarint(b, uint64(v))
1928 return b, nil
1929}
1930func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1931 p := ptr.getInt32Ptr()
1932 if p == nil {
1933 return b, nil
1934 }
1935 b = appendVarint(b, wiretag)
1936 b = appendVarint(b, uint64(*p))
1937 return b, nil
1938}
1939func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1940 s := ptr.getInt32Slice()
1941 for _, v := range s {
1942 b = appendVarint(b, wiretag)
1943 b = appendVarint(b, uint64(v))
1944 }
1945 return b, nil
1946}
1947func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1948 s := ptr.getInt32Slice()
1949 if len(s) == 0 {
1950 return b, nil
1951 }
1952 b = appendVarint(b, wiretag&^7|WireBytes)
1953 // compute size
1954 n := 0
1955 for _, v := range s {
1956 n += SizeVarint(uint64(v))
1957 }
1958 b = appendVarint(b, uint64(n))
1959 for _, v := range s {
1960 b = appendVarint(b, uint64(v))
1961 }
1962 return b, nil
1963}
1964func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1965 v := *ptr.toUint64()
1966 b = appendVarint(b, wiretag)
1967 b = appendVarint(b, v)
1968 return b, nil
1969}
1970func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1971 v := *ptr.toUint64()
1972 if v == 0 {
1973 return b, nil
1974 }
1975 b = appendVarint(b, wiretag)
1976 b = appendVarint(b, v)
1977 return b, nil
1978}
1979func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1980 p := *ptr.toUint64Ptr()
1981 if p == nil {
1982 return b, nil
1983 }
1984 b = appendVarint(b, wiretag)
1985 b = appendVarint(b, *p)
1986 return b, nil
1987}
1988func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1989 s := *ptr.toUint64Slice()
1990 for _, v := range s {
1991 b = appendVarint(b, wiretag)
1992 b = appendVarint(b, v)
1993 }
1994 return b, nil
1995}
1996func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1997 s := *ptr.toUint64Slice()
1998 if len(s) == 0 {
1999 return b, nil
2000 }
2001 b = appendVarint(b, wiretag&^7|WireBytes)
2002 // compute size
2003 n := 0
2004 for _, v := range s {
2005 n += SizeVarint(v)
2006 }
2007 b = appendVarint(b, uint64(n))
2008 for _, v := range s {
2009 b = appendVarint(b, v)
2010 }
2011 return b, nil
2012}
2013func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2014 v := *ptr.toInt64()
2015 b = appendVarint(b, wiretag)
2016 b = appendVarint(b, uint64(v))
2017 return b, nil
2018}
2019func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2020 v := *ptr.toInt64()
2021 if v == 0 {
2022 return b, nil
2023 }
2024 b = appendVarint(b, wiretag)
2025 b = appendVarint(b, uint64(v))
2026 return b, nil
2027}
2028func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2029 p := *ptr.toInt64Ptr()
2030 if p == nil {
2031 return b, nil
2032 }
2033 b = appendVarint(b, wiretag)
2034 b = appendVarint(b, uint64(*p))
2035 return b, nil
2036}
2037func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2038 s := *ptr.toInt64Slice()
2039 for _, v := range s {
2040 b = appendVarint(b, wiretag)
2041 b = appendVarint(b, uint64(v))
2042 }
2043 return b, nil
2044}
2045func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2046 s := *ptr.toInt64Slice()
2047 if len(s) == 0 {
2048 return b, nil
2049 }
2050 b = appendVarint(b, wiretag&^7|WireBytes)
2051 // compute size
2052 n := 0
2053 for _, v := range s {
2054 n += SizeVarint(uint64(v))
2055 }
2056 b = appendVarint(b, uint64(n))
2057 for _, v := range s {
2058 b = appendVarint(b, uint64(v))
2059 }
2060 return b, nil
2061}
2062func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2063 v := *ptr.toInt32()
2064 b = appendVarint(b, wiretag)
2065 b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2066 return b, nil
2067}
2068func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2069 v := *ptr.toInt32()
2070 if v == 0 {
2071 return b, nil
2072 }
2073 b = appendVarint(b, wiretag)
2074 b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2075 return b, nil
2076}
2077func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2078 p := ptr.getInt32Ptr()
2079 if p == nil {
2080 return b, nil
2081 }
2082 b = appendVarint(b, wiretag)
2083 v := *p
2084 b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2085 return b, nil
2086}
2087func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2088 s := ptr.getInt32Slice()
2089 for _, v := range s {
2090 b = appendVarint(b, wiretag)
2091 b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2092 }
2093 return b, nil
2094}
2095func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2096 s := ptr.getInt32Slice()
2097 if len(s) == 0 {
2098 return b, nil
2099 }
2100 b = appendVarint(b, wiretag&^7|WireBytes)
2101 // compute size
2102 n := 0
2103 for _, v := range s {
2104 n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31))))
2105 }
2106 b = appendVarint(b, uint64(n))
2107 for _, v := range s {
2108 b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2109 }
2110 return b, nil
2111}
2112func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2113 v := *ptr.toInt64()
2114 b = appendVarint(b, wiretag)
2115 b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2116 return b, nil
2117}
2118func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2119 v := *ptr.toInt64()
2120 if v == 0 {
2121 return b, nil
2122 }
2123 b = appendVarint(b, wiretag)
2124 b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2125 return b, nil
2126}
2127func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2128 p := *ptr.toInt64Ptr()
2129 if p == nil {
2130 return b, nil
2131 }
2132 b = appendVarint(b, wiretag)
2133 v := *p
2134 b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2135 return b, nil
2136}
2137func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2138 s := *ptr.toInt64Slice()
2139 for _, v := range s {
2140 b = appendVarint(b, wiretag)
2141 b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2142 }
2143 return b, nil
2144}
2145func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2146 s := *ptr.toInt64Slice()
2147 if len(s) == 0 {
2148 return b, nil
2149 }
2150 b = appendVarint(b, wiretag&^7|WireBytes)
2151 // compute size
2152 n := 0
2153 for _, v := range s {
2154 n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63)))
2155 }
2156 b = appendVarint(b, uint64(n))
2157 for _, v := range s {
2158 b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2159 }
2160 return b, nil
2161}
2162func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2163 v := *ptr.toBool()
2164 b = appendVarint(b, wiretag)
2165 if v {
2166 b = append(b, 1)
2167 } else {
2168 b = append(b, 0)
2169 }
2170 return b, nil
2171}
2172func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2173 v := *ptr.toBool()
2174 if !v {
2175 return b, nil
2176 }
2177 b = appendVarint(b, wiretag)
2178 b = append(b, 1)
2179 return b, nil
2180}
2181
2182func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2183 p := *ptr.toBoolPtr()
2184 if p == nil {
2185 return b, nil
2186 }
2187 b = appendVarint(b, wiretag)
2188 if *p {
2189 b = append(b, 1)
2190 } else {
2191 b = append(b, 0)
2192 }
2193 return b, nil
2194}
2195func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2196 s := *ptr.toBoolSlice()
2197 for _, v := range s {
2198 b = appendVarint(b, wiretag)
2199 if v {
2200 b = append(b, 1)
2201 } else {
2202 b = append(b, 0)
2203 }
2204 }
2205 return b, nil
2206}
2207func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2208 s := *ptr.toBoolSlice()
2209 if len(s) == 0 {
2210 return b, nil
2211 }
2212 b = appendVarint(b, wiretag&^7|WireBytes)
2213 b = appendVarint(b, uint64(len(s)))
2214 for _, v := range s {
2215 if v {
2216 b = append(b, 1)
2217 } else {
2218 b = append(b, 0)
2219 }
2220 }
2221 return b, nil
2222}
2223func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2224 v := *ptr.toString()
2225 b = appendVarint(b, wiretag)
2226 b = appendVarint(b, uint64(len(v)))
2227 b = append(b, v...)
2228 return b, nil
2229}
2230func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2231 v := *ptr.toString()
2232 if v == "" {
2233 return b, nil
2234 }
2235 b = appendVarint(b, wiretag)
2236 b = appendVarint(b, uint64(len(v)))
2237 b = append(b, v...)
2238 return b, nil
2239}
2240func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2241 p := *ptr.toStringPtr()
2242 if p == nil {
2243 return b, nil
2244 }
2245 v := *p
2246 b = appendVarint(b, wiretag)
2247 b = appendVarint(b, uint64(len(v)))
2248 b = append(b, v...)
2249 return b, nil
2250}
2251func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2252 s := *ptr.toStringSlice()
2253 for _, v := range s {
2254 b = appendVarint(b, wiretag)
2255 b = appendVarint(b, uint64(len(v)))
2256 b = append(b, v...)
2257 }
2258 return b, nil
2259}
2260func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2261 var invalidUTF8 bool
2262 v := *ptr.toString()
2263 if !utf8.ValidString(v) {
2264 invalidUTF8 = true
2265 }
2266 b = appendVarint(b, wiretag)
2267 b = appendVarint(b, uint64(len(v)))
2268 b = append(b, v...)
2269 if invalidUTF8 {
2270 return b, errInvalidUTF8
2271 }
2272 return b, nil
2273}
2274func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2275 var invalidUTF8 bool
2276 v := *ptr.toString()
2277 if v == "" {
2278 return b, nil
2279 }
2280 if !utf8.ValidString(v) {
2281 invalidUTF8 = true
2282 }
2283 b = appendVarint(b, wiretag)
2284 b = appendVarint(b, uint64(len(v)))
2285 b = append(b, v...)
2286 if invalidUTF8 {
2287 return b, errInvalidUTF8
2288 }
2289 return b, nil
2290}
2291func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2292 var invalidUTF8 bool
2293 p := *ptr.toStringPtr()
2294 if p == nil {
2295 return b, nil
2296 }
2297 v := *p
2298 if !utf8.ValidString(v) {
2299 invalidUTF8 = true
2300 }
2301 b = appendVarint(b, wiretag)
2302 b = appendVarint(b, uint64(len(v)))
2303 b = append(b, v...)
2304 if invalidUTF8 {
2305 return b, errInvalidUTF8
2306 }
2307 return b, nil
2308}
2309func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2310 var invalidUTF8 bool
2311 s := *ptr.toStringSlice()
2312 for _, v := range s {
2313 if !utf8.ValidString(v) {
2314 invalidUTF8 = true
2315 }
2316 b = appendVarint(b, wiretag)
2317 b = appendVarint(b, uint64(len(v)))
2318 b = append(b, v...)
2319 }
2320 if invalidUTF8 {
2321 return b, errInvalidUTF8
2322 }
2323 return b, nil
2324}
2325func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2326 v := *ptr.toBytes()
2327 if v == nil {
2328 return b, nil
2329 }
2330 b = appendVarint(b, wiretag)
2331 b = appendVarint(b, uint64(len(v)))
2332 b = append(b, v...)
2333 return b, nil
2334}
2335func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2336 v := *ptr.toBytes()
2337 if len(v) == 0 {
2338 return b, nil
2339 }
2340 b = appendVarint(b, wiretag)
2341 b = appendVarint(b, uint64(len(v)))
2342 b = append(b, v...)
2343 return b, nil
2344}
2345func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2346 v := *ptr.toBytes()
2347 b = appendVarint(b, wiretag)
2348 b = appendVarint(b, uint64(len(v)))
2349 b = append(b, v...)
2350 return b, nil
2351}
2352func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2353 s := *ptr.toBytesSlice()
2354 for _, v := range s {
2355 b = appendVarint(b, wiretag)
2356 b = appendVarint(b, uint64(len(v)))
2357 b = append(b, v...)
2358 }
2359 return b, nil
2360}
2361
2362// makeGroupMarshaler returns the sizer and marshaler for a group.
2363// u is the marshal info of the underlying message.
2364func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) {
2365 return func(ptr pointer, tagsize int) int {
2366 p := ptr.getPointer()
2367 if p.isNil() {
2368 return 0
2369 }
2370 return u.size(p) + 2*tagsize
2371 },
2372 func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) {
2373 p := ptr.getPointer()
2374 if p.isNil() {
2375 return b, nil
2376 }
2377 var err error
2378 b = appendVarint(b, wiretag) // start group
2379 b, err = u.marshal(b, p, deterministic)
2380 b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group
2381 return b, err
2382 }
2383}
2384
2385// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice.
2386// u is the marshal info of the underlying message.
2387func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) {
2388 return func(ptr pointer, tagsize int) int {
2389 s := ptr.getPointerSlice()
2390 n := 0
2391 for _, v := range s {
2392 if v.isNil() {
2393 continue
2394 }
2395 n += u.size(v) + 2*tagsize
2396 }
2397 return n
2398 },
2399 func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) {
2400 s := ptr.getPointerSlice()
2401 var err error
2402 var nerr nonFatal
2403 for _, v := range s {
2404 if v.isNil() {
2405 return b, errRepeatedHasNil
2406 }
2407 b = appendVarint(b, wiretag) // start group
2408 b, err = u.marshal(b, v, deterministic)
2409 b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group
2410 if !nerr.Merge(err) {
2411 if err == ErrNil {
2412 err = errRepeatedHasNil
2413 }
2414 return b, err
2415 }
2416 }
2417 return b, nerr.E
2418 }
2419}
2420
2421// makeMessageMarshaler returns the sizer and marshaler for a message field.
2422// u is the marshal info of the message.
2423func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) {
2424 return func(ptr pointer, tagsize int) int {
2425 p := ptr.getPointer()
2426 if p.isNil() {
2427 return 0
2428 }
2429 siz := u.size(p)
2430 return siz + SizeVarint(uint64(siz)) + tagsize
2431 },
2432 func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) {
2433 p := ptr.getPointer()
2434 if p.isNil() {
2435 return b, nil
2436 }
2437 b = appendVarint(b, wiretag)
2438 siz := u.cachedsize(p)
2439 b = appendVarint(b, uint64(siz))
2440 return u.marshal(b, p, deterministic)
2441 }
2442}
2443
2444// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice.
2445// u is the marshal info of the message.
2446func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) {
2447 return func(ptr pointer, tagsize int) int {
2448 s := ptr.getPointerSlice()
2449 n := 0
2450 for _, v := range s {
2451 if v.isNil() {
2452 continue
2453 }
2454 siz := u.size(v)
2455 n += siz + SizeVarint(uint64(siz)) + tagsize
2456 }
2457 return n
2458 },
2459 func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) {
2460 s := ptr.getPointerSlice()
2461 var err error
2462 var nerr nonFatal
2463 for _, v := range s {
2464 if v.isNil() {
2465 return b, errRepeatedHasNil
2466 }
2467 b = appendVarint(b, wiretag)
2468 siz := u.cachedsize(v)
2469 b = appendVarint(b, uint64(siz))
2470 b, err = u.marshal(b, v, deterministic)
2471
2472 if !nerr.Merge(err) {
2473 if err == ErrNil {
2474 err = errRepeatedHasNil
2475 }
2476 return b, err
2477 }
2478 }
2479 return b, nerr.E
2480 }
2481}
2482
2483// makeMapMarshaler returns the sizer and marshaler for a map field.
2484// f is the pointer to the reflect data structure of the field.
2485func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) {
2486 // figure out key and value type
2487 t := f.Type
2488 keyType := t.Key()
2489 valType := t.Elem()
2490 tags := strings.Split(f.Tag.Get("protobuf"), ",")
2491 keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",")
2492 valTags := strings.Split(f.Tag.Get("protobuf_val"), ",")
2493 stdOptions := false
2494 for _, t := range tags {
2495 if strings.HasPrefix(t, "customtype=") {
2496 valTags = append(valTags, t)
2497 }
2498 if t == "stdtime" {
2499 valTags = append(valTags, t)
2500 stdOptions = true
2501 }
2502 if t == "stdduration" {
2503 valTags = append(valTags, t)
2504 stdOptions = true
2505 }
2506 if t == "wktptr" {
2507 valTags = append(valTags, t)
2508 }
2509 }
2510 keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map
2511 valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map
2512 keyWireTag := 1<<3 | wiretype(keyTags[0])
2513 valWireTag := 2<<3 | wiretype(valTags[0])
2514
2515 // We create an interface to get the addresses of the map key and value.
2516 // If value is pointer-typed, the interface is a direct interface, the
2517 // idata itself is the value. Otherwise, the idata is the pointer to the
2518 // value.
2519 // Key cannot be pointer-typed.
2520 valIsPtr := valType.Kind() == reflect.Ptr
2521
2522 // If value is a message with nested maps, calling
2523 // valSizer in marshal may be quadratic. We should use
2524 // cached version in marshal (but not in size).
2525 // If value is not message type, we don't have size cache,
2526 // but it cannot be nested either. Just use valSizer.
2527 valCachedSizer := valSizer
2528 if valIsPtr && !stdOptions && valType.Elem().Kind() == reflect.Struct {
2529 u := getMarshalInfo(valType.Elem())
2530 valCachedSizer = func(ptr pointer, tagsize int) int {
2531 // Same as message sizer, but use cache.
2532 p := ptr.getPointer()
2533 if p.isNil() {
2534 return 0
2535 }
2536 siz := u.cachedsize(p)
2537 return siz + SizeVarint(uint64(siz)) + tagsize
2538 }
2539 }
2540 return func(ptr pointer, tagsize int) int {
2541 m := ptr.asPointerTo(t).Elem() // the map
2542 n := 0
2543 for _, k := range m.MapKeys() {
2544 ki := k.Interface()
2545 vi := m.MapIndex(k).Interface()
2546 kaddr := toAddrPointer(&ki, false) // pointer to key
2547 vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value
2548 siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
2549 n += siz + SizeVarint(uint64(siz)) + tagsize
2550 }
2551 return n
2552 },
2553 func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) {
2554 m := ptr.asPointerTo(t).Elem() // the map
2555 var err error
2556 keys := m.MapKeys()
2557 if len(keys) > 1 && deterministic {
2558 sort.Sort(mapKeys(keys))
2559 }
2560
2561 var nerr nonFatal
2562 for _, k := range keys {
2563 ki := k.Interface()
2564 vi := m.MapIndex(k).Interface()
2565 kaddr := toAddrPointer(&ki, false) // pointer to key
2566 vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value
2567 b = appendVarint(b, tag)
2568 siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
2569 b = appendVarint(b, uint64(siz))
2570 b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic)
2571 if !nerr.Merge(err) {
2572 return b, err
2573 }
2574 b, err = valMarshaler(b, vaddr, valWireTag, deterministic)
2575 if err != ErrNil && !nerr.Merge(err) { // allow nil value in map
2576 return b, err
2577 }
2578 }
2579 return b, nerr.E
2580 }
2581}
2582
2583// makeOneOfMarshaler returns the sizer and marshaler for a oneof field.
2584// fi is the marshal info of the field.
2585// f is the pointer to the reflect data structure of the field.
2586func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) {
2587 // Oneof field is an interface. We need to get the actual data type on the fly.
2588 t := f.Type
2589 return func(ptr pointer, _ int) int {
2590 p := ptr.getInterfacePointer()
2591 if p.isNil() {
2592 return 0
2593 }
2594 v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct
2595 telem := v.Type()
2596 e := fi.oneofElems[telem]
2597 return e.sizer(p, e.tagsize)
2598 },
2599 func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) {
2600 p := ptr.getInterfacePointer()
2601 if p.isNil() {
2602 return b, nil
2603 }
2604 v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct
2605 telem := v.Type()
2606 if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() {
2607 return b, errOneofHasNil
2608 }
2609 e := fi.oneofElems[telem]
2610 return e.marshaler(b, p, e.wiretag, deterministic)
2611 }
2612}
2613
2614// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field.
2615func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int {
2616 m, mu := ext.extensionsRead()
2617 if m == nil {
2618 return 0
2619 }
2620 mu.Lock()
2621
2622 n := 0
2623 for _, e := range m {
2624 if e.value == nil || e.desc == nil {
2625 // Extension is only in its encoded form.
2626 n += len(e.enc)
2627 continue
2628 }
2629
2630 // We don't skip extensions that have an encoded form set,
2631 // because the extension value may have been mutated after
2632 // the last time this function was called.
2633 ei := u.getExtElemInfo(e.desc)
2634 v := e.value
2635 p := toAddrPointer(&v, ei.isptr)
2636 n += ei.sizer(p, ei.tagsize)
2637 }
2638 mu.Unlock()
2639 return n
2640}
2641
2642// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b.
2643func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) {
2644 m, mu := ext.extensionsRead()
2645 if m == nil {
2646 return b, nil
2647 }
2648 mu.Lock()
2649 defer mu.Unlock()
2650
2651 var err error
2652 var nerr nonFatal
2653
2654 // Fast-path for common cases: zero or one extensions.
2655 // Don't bother sorting the keys.
2656 if len(m) <= 1 {
2657 for _, e := range m {
2658 if e.value == nil || e.desc == nil {
2659 // Extension is only in its encoded form.
2660 b = append(b, e.enc...)
2661 continue
2662 }
2663
2664 // We don't skip extensions that have an encoded form set,
2665 // because the extension value may have been mutated after
2666 // the last time this function was called.
2667
2668 ei := u.getExtElemInfo(e.desc)
2669 v := e.value
2670 p := toAddrPointer(&v, ei.isptr)
2671 b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
2672 if !nerr.Merge(err) {
2673 return b, err
2674 }
2675 }
2676 return b, nerr.E
2677 }
2678
2679 // Sort the keys to provide a deterministic encoding.
2680 // Not sure this is required, but the old code does it.
2681 keys := make([]int, 0, len(m))
2682 for k := range m {
2683 keys = append(keys, int(k))
2684 }
2685 sort.Ints(keys)
2686
2687 for _, k := range keys {
2688 e := m[int32(k)]
2689 if e.value == nil || e.desc == nil {
2690 // Extension is only in its encoded form.
2691 b = append(b, e.enc...)
2692 continue
2693 }
2694
2695 // We don't skip extensions that have an encoded form set,
2696 // because the extension value may have been mutated after
2697 // the last time this function was called.
2698
2699 ei := u.getExtElemInfo(e.desc)
2700 v := e.value
2701 p := toAddrPointer(&v, ei.isptr)
2702 b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
2703 if !nerr.Merge(err) {
2704 return b, err
2705 }
2706 }
2707 return b, nerr.E
2708}
2709
2710// message set format is:
2711// message MessageSet {
2712// repeated group Item = 1 {
2713// required int32 type_id = 2;
2714// required string message = 3;
2715// };
2716// }
2717
2718// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field
2719// in message set format (above).
2720func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int {
2721 m, mu := ext.extensionsRead()
2722 if m == nil {
2723 return 0
2724 }
2725 mu.Lock()
2726
2727 n := 0
2728 for id, e := range m {
2729 n += 2 // start group, end group. tag = 1 (size=1)
2730 n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1)
2731
2732 if e.value == nil || e.desc == nil {
2733 // Extension is only in its encoded form.
2734 msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint
2735 siz := len(msgWithLen)
2736 n += siz + 1 // message, tag = 3 (size=1)
2737 continue
2738 }
2739
2740 // We don't skip extensions that have an encoded form set,
2741 // because the extension value may have been mutated after
2742 // the last time this function was called.
2743
2744 ei := u.getExtElemInfo(e.desc)
2745 v := e.value
2746 p := toAddrPointer(&v, ei.isptr)
2747 n += ei.sizer(p, 1) // message, tag = 3 (size=1)
2748 }
2749 mu.Unlock()
2750 return n
2751}
2752
2753// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above)
2754// to the end of byte slice b.
2755func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) {
2756 m, mu := ext.extensionsRead()
2757 if m == nil {
2758 return b, nil
2759 }
2760 mu.Lock()
2761 defer mu.Unlock()
2762
2763 var err error
2764 var nerr nonFatal
2765
2766 // Fast-path for common cases: zero or one extensions.
2767 // Don't bother sorting the keys.
2768 if len(m) <= 1 {
2769 for id, e := range m {
2770 b = append(b, 1<<3|WireStartGroup)
2771 b = append(b, 2<<3|WireVarint)
2772 b = appendVarint(b, uint64(id))
2773
2774 if e.value == nil || e.desc == nil {
2775 // Extension is only in its encoded form.
2776 msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint
2777 b = append(b, 3<<3|WireBytes)
2778 b = append(b, msgWithLen...)
2779 b = append(b, 1<<3|WireEndGroup)
2780 continue
2781 }
2782
2783 // We don't skip extensions that have an encoded form set,
2784 // because the extension value may have been mutated after
2785 // the last time this function was called.
2786
2787 ei := u.getExtElemInfo(e.desc)
2788 v := e.value
2789 p := toAddrPointer(&v, ei.isptr)
2790 b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
2791 if !nerr.Merge(err) {
2792 return b, err
2793 }
2794 b = append(b, 1<<3|WireEndGroup)
2795 }
2796 return b, nerr.E
2797 }
2798
2799 // Sort the keys to provide a deterministic encoding.
2800 keys := make([]int, 0, len(m))
2801 for k := range m {
2802 keys = append(keys, int(k))
2803 }
2804 sort.Ints(keys)
2805
2806 for _, id := range keys {
2807 e := m[int32(id)]
2808 b = append(b, 1<<3|WireStartGroup)
2809 b = append(b, 2<<3|WireVarint)
2810 b = appendVarint(b, uint64(id))
2811
2812 if e.value == nil || e.desc == nil {
2813 // Extension is only in its encoded form.
2814 msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint
2815 b = append(b, 3<<3|WireBytes)
2816 b = append(b, msgWithLen...)
2817 b = append(b, 1<<3|WireEndGroup)
2818 continue
2819 }
2820
2821 // We don't skip extensions that have an encoded form set,
2822 // because the extension value may have been mutated after
2823 // the last time this function was called.
2824
2825 ei := u.getExtElemInfo(e.desc)
2826 v := e.value
2827 p := toAddrPointer(&v, ei.isptr)
2828 b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
2829 b = append(b, 1<<3|WireEndGroup)
2830 if !nerr.Merge(err) {
2831 return b, err
2832 }
2833 }
2834 return b, nerr.E
2835}
2836
2837// sizeV1Extensions computes the size of encoded data for a V1-API extension field.
2838func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int {
2839 if m == nil {
2840 return 0
2841 }
2842
2843 n := 0
2844 for _, e := range m {
2845 if e.value == nil || e.desc == nil {
2846 // Extension is only in its encoded form.
2847 n += len(e.enc)
2848 continue
2849 }
2850
2851 // We don't skip extensions that have an encoded form set,
2852 // because the extension value may have been mutated after
2853 // the last time this function was called.
2854
2855 ei := u.getExtElemInfo(e.desc)
2856 v := e.value
2857 p := toAddrPointer(&v, ei.isptr)
2858 n += ei.sizer(p, ei.tagsize)
2859 }
2860 return n
2861}
2862
2863// appendV1Extensions marshals a V1-API extension field to the end of byte slice b.
2864func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) {
2865 if m == nil {
2866 return b, nil
2867 }
2868
2869 // Sort the keys to provide a deterministic encoding.
2870 keys := make([]int, 0, len(m))
2871 for k := range m {
2872 keys = append(keys, int(k))
2873 }
2874 sort.Ints(keys)
2875
2876 var err error
2877 var nerr nonFatal
2878 for _, k := range keys {
2879 e := m[int32(k)]
2880 if e.value == nil || e.desc == nil {
2881 // Extension is only in its encoded form.
2882 b = append(b, e.enc...)
2883 continue
2884 }
2885
2886 // We don't skip extensions that have an encoded form set,
2887 // because the extension value may have been mutated after
2888 // the last time this function was called.
2889
2890 ei := u.getExtElemInfo(e.desc)
2891 v := e.value
2892 p := toAddrPointer(&v, ei.isptr)
2893 b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
2894 if !nerr.Merge(err) {
2895 return b, err
2896 }
2897 }
2898 return b, nerr.E
2899}
2900
2901// newMarshaler is the interface representing objects that can marshal themselves.
2902//
2903// This exists to support protoc-gen-go generated messages.
2904// The proto package will stop type-asserting to this interface in the future.
2905//
2906// DO NOT DEPEND ON THIS.
2907type newMarshaler interface {
2908 XXX_Size() int
2909 XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
2910}
2911
2912// Size returns the encoded size of a protocol buffer message.
2913// This is the main entry point.
2914func Size(pb Message) int {
2915 if m, ok := pb.(newMarshaler); ok {
2916 return m.XXX_Size()
2917 }
2918 if m, ok := pb.(Marshaler); ok {
2919 // If the message can marshal itself, let it do it, for compatibility.
2920 // NOTE: This is not efficient.
2921 b, _ := m.Marshal()
2922 return len(b)
2923 }
2924 // in case somehow we didn't generate the wrapper
2925 if pb == nil {
2926 return 0
2927 }
2928 var info InternalMessageInfo
2929 return info.Size(pb)
2930}
2931
2932// Marshal takes a protocol buffer message
2933// and encodes it into the wire format, returning the data.
2934// This is the main entry point.
2935func Marshal(pb Message) ([]byte, error) {
2936 if m, ok := pb.(newMarshaler); ok {
2937 siz := m.XXX_Size()
2938 b := make([]byte, 0, siz)
2939 return m.XXX_Marshal(b, false)
2940 }
2941 if m, ok := pb.(Marshaler); ok {
2942 // If the message can marshal itself, let it do it, for compatibility.
2943 // NOTE: This is not efficient.
2944 return m.Marshal()
2945 }
2946 // in case somehow we didn't generate the wrapper
2947 if pb == nil {
2948 return nil, ErrNil
2949 }
2950 var info InternalMessageInfo
2951 siz := info.Size(pb)
2952 b := make([]byte, 0, siz)
2953 return info.Marshal(b, pb, false)
2954}
2955
2956// Marshal takes a protocol buffer message
2957// and encodes it into the wire format, writing the result to the
2958// Buffer.
2959// This is an alternative entry point. It is not necessary to use
2960// a Buffer for most applications.
2961func (p *Buffer) Marshal(pb Message) error {
2962 var err error
2963 if p.deterministic {
2964 if _, ok := pb.(Marshaler); ok {
2965 return fmt.Errorf("proto: deterministic not supported by the Marshal method of %T", pb)
2966 }
2967 }
2968 if m, ok := pb.(newMarshaler); ok {
2969 siz := m.XXX_Size()
2970 p.grow(siz) // make sure buf has enough capacity
2971 p.buf, err = m.XXX_Marshal(p.buf, p.deterministic)
2972 return err
2973 }
2974 if m, ok := pb.(Marshaler); ok {
2975 // If the message can marshal itself, let it do it, for compatibility.
2976 // NOTE: This is not efficient.
2977 var b []byte
2978 b, err = m.Marshal()
2979 p.buf = append(p.buf, b...)
2980 return err
2981 }
2982 // in case somehow we didn't generate the wrapper
2983 if pb == nil {
2984 return ErrNil
2985 }
2986 var info InternalMessageInfo
2987 siz := info.Size(pb)
2988 p.grow(siz) // make sure buf has enough capacity
2989 p.buf, err = info.Marshal(p.buf, pb, p.deterministic)
2990 return err
2991}
2992
2993// grow grows the buffer's capacity, if necessary, to guarantee space for
2994// another n bytes. After grow(n), at least n bytes can be written to the
2995// buffer without another allocation.
2996func (p *Buffer) grow(n int) {
2997 need := len(p.buf) + n
2998 if need <= cap(p.buf) {
2999 return
3000 }
3001 newCap := len(p.buf) * 2
3002 if newCap < need {
3003 newCap = need
3004 }
3005 p.buf = append(make([]byte, 0, newCap), p.buf...)
3006}