• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
32package proto
33
34/*
35 * Routines for encoding data into the wire format for protocol buffers.
36 */
37
38import (
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}".
54type RequiredNotSetError struct {
55	field string
56}
57
58func (e *RequiredNotSetError) Error() string {
59	return fmt.Sprintf("proto: required field %q not set", e.field)
60}
61
62var (
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
83const 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.
87const 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.
95func 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.
111func (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.
121func SizeVarint(x uint64) int {
122	return sizeVarint(x)
123}
124
125func 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.
139func (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
152func 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.
159func (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
168func 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.
175func (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
180func 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.
187func (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
192func 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.
199func (p *Buffer) EncodeRawBytes(b []byte) error {
200	p.EncodeVarint(uint64(len(b)))
201	p.buf = append(p.buf, b...)
202	return nil
203}
204
205func 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.
212func (p *Buffer) EncodeStringBytes(s string) error {
213	p.EncodeVarint(uint64(len(s)))
214	p.buf = append(p.buf, s...)
215	return nil
216}
217
218func 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.
224type 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.
230func 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.
246func (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.
261func (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.
288func 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.
314func (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
328func (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
338func 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
346func 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.
355func (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
366func (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
377func 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
388func 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.
401func (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
412func (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
423func 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
434func 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.
446func (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
457func (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
468func 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
479func 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.
491func (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
502func (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
512func 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
523func 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.
534func 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.
543func (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
566func 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.
588func (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
604func 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).
617func (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
634func 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.
644func (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
662func 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).
675func (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
685func (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
695func 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
705func 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).
716func (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
730func 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.
745func (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
764func 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.
784func (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
798func 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.
814func (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
832func 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).
850func (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
863func 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.
877func (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
895func 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).
913func (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
926func 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).
940func (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
950func 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).
961func (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
996func 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).
1022func (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
1049func 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.
1067func (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
1076func (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
1093func (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
1115func size_map(p *Properties, base structPointer) int {
1116	v := structPointer_ExtMap(base, p.field)
1117	return extensionsMapSize(*v)
1118}
1119
1120func 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.
1126func (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
1172func 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.
1195func 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.
1227func (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
1278func 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
1301var zeroes [20]byte // longer than any conceivable sizeVarint
1302
1303// Encode a struct, preceded by its encoded length (as a varint).
1304func (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).
1309func (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.
1338type 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.
1349func (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