table_marshal.go

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