Home | History | Annotate | Download | only in proto
      1 // Go support for Protocol Buffers - Google's data interchange format
      2 //
      3 // Copyright 2010 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 
     32 package proto
     33 
     34 /*
     35  * Routines for encoding data into the wire format for protocol buffers.
     36  */
     37 
     38 import (
     39 	"errors"
     40 	"fmt"
     41 	"reflect"
     42 	"sort"
     43 )
     44 
     45 // RequiredNotSetError is the error returned if Marshal is called with
     46 // a protocol buffer struct whose required fields have not
     47 // all been initialized. It is also the error returned if Unmarshal is
     48 // called with an encoded protocol buffer that does not include all the
     49 // required fields.
     50 //
     51 // When printed, RequiredNotSetError reports the first unset required field in a
     52 // message. If the field cannot be precisely determined, it is reported as
     53 // "{Unknown}".
     54 type RequiredNotSetError struct {
     55 	field string
     56 }
     57 
     58 func (e *RequiredNotSetError) Error() string {
     59 	return fmt.Sprintf("proto: required field %q not set", e.field)
     60 }
     61 
     62 var (
     63 	// errRepeatedHasNil is the error returned if Marshal is called with
     64 	// a struct with a repeated field containing a nil element.
     65 	errRepeatedHasNil = errors.New("proto: repeated field has nil element")
     66 
     67 	// errOneofHasNil is the error returned if Marshal is called with
     68 	// a struct with a oneof field containing a nil element.
     69 	errOneofHasNil = errors.New("proto: oneof field has nil value")
     70 
     71 	// ErrNil is the error returned if Marshal is called with nil.
     72 	ErrNil = errors.New("proto: Marshal called with nil")
     73 
     74 	// ErrTooLarge is the error returned if Marshal is called with a
     75 	// message that encodes to >2GB.
     76 	ErrTooLarge = errors.New("proto: message encodes to over 2 GB")
     77 )
     78 
     79 // The fundamental encoders that put bytes on the wire.
     80 // Those that take integer types all accept uint64 and are
     81 // therefore of type valueEncoder.
     82 
     83 const maxVarintBytes = 10 // maximum length of a varint
     84 
     85 // maxMarshalSize is the largest allowed size of an encoded protobuf,
     86 // since C++ and Java use signed int32s for the size.
     87 const maxMarshalSize = 1<<31 - 1
     88 
     89 // EncodeVarint returns the varint encoding of x.
     90 // This is the format for the
     91 // int32, int64, uint32, uint64, bool, and enum
     92 // protocol buffer types.
     93 // Not used by the package itself, but helpful to clients
     94 // wishing to use the same encoding.
     95 func EncodeVarint(x uint64) []byte {
     96 	var buf [maxVarintBytes]byte
     97 	var n int
     98 	for n = 0; x > 127; n++ {
     99 		buf[n] = 0x80 | uint8(x&0x7F)
    100 		x >>= 7
    101 	}
    102 	buf[n] = uint8(x)
    103 	n++
    104 	return buf[0:n]
    105 }
    106 
    107 // EncodeVarint writes a varint-encoded integer to the Buffer.
    108 // This is the format for the
    109 // int32, int64, uint32, uint64, bool, and enum
    110 // protocol buffer types.
    111 func (p *Buffer) EncodeVarint(x uint64) error {
    112 	for x >= 1<<7 {
    113 		p.buf = append(p.buf, uint8(x&0x7f|0x80))
    114 		x >>= 7
    115 	}
    116 	p.buf = append(p.buf, uint8(x))
    117 	return nil
    118 }
    119 
    120 // SizeVarint returns the varint encoding size of an integer.
    121 func SizeVarint(x uint64) int {
    122 	return sizeVarint(x)
    123 }
    124 
    125 func sizeVarint(x uint64) (n int) {
    126 	for {
    127 		n++
    128 		x >>= 7
    129 		if x == 0 {
    130 			break
    131 		}
    132 	}
    133 	return n
    134 }
    135 
    136 // EncodeFixed64 writes a 64-bit integer to the Buffer.
    137 // This is the format for the
    138 // fixed64, sfixed64, and double protocol buffer types.
    139 func (p *Buffer) EncodeFixed64(x uint64) error {
    140 	p.buf = append(p.buf,
    141 		uint8(x),
    142 		uint8(x>>8),
    143 		uint8(x>>16),
    144 		uint8(x>>24),
    145 		uint8(x>>32),
    146 		uint8(x>>40),
    147 		uint8(x>>48),
    148 		uint8(x>>56))
    149 	return nil
    150 }
    151 
    152 func sizeFixed64(x uint64) int {
    153 	return 8
    154 }
    155 
    156 // EncodeFixed32 writes a 32-bit integer to the Buffer.
    157 // This is the format for the
    158 // fixed32, sfixed32, and float protocol buffer types.
    159 func (p *Buffer) EncodeFixed32(x uint64) error {
    160 	p.buf = append(p.buf,
    161 		uint8(x),
    162 		uint8(x>>8),
    163 		uint8(x>>16),
    164 		uint8(x>>24))
    165 	return nil
    166 }
    167 
    168 func sizeFixed32(x uint64) int {
    169 	return 4
    170 }
    171 
    172 // EncodeZigzag64 writes a zigzag-encoded 64-bit integer
    173 // to the Buffer.
    174 // This is the format used for the sint64 protocol buffer type.
    175 func (p *Buffer) EncodeZigzag64(x uint64) error {
    176 	// use signed number to get arithmetic right shift.
    177 	return p.EncodeVarint((x << 1) ^ uint64((int64(x) >> 63)))
    178 }
    179 
    180 func sizeZigzag64(x uint64) int {
    181 	return sizeVarint((x << 1) ^ uint64((int64(x) >> 63)))
    182 }
    183 
    184 // EncodeZigzag32 writes a zigzag-encoded 32-bit integer
    185 // to the Buffer.
    186 // This is the format used for the sint32 protocol buffer type.
    187 func (p *Buffer) EncodeZigzag32(x uint64) error {
    188 	// use signed number to get arithmetic right shift.
    189 	return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31))))
    190 }
    191 
    192 func sizeZigzag32(x uint64) int {
    193 	return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31))))
    194 }
    195 
    196 // EncodeRawBytes writes a count-delimited byte buffer to the Buffer.
    197 // This is the format used for the bytes protocol buffer
    198 // type and for embedded messages.
    199 func (p *Buffer) EncodeRawBytes(b []byte) error {
    200 	p.EncodeVarint(uint64(len(b)))
    201 	p.buf = append(p.buf, b...)
    202 	return nil
    203 }
    204 
    205 func sizeRawBytes(b []byte) int {
    206 	return sizeVarint(uint64(len(b))) +
    207 		len(b)
    208 }
    209 
    210 // EncodeStringBytes writes an encoded string to the Buffer.
    211 // This is the format used for the proto2 string type.
    212 func (p *Buffer) EncodeStringBytes(s string) error {
    213 	p.EncodeVarint(uint64(len(s)))
    214 	p.buf = append(p.buf, s...)
    215 	return nil
    216 }
    217 
    218 func sizeStringBytes(s string) int {
    219 	return sizeVarint(uint64(len(s))) +
    220 		len(s)
    221 }
    222 
    223 // Marshaler is the interface representing objects that can marshal themselves.
    224 type Marshaler interface {
    225 	Marshal() ([]byte, error)
    226 }
    227 
    228 // Marshal takes the protocol buffer
    229 // and encodes it into the wire format, returning the data.
    230 func Marshal(pb Message) ([]byte, error) {
    231 	// Can the object marshal itself?
    232 	if m, ok := pb.(Marshaler); ok {
    233 		return m.Marshal()
    234 	}
    235 	p := NewBuffer(nil)
    236 	err := p.Marshal(pb)
    237 	if p.buf == nil && err == nil {
    238 		// Return a non-nil slice on success.
    239 		return []byte{}, nil
    240 	}
    241 	return p.buf, err
    242 }
    243 
    244 // EncodeMessage writes the protocol buffer to the Buffer,
    245 // prefixed by a varint-encoded length.
    246 func (p *Buffer) EncodeMessage(pb Message) error {
    247 	t, base, err := getbase(pb)
    248 	if structPointer_IsNil(base) {
    249 		return ErrNil
    250 	}
    251 	if err == nil {
    252 		var state errorState
    253 		err = p.enc_len_struct(GetProperties(t.Elem()), base, &state)
    254 	}
    255 	return err
    256 }
    257 
    258 // Marshal takes the protocol buffer
    259 // and encodes it into the wire format, writing the result to the
    260 // Buffer.
    261 func (p *Buffer) Marshal(pb Message) error {
    262 	// Can the object marshal itself?
    263 	if m, ok := pb.(Marshaler); ok {
    264 		data, err := m.Marshal()
    265 		p.buf = append(p.buf, data...)
    266 		return err
    267 	}
    268 
    269 	t, base, err := getbase(pb)
    270 	if structPointer_IsNil(base) {
    271 		return ErrNil
    272 	}
    273 	if err == nil {
    274 		err = p.enc_struct(GetProperties(t.Elem()), base)
    275 	}
    276 
    277 	if collectStats {
    278 		(stats).Encode++ // Parens are to work around a goimports bug.
    279 	}
    280 
    281 	if len(p.buf) > maxMarshalSize {
    282 		return ErrTooLarge
    283 	}
    284 	return err
    285 }
    286 
    287 // Size returns the encoded size of a protocol buffer.
    288 func Size(pb Message) (n int) {
    289 	// Can the object marshal itself?  If so, Size is slow.
    290 	// TODO: add Size to Marshaler, or add a Sizer interface.
    291 	if m, ok := pb.(Marshaler); ok {
    292 		b, _ := m.Marshal()
    293 		return len(b)
    294 	}
    295 
    296 	t, base, err := getbase(pb)
    297 	if structPointer_IsNil(base) {
    298 		return 0
    299 	}
    300 	if err == nil {
    301 		n = size_struct(GetProperties(t.Elem()), base)
    302 	}
    303 
    304 	if collectStats {
    305 		(stats).Size++ // Parens are to work around a goimports bug.
    306 	}
    307 
    308 	return
    309 }
    310 
    311 // Individual type encoders.
    312 
    313 // Encode a bool.
    314 func (o *Buffer) enc_bool(p *Properties, base structPointer) error {
    315 	v := *structPointer_Bool(base, p.field)
    316 	if v == nil {
    317 		return ErrNil
    318 	}
    319 	x := 0
    320 	if *v {
    321 		x = 1
    322 	}
    323 	o.buf = append(o.buf, p.tagcode...)
    324 	p.valEnc(o, uint64(x))
    325 	return nil
    326 }
    327 
    328 func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error {
    329 	v := *structPointer_BoolVal(base, p.field)
    330 	if !v {
    331 		return ErrNil
    332 	}
    333 	o.buf = append(o.buf, p.tagcode...)
    334 	p.valEnc(o, 1)
    335 	return nil
    336 }
    337 
    338 func size_bool(p *Properties, base structPointer) int {
    339 	v := *structPointer_Bool(base, p.field)
    340 	if v == nil {
    341 		return 0
    342 	}
    343 	return len(p.tagcode) + 1 // each bool takes exactly one byte
    344 }
    345 
    346 func size_proto3_bool(p *Properties, base structPointer) int {
    347 	v := *structPointer_BoolVal(base, p.field)
    348 	if !v && !p.oneof {
    349 		return 0
    350 	}
    351 	return len(p.tagcode) + 1 // each bool takes exactly one byte
    352 }
    353 
    354 // Encode an int32.
    355 func (o *Buffer) enc_int32(p *Properties, base structPointer) error {
    356 	v := structPointer_Word32(base, p.field)
    357 	if word32_IsNil(v) {
    358 		return ErrNil
    359 	}
    360 	x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range
    361 	o.buf = append(o.buf, p.tagcode...)
    362 	p.valEnc(o, uint64(x))
    363 	return nil
    364 }
    365 
    366 func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error {
    367 	v := structPointer_Word32Val(base, p.field)
    368 	x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range
    369 	if x == 0 {
    370 		return ErrNil
    371 	}
    372 	o.buf = append(o.buf, p.tagcode...)
    373 	p.valEnc(o, uint64(x))
    374 	return nil
    375 }
    376 
    377 func size_int32(p *Properties, base structPointer) (n int) {
    378 	v := structPointer_Word32(base, p.field)
    379 	if word32_IsNil(v) {
    380 		return 0
    381 	}
    382 	x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range
    383 	n += len(p.tagcode)
    384 	n += p.valSize(uint64(x))
    385 	return
    386 }
    387 
    388 func size_proto3_int32(p *Properties, base structPointer) (n int) {
    389 	v := structPointer_Word32Val(base, p.field)
    390 	x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range
    391 	if x == 0 && !p.oneof {
    392 		return 0
    393 	}
    394 	n += len(p.tagcode)
    395 	n += p.valSize(uint64(x))
    396 	return
    397 }
    398 
    399 // Encode a uint32.
    400 // Exactly the same as int32, except for no sign extension.
    401 func (o *Buffer) enc_uint32(p *Properties, base structPointer) error {
    402 	v := structPointer_Word32(base, p.field)
    403 	if word32_IsNil(v) {
    404 		return ErrNil
    405 	}
    406 	x := word32_Get(v)
    407 	o.buf = append(o.buf, p.tagcode...)
    408 	p.valEnc(o, uint64(x))
    409 	return nil
    410 }
    411 
    412 func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error {
    413 	v := structPointer_Word32Val(base, p.field)
    414 	x := word32Val_Get(v)
    415 	if x == 0 {
    416 		return ErrNil
    417 	}
    418 	o.buf = append(o.buf, p.tagcode...)
    419 	p.valEnc(o, uint64(x))
    420 	return nil
    421 }
    422 
    423 func size_uint32(p *Properties, base structPointer) (n int) {
    424 	v := structPointer_Word32(base, p.field)
    425 	if word32_IsNil(v) {
    426 		return 0
    427 	}
    428 	x := word32_Get(v)
    429 	n += len(p.tagcode)
    430 	n += p.valSize(uint64(x))
    431 	return
    432 }
    433 
    434 func size_proto3_uint32(p *Properties, base structPointer) (n int) {
    435 	v := structPointer_Word32Val(base, p.field)
    436 	x := word32Val_Get(v)
    437 	if x == 0 && !p.oneof {
    438 		return 0
    439 	}
    440 	n += len(p.tagcode)
    441 	n += p.valSize(uint64(x))
    442 	return
    443 }
    444 
    445 // Encode an int64.
    446 func (o *Buffer) enc_int64(p *Properties, base structPointer) error {
    447 	v := structPointer_Word64(base, p.field)
    448 	if word64_IsNil(v) {
    449 		return ErrNil
    450 	}
    451 	x := word64_Get(v)
    452 	o.buf = append(o.buf, p.tagcode...)
    453 	p.valEnc(o, x)
    454 	return nil
    455 }
    456 
    457 func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error {
    458 	v := structPointer_Word64Val(base, p.field)
    459 	x := word64Val_Get(v)
    460 	if x == 0 {
    461 		return ErrNil
    462 	}
    463 	o.buf = append(o.buf, p.tagcode...)
    464 	p.valEnc(o, x)
    465 	return nil
    466 }
    467 
    468 func size_int64(p *Properties, base structPointer) (n int) {
    469 	v := structPointer_Word64(base, p.field)
    470 	if word64_IsNil(v) {
    471 		return 0
    472 	}
    473 	x := word64_Get(v)
    474 	n += len(p.tagcode)
    475 	n += p.valSize(x)
    476 	return
    477 }
    478 
    479 func size_proto3_int64(p *Properties, base structPointer) (n int) {
    480 	v := structPointer_Word64Val(base, p.field)
    481 	x := word64Val_Get(v)
    482 	if x == 0 && !p.oneof {
    483 		return 0
    484 	}
    485 	n += len(p.tagcode)
    486 	n += p.valSize(x)
    487 	return
    488 }
    489 
    490 // Encode a string.
    491 func (o *Buffer) enc_string(p *Properties, base structPointer) error {
    492 	v := *structPointer_String(base, p.field)
    493 	if v == nil {
    494 		return ErrNil
    495 	}
    496 	x := *v
    497 	o.buf = append(o.buf, p.tagcode...)
    498 	o.EncodeStringBytes(x)
    499 	return nil
    500 }
    501 
    502 func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error {
    503 	v := *structPointer_StringVal(base, p.field)
    504 	if v == "" {
    505 		return ErrNil
    506 	}
    507 	o.buf = append(o.buf, p.tagcode...)
    508 	o.EncodeStringBytes(v)
    509 	return nil
    510 }
    511 
    512 func size_string(p *Properties, base structPointer) (n int) {
    513 	v := *structPointer_String(base, p.field)
    514 	if v == nil {
    515 		return 0
    516 	}
    517 	x := *v
    518 	n += len(p.tagcode)
    519 	n += sizeStringBytes(x)
    520 	return
    521 }
    522 
    523 func size_proto3_string(p *Properties, base structPointer) (n int) {
    524 	v := *structPointer_StringVal(base, p.field)
    525 	if v == "" && !p.oneof {
    526 		return 0
    527 	}
    528 	n += len(p.tagcode)
    529 	n += sizeStringBytes(v)
    530 	return
    531 }
    532 
    533 // All protocol buffer fields are nillable, but be careful.
    534 func isNil(v reflect.Value) bool {
    535 	switch v.Kind() {
    536 	case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
    537 		return v.IsNil()
    538 	}
    539 	return false
    540 }
    541 
    542 // Encode a message struct.
    543 func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error {
    544 	var state errorState
    545 	structp := structPointer_GetStructPointer(base, p.field)
    546 	if structPointer_IsNil(structp) {
    547 		return ErrNil
    548 	}
    549 
    550 	// Can the object marshal itself?
    551 	if p.isMarshaler {
    552 		m := structPointer_Interface(structp, p.stype).(Marshaler)
    553 		data, err := m.Marshal()
    554 		if err != nil && !state.shouldContinue(err, nil) {
    555 			return err
    556 		}
    557 		o.buf = append(o.buf, p.tagcode...)
    558 		o.EncodeRawBytes(data)
    559 		return state.err
    560 	}
    561 
    562 	o.buf = append(o.buf, p.tagcode...)
    563 	return o.enc_len_struct(p.sprop, structp, &state)
    564 }
    565 
    566 func size_struct_message(p *Properties, base structPointer) int {
    567 	structp := structPointer_GetStructPointer(base, p.field)
    568 	if structPointer_IsNil(structp) {
    569 		return 0
    570 	}
    571 
    572 	// Can the object marshal itself?
    573 	if p.isMarshaler {
    574 		m := structPointer_Interface(structp, p.stype).(Marshaler)
    575 		data, _ := m.Marshal()
    576 		n0 := len(p.tagcode)
    577 		n1 := sizeRawBytes(data)
    578 		return n0 + n1
    579 	}
    580 
    581 	n0 := len(p.tagcode)
    582 	n1 := size_struct(p.sprop, structp)
    583 	n2 := sizeVarint(uint64(n1)) // size of encoded length
    584 	return n0 + n1 + n2
    585 }
    586 
    587 // Encode a group struct.
    588 func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error {
    589 	var state errorState
    590 	b := structPointer_GetStructPointer(base, p.field)
    591 	if structPointer_IsNil(b) {
    592 		return ErrNil
    593 	}
    594 
    595 	o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup))
    596 	err := o.enc_struct(p.sprop, b)
    597 	if err != nil && !state.shouldContinue(err, nil) {
    598 		return err
    599 	}
    600 	o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup))
    601 	return state.err
    602 }
    603 
    604 func size_struct_group(p *Properties, base structPointer) (n int) {
    605 	b := structPointer_GetStructPointer(base, p.field)
    606 	if structPointer_IsNil(b) {
    607 		return 0
    608 	}
    609 
    610 	n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup))
    611 	n += size_struct(p.sprop, b)
    612 	n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup))
    613 	return
    614 }
    615 
    616 // Encode a slice of bools ([]bool).
    617 func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error {
    618 	s := *structPointer_BoolSlice(base, p.field)
    619 	l := len(s)
    620 	if l == 0 {
    621 		return ErrNil
    622 	}
    623 	for _, x := range s {
    624 		o.buf = append(o.buf, p.tagcode...)
    625 		v := uint64(0)
    626 		if x {
    627 			v = 1
    628 		}
    629 		p.valEnc(o, v)
    630 	}
    631 	return nil
    632 }
    633 
    634 func size_slice_bool(p *Properties, base structPointer) int {
    635 	s := *structPointer_BoolSlice(base, p.field)
    636 	l := len(s)
    637 	if l == 0 {
    638 		return 0
    639 	}
    640 	return l * (len(p.tagcode) + 1) // each bool takes exactly one byte
    641 }
    642 
    643 // Encode a slice of bools ([]bool) in packed format.
    644 func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error {
    645 	s := *structPointer_BoolSlice(base, p.field)
    646 	l := len(s)
    647 	if l == 0 {
    648 		return ErrNil
    649 	}
    650 	o.buf = append(o.buf, p.tagcode...)
    651 	o.EncodeVarint(uint64(l)) // each bool takes exactly one byte
    652 	for _, x := range s {
    653 		v := uint64(0)
    654 		if x {
    655 			v = 1
    656 		}
    657 		p.valEnc(o, v)
    658 	}
    659 	return nil
    660 }
    661 
    662 func size_slice_packed_bool(p *Properties, base structPointer) (n int) {
    663 	s := *structPointer_BoolSlice(base, p.field)
    664 	l := len(s)
    665 	if l == 0 {
    666 		return 0
    667 	}
    668 	n += len(p.tagcode)
    669 	n += sizeVarint(uint64(l))
    670 	n += l // each bool takes exactly one byte
    671 	return
    672 }
    673 
    674 // Encode a slice of bytes ([]byte).
    675 func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error {
    676 	s := *structPointer_Bytes(base, p.field)
    677 	if s == nil {
    678 		return ErrNil
    679 	}
    680 	o.buf = append(o.buf, p.tagcode...)
    681 	o.EncodeRawBytes(s)
    682 	return nil
    683 }
    684 
    685 func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error {
    686 	s := *structPointer_Bytes(base, p.field)
    687 	if len(s) == 0 {
    688 		return ErrNil
    689 	}
    690 	o.buf = append(o.buf, p.tagcode...)
    691 	o.EncodeRawBytes(s)
    692 	return nil
    693 }
    694 
    695 func size_slice_byte(p *Properties, base structPointer) (n int) {
    696 	s := *structPointer_Bytes(base, p.field)
    697 	if s == nil && !p.oneof {
    698 		return 0
    699 	}
    700 	n += len(p.tagcode)
    701 	n += sizeRawBytes(s)
    702 	return
    703 }
    704 
    705 func size_proto3_slice_byte(p *Properties, base structPointer) (n int) {
    706 	s := *structPointer_Bytes(base, p.field)
    707 	if len(s) == 0 && !p.oneof {
    708 		return 0
    709 	}
    710 	n += len(p.tagcode)
    711 	n += sizeRawBytes(s)
    712 	return
    713 }
    714 
    715 // Encode a slice of int32s ([]int32).
    716 func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error {
    717 	s := structPointer_Word32Slice(base, p.field)
    718 	l := s.Len()
    719 	if l == 0 {
    720 		return ErrNil
    721 	}
    722 	for i := 0; i < l; i++ {
    723 		o.buf = append(o.buf, p.tagcode...)
    724 		x := int32(s.Index(i)) // permit sign extension to use full 64-bit range
    725 		p.valEnc(o, uint64(x))
    726 	}
    727 	return nil
    728 }
    729 
    730 func size_slice_int32(p *Properties, base structPointer) (n int) {
    731 	s := structPointer_Word32Slice(base, p.field)
    732 	l := s.Len()
    733 	if l == 0 {
    734 		return 0
    735 	}
    736 	for i := 0; i < l; i++ {
    737 		n += len(p.tagcode)
    738 		x := int32(s.Index(i)) // permit sign extension to use full 64-bit range
    739 		n += p.valSize(uint64(x))
    740 	}
    741 	return
    742 }
    743 
    744 // Encode a slice of int32s ([]int32) in packed format.
    745 func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error {
    746 	s := structPointer_Word32Slice(base, p.field)
    747 	l := s.Len()
    748 	if l == 0 {
    749 		return ErrNil
    750 	}
    751 	// TODO: Reuse a Buffer.
    752 	buf := NewBuffer(nil)
    753 	for i := 0; i < l; i++ {
    754 		x := int32(s.Index(i)) // permit sign extension to use full 64-bit range
    755 		p.valEnc(buf, uint64(x))
    756 	}
    757 
    758 	o.buf = append(o.buf, p.tagcode...)
    759 	o.EncodeVarint(uint64(len(buf.buf)))
    760 	o.buf = append(o.buf, buf.buf...)
    761 	return nil
    762 }
    763 
    764 func size_slice_packed_int32(p *Properties, base structPointer) (n int) {
    765 	s := structPointer_Word32Slice(base, p.field)
    766 	l := s.Len()
    767 	if l == 0 {
    768 		return 0
    769 	}
    770 	var bufSize int
    771 	for i := 0; i < l; i++ {
    772 		x := int32(s.Index(i)) // permit sign extension to use full 64-bit range
    773 		bufSize += p.valSize(uint64(x))
    774 	}
    775 
    776 	n += len(p.tagcode)
    777 	n += sizeVarint(uint64(bufSize))
    778 	n += bufSize
    779 	return
    780 }
    781 
    782 // Encode a slice of uint32s ([]uint32).
    783 // Exactly the same as int32, except for no sign extension.
    784 func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error {
    785 	s := structPointer_Word32Slice(base, p.field)
    786 	l := s.Len()
    787 	if l == 0 {
    788 		return ErrNil
    789 	}
    790 	for i := 0; i < l; i++ {
    791 		o.buf = append(o.buf, p.tagcode...)
    792 		x := s.Index(i)
    793 		p.valEnc(o, uint64(x))
    794 	}
    795 	return nil
    796 }
    797 
    798 func size_slice_uint32(p *Properties, base structPointer) (n int) {
    799 	s := structPointer_Word32Slice(base, p.field)
    800 	l := s.Len()
    801 	if l == 0 {
    802 		return 0
    803 	}
    804 	for i := 0; i < l; i++ {
    805 		n += len(p.tagcode)
    806 		x := s.Index(i)
    807 		n += p.valSize(uint64(x))
    808 	}
    809 	return
    810 }
    811 
    812 // Encode a slice of uint32s ([]uint32) in packed format.
    813 // Exactly the same as int32, except for no sign extension.
    814 func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error {
    815 	s := structPointer_Word32Slice(base, p.field)
    816 	l := s.Len()
    817 	if l == 0 {
    818 		return ErrNil
    819 	}
    820 	// TODO: Reuse a Buffer.
    821 	buf := NewBuffer(nil)
    822 	for i := 0; i < l; i++ {
    823 		p.valEnc(buf, uint64(s.Index(i)))
    824 	}
    825 
    826 	o.buf = append(o.buf, p.tagcode...)
    827 	o.EncodeVarint(uint64(len(buf.buf)))
    828 	o.buf = append(o.buf, buf.buf...)
    829 	return nil
    830 }
    831 
    832 func size_slice_packed_uint32(p *Properties, base structPointer) (n int) {
    833 	s := structPointer_Word32Slice(base, p.field)
    834 	l := s.Len()
    835 	if l == 0 {
    836 		return 0
    837 	}
    838 	var bufSize int
    839 	for i := 0; i < l; i++ {
    840 		bufSize += p.valSize(uint64(s.Index(i)))
    841 	}
    842 
    843 	n += len(p.tagcode)
    844 	n += sizeVarint(uint64(bufSize))
    845 	n += bufSize
    846 	return
    847 }
    848 
    849 // Encode a slice of int64s ([]int64).
    850 func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error {
    851 	s := structPointer_Word64Slice(base, p.field)
    852 	l := s.Len()
    853 	if l == 0 {
    854 		return ErrNil
    855 	}
    856 	for i := 0; i < l; i++ {
    857 		o.buf = append(o.buf, p.tagcode...)
    858 		p.valEnc(o, s.Index(i))
    859 	}
    860 	return nil
    861 }
    862 
    863 func size_slice_int64(p *Properties, base structPointer) (n int) {
    864 	s := structPointer_Word64Slice(base, p.field)
    865 	l := s.Len()
    866 	if l == 0 {
    867 		return 0
    868 	}
    869 	for i := 0; i < l; i++ {
    870 		n += len(p.tagcode)
    871 		n += p.valSize(s.Index(i))
    872 	}
    873 	return
    874 }
    875 
    876 // Encode a slice of int64s ([]int64) in packed format.
    877 func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error {
    878 	s := structPointer_Word64Slice(base, p.field)
    879 	l := s.Len()
    880 	if l == 0 {
    881 		return ErrNil
    882 	}
    883 	// TODO: Reuse a Buffer.
    884 	buf := NewBuffer(nil)
    885 	for i := 0; i < l; i++ {
    886 		p.valEnc(buf, s.Index(i))
    887 	}
    888 
    889 	o.buf = append(o.buf, p.tagcode...)
    890 	o.EncodeVarint(uint64(len(buf.buf)))
    891 	o.buf = append(o.buf, buf.buf...)
    892 	return nil
    893 }
    894 
    895 func size_slice_packed_int64(p *Properties, base structPointer) (n int) {
    896 	s := structPointer_Word64Slice(base, p.field)
    897 	l := s.Len()
    898 	if l == 0 {
    899 		return 0
    900 	}
    901 	var bufSize int
    902 	for i := 0; i < l; i++ {
    903 		bufSize += p.valSize(s.Index(i))
    904 	}
    905 
    906 	n += len(p.tagcode)
    907 	n += sizeVarint(uint64(bufSize))
    908 	n += bufSize
    909 	return
    910 }
    911 
    912 // Encode a slice of slice of bytes ([][]byte).
    913 func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error {
    914 	ss := *structPointer_BytesSlice(base, p.field)
    915 	l := len(ss)
    916 	if l == 0 {
    917 		return ErrNil
    918 	}
    919 	for i := 0; i < l; i++ {
    920 		o.buf = append(o.buf, p.tagcode...)
    921 		o.EncodeRawBytes(ss[i])
    922 	}
    923 	return nil
    924 }
    925 
    926 func size_slice_slice_byte(p *Properties, base structPointer) (n int) {
    927 	ss := *structPointer_BytesSlice(base, p.field)
    928 	l := len(ss)
    929 	if l == 0 {
    930 		return 0
    931 	}
    932 	n += l * len(p.tagcode)
    933 	for i := 0; i < l; i++ {
    934 		n += sizeRawBytes(ss[i])
    935 	}
    936 	return
    937 }
    938 
    939 // Encode a slice of strings ([]string).
    940 func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error {
    941 	ss := *structPointer_StringSlice(base, p.field)
    942 	l := len(ss)
    943 	for i := 0; i < l; i++ {
    944 		o.buf = append(o.buf, p.tagcode...)
    945 		o.EncodeStringBytes(ss[i])
    946 	}
    947 	return nil
    948 }
    949 
    950 func size_slice_string(p *Properties, base structPointer) (n int) {
    951 	ss := *structPointer_StringSlice(base, p.field)
    952 	l := len(ss)
    953 	n += l * len(p.tagcode)
    954 	for i := 0; i < l; i++ {
    955 		n += sizeStringBytes(ss[i])
    956 	}
    957 	return
    958 }
    959 
    960 // Encode a slice of message structs ([]*struct).
    961 func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error {
    962 	var state errorState
    963 	s := structPointer_StructPointerSlice(base, p.field)
    964 	l := s.Len()
    965 
    966 	for i := 0; i < l; i++ {
    967 		structp := s.Index(i)
    968 		if structPointer_IsNil(structp) {
    969 			return errRepeatedHasNil
    970 		}
    971 
    972 		// Can the object marshal itself?
    973 		if p.isMarshaler {
    974 			m := structPointer_Interface(structp, p.stype).(Marshaler)
    975 			data, err := m.Marshal()
    976 			if err != nil && !state.shouldContinue(err, nil) {
    977 				return err
    978 			}
    979 			o.buf = append(o.buf, p.tagcode...)
    980 			o.EncodeRawBytes(data)
    981 			continue
    982 		}
    983 
    984 		o.buf = append(o.buf, p.tagcode...)
    985 		err := o.enc_len_struct(p.sprop, structp, &state)
    986 		if err != nil && !state.shouldContinue(err, nil) {
    987 			if err == ErrNil {
    988 				return errRepeatedHasNil
    989 			}
    990 			return err
    991 		}
    992 	}
    993 	return state.err
    994 }
    995 
    996 func size_slice_struct_message(p *Properties, base structPointer) (n int) {
    997 	s := structPointer_StructPointerSlice(base, p.field)
    998 	l := s.Len()
    999 	n += l * len(p.tagcode)
   1000 	for i := 0; i < l; i++ {
   1001 		structp := s.Index(i)
   1002 		if structPointer_IsNil(structp) {
   1003 			return // return the size up to this point
   1004 		}
   1005 
   1006 		// Can the object marshal itself?
   1007 		if p.isMarshaler {
   1008 			m := structPointer_Interface(structp, p.stype).(Marshaler)
   1009 			data, _ := m.Marshal()
   1010 			n += sizeRawBytes(data)
   1011 			continue
   1012 		}
   1013 
   1014 		n0 := size_struct(p.sprop, structp)
   1015 		n1 := sizeVarint(uint64(n0)) // size of encoded length
   1016 		n += n0 + n1
   1017 	}
   1018 	return
   1019 }
   1020 
   1021 // Encode a slice of group structs ([]*struct).
   1022 func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error {
   1023 	var state errorState
   1024 	s := structPointer_StructPointerSlice(base, p.field)
   1025 	l := s.Len()
   1026 
   1027 	for i := 0; i < l; i++ {
   1028 		b := s.Index(i)
   1029 		if structPointer_IsNil(b) {
   1030 			return errRepeatedHasNil
   1031 		}
   1032 
   1033 		o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup))
   1034 
   1035 		err := o.enc_struct(p.sprop, b)
   1036 
   1037 		if err != nil && !state.shouldContinue(err, nil) {
   1038 			if err == ErrNil {
   1039 				return errRepeatedHasNil
   1040 			}
   1041 			return err
   1042 		}
   1043 
   1044 		o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup))
   1045 	}
   1046 	return state.err
   1047 }
   1048 
   1049 func size_slice_struct_group(p *Properties, base structPointer) (n int) {
   1050 	s := structPointer_StructPointerSlice(base, p.field)
   1051 	l := s.Len()
   1052 
   1053 	n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup))
   1054 	n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup))
   1055 	for i := 0; i < l; i++ {
   1056 		b := s.Index(i)
   1057 		if structPointer_IsNil(b) {
   1058 			return // return size up to this point
   1059 		}
   1060 
   1061 		n += size_struct(p.sprop, b)
   1062 	}
   1063 	return
   1064 }
   1065 
   1066 // Encode an extension map.
   1067 func (o *Buffer) enc_map(p *Properties, base structPointer) error {
   1068 	exts := structPointer_ExtMap(base, p.field)
   1069 	if err := encodeExtensionsMap(*exts); err != nil {
   1070 		return err
   1071 	}
   1072 
   1073 	return o.enc_map_body(*exts)
   1074 }
   1075 
   1076 func (o *Buffer) enc_exts(p *Properties, base structPointer) error {
   1077 	exts := structPointer_Extensions(base, p.field)
   1078 
   1079 	v, mu := exts.extensionsRead()
   1080 	if v == nil {
   1081 		return nil
   1082 	}
   1083 
   1084 	mu.Lock()
   1085 	defer mu.Unlock()
   1086 	if err := encodeExtensionsMap(v); err != nil {
   1087 		return err
   1088 	}
   1089 
   1090 	return o.enc_map_body(v)
   1091 }
   1092 
   1093 func (o *Buffer) enc_map_body(v map[int32]Extension) error {
   1094 	// Fast-path for common cases: zero or one extensions.
   1095 	if len(v) <= 1 {
   1096 		for _, e := range v {
   1097 			o.buf = append(o.buf, e.enc...)
   1098 		}
   1099 		return nil
   1100 	}
   1101 
   1102 	// Sort keys to provide a deterministic encoding.
   1103 	keys := make([]int, 0, len(v))
   1104 	for k := range v {
   1105 		keys = append(keys, int(k))
   1106 	}
   1107 	sort.Ints(keys)
   1108 
   1109 	for _, k := range keys {
   1110 		o.buf = append(o.buf, v[int32(k)].enc...)
   1111 	}
   1112 	return nil
   1113 }
   1114 
   1115 func size_map(p *Properties, base structPointer) int {
   1116 	v := structPointer_ExtMap(base, p.field)
   1117 	return extensionsMapSize(*v)
   1118 }
   1119 
   1120 func size_exts(p *Properties, base structPointer) int {
   1121 	v := structPointer_Extensions(base, p.field)
   1122 	return extensionsSize(v)
   1123 }
   1124 
   1125 // Encode a map field.
   1126 func (o *Buffer) enc_new_map(p *Properties, base structPointer) error {
   1127 	var state errorState // XXX: or do we need to plumb this through?
   1128 
   1129 	/*
   1130 		A map defined as
   1131 			map<key_type, value_type> map_field = N;
   1132 		is encoded in the same way as
   1133 			message MapFieldEntry {
   1134 				key_type key = 1;
   1135 				value_type value = 2;
   1136 			}
   1137 			repeated MapFieldEntry map_field = N;
   1138 	*/
   1139 
   1140 	v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V
   1141 	if v.Len() == 0 {
   1142 		return nil
   1143 	}
   1144 
   1145 	keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype)
   1146 
   1147 	enc := func() error {
   1148 		if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil {
   1149 			return err
   1150 		}
   1151 		if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil {
   1152 			return err
   1153 		}
   1154 		return nil
   1155 	}
   1156 
   1157 	// Don't sort map keys. It is not required by the spec, and C++ doesn't do it.
   1158 	for _, key := range v.MapKeys() {
   1159 		val := v.MapIndex(key)
   1160 
   1161 		keycopy.Set(key)
   1162 		valcopy.Set(val)
   1163 
   1164 		o.buf = append(o.buf, p.tagcode...)
   1165 		if err := o.enc_len_thing(enc, &state); err != nil {
   1166 			return err
   1167 		}
   1168 	}
   1169 	return nil
   1170 }
   1171 
   1172 func size_new_map(p *Properties, base structPointer) int {
   1173 	v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V
   1174 
   1175 	keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype)
   1176 
   1177 	n := 0
   1178 	for _, key := range v.MapKeys() {
   1179 		val := v.MapIndex(key)
   1180 		keycopy.Set(key)
   1181 		valcopy.Set(val)
   1182 
   1183 		// Tag codes for key and val are the responsibility of the sub-sizer.
   1184 		keysize := p.mkeyprop.size(p.mkeyprop, keybase)
   1185 		valsize := p.mvalprop.size(p.mvalprop, valbase)
   1186 		entry := keysize + valsize
   1187 		// Add on tag code and length of map entry itself.
   1188 		n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry
   1189 	}
   1190 	return n
   1191 }
   1192 
   1193 // mapEncodeScratch returns a new reflect.Value matching the map's value type,
   1194 // and a structPointer suitable for passing to an encoder or sizer.
   1195 func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) {
   1196 	// Prepare addressable doubly-indirect placeholders for the key and value types.
   1197 	// This is needed because the element-type encoders expect **T, but the map iteration produces T.
   1198 
   1199 	keycopy = reflect.New(mapType.Key()).Elem()                 // addressable K
   1200 	keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K
   1201 	keyptr.Set(keycopy.Addr())                                  //
   1202 	keybase = toStructPointer(keyptr.Addr())                    // **K
   1203 
   1204 	// Value types are more varied and require special handling.
   1205 	switch mapType.Elem().Kind() {
   1206 	case reflect.Slice:
   1207 		// []byte
   1208 		var dummy []byte
   1209 		valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte
   1210 		valbase = toStructPointer(valcopy.Addr())
   1211 	case reflect.Ptr:
   1212 		// message; the generated field type is map[K]*Msg (so V is *Msg),
   1213 		// so we only need one level of indirection.
   1214 		valcopy = reflect.New(mapType.Elem()).Elem() // addressable V
   1215 		valbase = toStructPointer(valcopy.Addr())
   1216 	default:
   1217 		// everything else
   1218 		valcopy = reflect.New(mapType.Elem()).Elem()                // addressable V
   1219 		valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V
   1220 		valptr.Set(valcopy.Addr())                                  //
   1221 		valbase = toStructPointer(valptr.Addr())                    // **V
   1222 	}
   1223 	return
   1224 }
   1225 
   1226 // Encode a struct.
   1227 func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error {
   1228 	var state errorState
   1229 	// Encode fields in tag order so that decoders may use optimizations
   1230 	// that depend on the ordering.
   1231 	// https://developers.google.com/protocol-buffers/docs/encoding#order
   1232 	for _, i := range prop.order {
   1233 		p := prop.Prop[i]
   1234 		if p.enc != nil {
   1235 			err := p.enc(o, p, base)
   1236 			if err != nil {
   1237 				if err == ErrNil {
   1238 					if p.Required && state.err == nil {
   1239 						state.err = &RequiredNotSetError{p.Name}
   1240 					}
   1241 				} else if err == errRepeatedHasNil {
   1242 					// Give more context to nil values in repeated fields.
   1243 					return errors.New("repeated field " + p.OrigName + " has nil element")
   1244 				} else if !state.shouldContinue(err, p) {
   1245 					return err
   1246 				}
   1247 			}
   1248 			if len(o.buf) > maxMarshalSize {
   1249 				return ErrTooLarge
   1250 			}
   1251 		}
   1252 	}
   1253 
   1254 	// Do oneof fields.
   1255 	if prop.oneofMarshaler != nil {
   1256 		m := structPointer_Interface(base, prop.stype).(Message)
   1257 		if err := prop.oneofMarshaler(m, o); err == ErrNil {
   1258 			return errOneofHasNil
   1259 		} else if err != nil {
   1260 			return err
   1261 		}
   1262 	}
   1263 
   1264 	// Add unrecognized fields at the end.
   1265 	if prop.unrecField.IsValid() {
   1266 		v := *structPointer_Bytes(base, prop.unrecField)
   1267 		if len(o.buf)+len(v) > maxMarshalSize {
   1268 			return ErrTooLarge
   1269 		}
   1270 		if len(v) > 0 {
   1271 			o.buf = append(o.buf, v...)
   1272 		}
   1273 	}
   1274 
   1275 	return state.err
   1276 }
   1277 
   1278 func size_struct(prop *StructProperties, base structPointer) (n int) {
   1279 	for _, i := range prop.order {
   1280 		p := prop.Prop[i]
   1281 		if p.size != nil {
   1282 			n += p.size(p, base)
   1283 		}
   1284 	}
   1285 
   1286 	// Add unrecognized fields at the end.
   1287 	if prop.unrecField.IsValid() {
   1288 		v := *structPointer_Bytes(base, prop.unrecField)
   1289 		n += len(v)
   1290 	}
   1291 
   1292 	// Factor in any oneof fields.
   1293 	if prop.oneofSizer != nil {
   1294 		m := structPointer_Interface(base, prop.stype).(Message)
   1295 		n += prop.oneofSizer(m)
   1296 	}
   1297 
   1298 	return
   1299 }
   1300 
   1301 var zeroes [20]byte // longer than any conceivable sizeVarint
   1302 
   1303 // Encode a struct, preceded by its encoded length (as a varint).
   1304 func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error {
   1305 	return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state)
   1306 }
   1307 
   1308 // Encode something, preceded by its encoded length (as a varint).
   1309 func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error {
   1310 	iLen := len(o.buf)
   1311 	o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length
   1312 	iMsg := len(o.buf)
   1313 	err := enc()
   1314 	if err != nil && !state.shouldContinue(err, nil) {
   1315 		return err
   1316 	}
   1317 	lMsg := len(o.buf) - iMsg
   1318 	lLen := sizeVarint(uint64(lMsg))
   1319 	switch x := lLen - (iMsg - iLen); {
   1320 	case x > 0: // actual length is x bytes larger than the space we reserved
   1321 		// Move msg x bytes right.
   1322 		o.buf = append(o.buf, zeroes[:x]...)
   1323 		copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg])
   1324 	case x < 0: // actual length is x bytes smaller than the space we reserved
   1325 		// Move msg x bytes left.
   1326 		copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg])
   1327 		o.buf = o.buf[:len(o.buf)+x] // x is negative
   1328 	}
   1329 	// Encode the length in the reserved space.
   1330 	o.buf = o.buf[:iLen]
   1331 	o.EncodeVarint(uint64(lMsg))
   1332 	o.buf = o.buf[:len(o.buf)+lMsg]
   1333 	return state.err
   1334 }
   1335 
   1336 // errorState maintains the first error that occurs and updates that error
   1337 // with additional context.
   1338 type errorState struct {
   1339 	err error
   1340 }
   1341 
   1342 // shouldContinue reports whether encoding should continue upon encountering the
   1343 // given error. If the error is RequiredNotSetError, shouldContinue returns true
   1344 // and, if this is the first appearance of that error, remembers it for future
   1345 // reporting.
   1346 //
   1347 // If prop is not nil, it may update any error with additional context about the
   1348 // field with the error.
   1349 func (s *errorState) shouldContinue(err error, prop *Properties) bool {
   1350 	// Ignore unset required fields.
   1351 	reqNotSet, ok := err.(*RequiredNotSetError)
   1352 	if !ok {
   1353 		return false
   1354 	}
   1355 	if s.err == nil {
   1356 		if prop != nil {
   1357 			err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field}
   1358 		}
   1359 		s.err = err
   1360 	}
   1361 	return true
   1362 }
   1363