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