blob: 8b84d1b22d4c0933820cb4872e29c918e5429be2 [file] [log] [blame]
Matthias Andreas Benkard832a54e2019-01-29 09:27:38 +01001// 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}