blob: ebf1caa56a268dc6552a5aa4d26af5890e2d8834 [file] [log] [blame]
khenaidooac637102019-01-14 15:44:34 -05001// Go support for Protocol Buffers - Google's data interchange format
2//
3// Copyright 2016 The Go Authors. All rights reserved.
4// https://github.com/golang/protobuf
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
9//
10// * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12// * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16// * Neither the name of Google Inc. nor the names of its
17// contributors may be used to endorse or promote products derived from
18// this software without specific prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32package proto
33
34import (
35 "errors"
36 "fmt"
37 "io"
38 "math"
39 "reflect"
40 "strconv"
41 "strings"
42 "sync"
43 "sync/atomic"
44 "unicode/utf8"
45)
46
47// Unmarshal is the entry point from the generated .pb.go files.
48// This function is not intended to be used by non-generated code.
49// This function is not subject to any compatibility guarantee.
50// msg contains a pointer to a protocol buffer struct.
51// b is the data to be unmarshaled into the protocol buffer.
52// a is a pointer to a place to store cached unmarshal information.
53func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error {
54 // Load the unmarshal information for this message type.
55 // The atomic load ensures memory consistency.
56 u := atomicLoadUnmarshalInfo(&a.unmarshal)
57 if u == nil {
58 // Slow path: find unmarshal info for msg, update a with it.
59 u = getUnmarshalInfo(reflect.TypeOf(msg).Elem())
60 atomicStoreUnmarshalInfo(&a.unmarshal, u)
61 }
62 // Then do the unmarshaling.
63 err := u.unmarshal(toPointer(&msg), b)
64 return err
65}
66
67type unmarshalInfo struct {
68 typ reflect.Type // type of the protobuf struct
69
70 // 0 = only typ field is initialized
71 // 1 = completely initialized
72 initialized int32
73 lock sync.Mutex // prevents double initialization
74 dense []unmarshalFieldInfo // fields indexed by tag #
75 sparse map[uint64]unmarshalFieldInfo // fields indexed by tag #
76 reqFields []string // names of required fields
77 reqMask uint64 // 1<<len(reqFields)-1
78 unrecognized field // offset of []byte to put unrecognized data (or invalidField if we should throw it away)
79 extensions field // offset of extensions field (of type proto.XXX_InternalExtensions), or invalidField if it does not exist
80 oldExtensions field // offset of old-form extensions field (of type map[int]Extension)
81 extensionRanges []ExtensionRange // if non-nil, implies extensions field is valid
82 isMessageSet bool // if true, implies extensions field is valid
83}
84
85// An unmarshaler takes a stream of bytes and a pointer to a field of a message.
86// It decodes the field, stores it at f, and returns the unused bytes.
87// w is the wire encoding.
88// b is the data after the tag and wire encoding have been read.
89type unmarshaler func(b []byte, f pointer, w int) ([]byte, error)
90
91type unmarshalFieldInfo struct {
92 // location of the field in the proto message structure.
93 field field
94
95 // function to unmarshal the data for the field.
96 unmarshal unmarshaler
97
98 // if a required field, contains a single set bit at this field's index in the required field list.
99 reqMask uint64
100
101 name string // name of the field, for error reporting
102}
103
104var (
105 unmarshalInfoMap = map[reflect.Type]*unmarshalInfo{}
106 unmarshalInfoLock sync.Mutex
107)
108
109// getUnmarshalInfo returns the data structure which can be
110// subsequently used to unmarshal a message of the given type.
111// t is the type of the message (note: not pointer to message).
112func getUnmarshalInfo(t reflect.Type) *unmarshalInfo {
113 // It would be correct to return a new unmarshalInfo
114 // unconditionally. We would end up allocating one
115 // per occurrence of that type as a message or submessage.
116 // We use a cache here just to reduce memory usage.
117 unmarshalInfoLock.Lock()
118 defer unmarshalInfoLock.Unlock()
119 u := unmarshalInfoMap[t]
120 if u == nil {
121 u = &unmarshalInfo{typ: t}
122 // Note: we just set the type here. The rest of the fields
123 // will be initialized on first use.
124 unmarshalInfoMap[t] = u
125 }
126 return u
127}
128
129// unmarshal does the main work of unmarshaling a message.
130// u provides type information used to unmarshal the message.
131// m is a pointer to a protocol buffer message.
132// b is a byte stream to unmarshal into m.
133// This is top routine used when recursively unmarshaling submessages.
134func (u *unmarshalInfo) unmarshal(m pointer, b []byte) error {
135 if atomic.LoadInt32(&u.initialized) == 0 {
136 u.computeUnmarshalInfo()
137 }
138 if u.isMessageSet {
139 return UnmarshalMessageSet(b, m.offset(u.extensions).toExtensions())
140 }
141 var reqMask uint64 // bitmask of required fields we've seen.
142 var errLater error
143 for len(b) > 0 {
144 // Read tag and wire type.
145 // Special case 1 and 2 byte varints.
146 var x uint64
147 if b[0] < 128 {
148 x = uint64(b[0])
149 b = b[1:]
150 } else if len(b) >= 2 && b[1] < 128 {
151 x = uint64(b[0]&0x7f) + uint64(b[1])<<7
152 b = b[2:]
153 } else {
154 var n int
155 x, n = decodeVarint(b)
156 if n == 0 {
157 return io.ErrUnexpectedEOF
158 }
159 b = b[n:]
160 }
161 tag := x >> 3
162 wire := int(x) & 7
163
164 // Dispatch on the tag to one of the unmarshal* functions below.
165 var f unmarshalFieldInfo
166 if tag < uint64(len(u.dense)) {
167 f = u.dense[tag]
168 } else {
169 f = u.sparse[tag]
170 }
171 if fn := f.unmarshal; fn != nil {
172 var err error
173 b, err = fn(b, m.offset(f.field), wire)
174 if err == nil {
175 reqMask |= f.reqMask
176 continue
177 }
178 if r, ok := err.(*RequiredNotSetError); ok {
179 // Remember this error, but keep parsing. We need to produce
180 // a full parse even if a required field is missing.
181 if errLater == nil {
182 errLater = r
183 }
184 reqMask |= f.reqMask
185 continue
186 }
187 if err != errInternalBadWireType {
188 if err == errInvalidUTF8 {
189 if errLater == nil {
190 fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name
191 errLater = &invalidUTF8Error{fullName}
192 }
193 continue
194 }
195 return err
196 }
197 // Fragments with bad wire type are treated as unknown fields.
198 }
199
200 // Unknown tag.
201 if !u.unrecognized.IsValid() {
202 // Don't keep unrecognized data; just skip it.
203 var err error
204 b, err = skipField(b, wire)
205 if err != nil {
206 return err
207 }
208 continue
209 }
210 // Keep unrecognized data around.
211 // maybe in extensions, maybe in the unrecognized field.
212 z := m.offset(u.unrecognized).toBytes()
213 var emap map[int32]Extension
214 var e Extension
215 for _, r := range u.extensionRanges {
216 if uint64(r.Start) <= tag && tag <= uint64(r.End) {
217 if u.extensions.IsValid() {
218 mp := m.offset(u.extensions).toExtensions()
219 emap = mp.extensionsWrite()
220 e = emap[int32(tag)]
221 z = &e.enc
222 break
223 }
224 if u.oldExtensions.IsValid() {
225 p := m.offset(u.oldExtensions).toOldExtensions()
226 emap = *p
227 if emap == nil {
228 emap = map[int32]Extension{}
229 *p = emap
230 }
231 e = emap[int32(tag)]
232 z = &e.enc
233 break
234 }
235 panic("no extensions field available")
236 }
237 }
238
239 // Use wire type to skip data.
240 var err error
241 b0 := b
242 b, err = skipField(b, wire)
243 if err != nil {
244 return err
245 }
246 *z = encodeVarint(*z, tag<<3|uint64(wire))
247 *z = append(*z, b0[:len(b0)-len(b)]...)
248
249 if emap != nil {
250 emap[int32(tag)] = e
251 }
252 }
253 if reqMask != u.reqMask && errLater == nil {
254 // A required field of this message is missing.
255 for _, n := range u.reqFields {
256 if reqMask&1 == 0 {
257 errLater = &RequiredNotSetError{n}
258 }
259 reqMask >>= 1
260 }
261 }
262 return errLater
263}
264
265// computeUnmarshalInfo fills in u with information for use
266// in unmarshaling protocol buffers of type u.typ.
267func (u *unmarshalInfo) computeUnmarshalInfo() {
268 u.lock.Lock()
269 defer u.lock.Unlock()
270 if u.initialized != 0 {
271 return
272 }
273 t := u.typ
274 n := t.NumField()
275
276 // Set up the "not found" value for the unrecognized byte buffer.
277 // This is the default for proto3.
278 u.unrecognized = invalidField
279 u.extensions = invalidField
280 u.oldExtensions = invalidField
281
282 // List of the generated type and offset for each oneof field.
283 type oneofField struct {
284 ityp reflect.Type // interface type of oneof field
285 field field // offset in containing message
286 }
287 var oneofFields []oneofField
288
289 for i := 0; i < n; i++ {
290 f := t.Field(i)
291 if f.Name == "XXX_unrecognized" {
292 // The byte slice used to hold unrecognized input is special.
293 if f.Type != reflect.TypeOf(([]byte)(nil)) {
294 panic("bad type for XXX_unrecognized field: " + f.Type.Name())
295 }
296 u.unrecognized = toField(&f)
297 continue
298 }
299 if f.Name == "XXX_InternalExtensions" {
300 // Ditto here.
301 if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) {
302 panic("bad type for XXX_InternalExtensions field: " + f.Type.Name())
303 }
304 u.extensions = toField(&f)
305 if f.Tag.Get("protobuf_messageset") == "1" {
306 u.isMessageSet = true
307 }
308 continue
309 }
310 if f.Name == "XXX_extensions" {
311 // An older form of the extensions field.
312 if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) {
313 panic("bad type for XXX_extensions field: " + f.Type.Name())
314 }
315 u.oldExtensions = toField(&f)
316 continue
317 }
318 if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" {
319 continue
320 }
321
322 oneof := f.Tag.Get("protobuf_oneof")
323 if oneof != "" {
324 oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)})
325 // The rest of oneof processing happens below.
326 continue
327 }
328
329 tags := f.Tag.Get("protobuf")
330 tagArray := strings.Split(tags, ",")
331 if len(tagArray) < 2 {
332 panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags)
333 }
334 tag, err := strconv.Atoi(tagArray[1])
335 if err != nil {
336 panic("protobuf tag field not an integer: " + tagArray[1])
337 }
338
339 name := ""
340 for _, tag := range tagArray[3:] {
341 if strings.HasPrefix(tag, "name=") {
342 name = tag[5:]
343 }
344 }
345
346 // Extract unmarshaling function from the field (its type and tags).
347 unmarshal := fieldUnmarshaler(&f)
348
349 // Required field?
350 var reqMask uint64
351 if tagArray[2] == "req" {
352 bit := len(u.reqFields)
353 u.reqFields = append(u.reqFields, name)
354 reqMask = uint64(1) << uint(bit)
355 // TODO: if we have more than 64 required fields, we end up
356 // not verifying that all required fields are present.
357 // Fix this, perhaps using a count of required fields?
358 }
359
360 // Store the info in the correct slot in the message.
361 u.setTag(tag, toField(&f), unmarshal, reqMask, name)
362 }
363
364 // Find any types associated with oneof fields.
365 // TODO: XXX_OneofFuncs returns more info than we need. Get rid of some of it?
366 fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("XXX_OneofFuncs")
367 if fn.IsValid() {
368 res := fn.Call(nil)[3] // last return value from XXX_OneofFuncs: []interface{}
369 for i := res.Len() - 1; i >= 0; i-- {
370 v := res.Index(i) // interface{}
371 tptr := reflect.ValueOf(v.Interface()).Type() // *Msg_X
372 typ := tptr.Elem() // Msg_X
373
374 f := typ.Field(0) // oneof implementers have one field
375 baseUnmarshal := fieldUnmarshaler(&f)
376 tags := strings.Split(f.Tag.Get("protobuf"), ",")
377 fieldNum, err := strconv.Atoi(tags[1])
378 if err != nil {
379 panic("protobuf tag field not an integer: " + tags[1])
380 }
381 var name string
382 for _, tag := range tags {
383 if strings.HasPrefix(tag, "name=") {
384 name = strings.TrimPrefix(tag, "name=")
385 break
386 }
387 }
388
389 // Find the oneof field that this struct implements.
390 // Might take O(n^2) to process all of the oneofs, but who cares.
391 for _, of := range oneofFields {
392 if tptr.Implements(of.ityp) {
393 // We have found the corresponding interface for this struct.
394 // That lets us know where this struct should be stored
395 // when we encounter it during unmarshaling.
396 unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal)
397 u.setTag(fieldNum, of.field, unmarshal, 0, name)
398 }
399 }
400 }
401 }
402
403 // Get extension ranges, if any.
404 fn = reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray")
405 if fn.IsValid() {
406 if !u.extensions.IsValid() && !u.oldExtensions.IsValid() {
407 panic("a message with extensions, but no extensions field in " + t.Name())
408 }
409 u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange)
410 }
411
412 // Explicitly disallow tag 0. This will ensure we flag an error
413 // when decoding a buffer of all zeros. Without this code, we
414 // would decode and skip an all-zero buffer of even length.
415 // [0 0] is [tag=0/wiretype=varint varint-encoded-0].
416 u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) {
417 return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w)
418 }, 0, "")
419
420 // Set mask for required field check.
421 u.reqMask = uint64(1)<<uint(len(u.reqFields)) - 1
422
423 atomic.StoreInt32(&u.initialized, 1)
424}
425
426// setTag stores the unmarshal information for the given tag.
427// tag = tag # for field
428// field/unmarshal = unmarshal info for that field.
429// reqMask = if required, bitmask for field position in required field list. 0 otherwise.
430// name = short name of the field.
431func (u *unmarshalInfo) setTag(tag int, field field, unmarshal unmarshaler, reqMask uint64, name string) {
432 i := unmarshalFieldInfo{field: field, unmarshal: unmarshal, reqMask: reqMask, name: name}
433 n := u.typ.NumField()
434 if tag >= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here?
435 for len(u.dense) <= tag {
436 u.dense = append(u.dense, unmarshalFieldInfo{})
437 }
438 u.dense[tag] = i
439 return
440 }
441 if u.sparse == nil {
442 u.sparse = map[uint64]unmarshalFieldInfo{}
443 }
444 u.sparse[uint64(tag)] = i
445}
446
447// fieldUnmarshaler returns an unmarshaler for the given field.
448func fieldUnmarshaler(f *reflect.StructField) unmarshaler {
449 if f.Type.Kind() == reflect.Map {
450 return makeUnmarshalMap(f)
451 }
452 return typeUnmarshaler(f.Type, f.Tag.Get("protobuf"))
453}
454
455// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair.
456func typeUnmarshaler(t reflect.Type, tags string) unmarshaler {
457 tagArray := strings.Split(tags, ",")
458 encoding := tagArray[0]
459 name := "unknown"
460 proto3 := false
461 validateUTF8 := true
462 for _, tag := range tagArray[3:] {
463 if strings.HasPrefix(tag, "name=") {
464 name = tag[5:]
465 }
466 if tag == "proto3" {
467 proto3 = true
468 }
469 }
470 validateUTF8 = validateUTF8 && proto3
471
472 // Figure out packaging (pointer, slice, or both)
473 slice := false
474 pointer := false
475 if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
476 slice = true
477 t = t.Elem()
478 }
479 if t.Kind() == reflect.Ptr {
480 pointer = true
481 t = t.Elem()
482 }
483
484 // We'll never have both pointer and slice for basic types.
485 if pointer && slice && t.Kind() != reflect.Struct {
486 panic("both pointer and slice for basic type in " + t.Name())
487 }
488
489 switch t.Kind() {
490 case reflect.Bool:
491 if pointer {
492 return unmarshalBoolPtr
493 }
494 if slice {
495 return unmarshalBoolSlice
496 }
497 return unmarshalBoolValue
498 case reflect.Int32:
499 switch encoding {
500 case "fixed32":
501 if pointer {
502 return unmarshalFixedS32Ptr
503 }
504 if slice {
505 return unmarshalFixedS32Slice
506 }
507 return unmarshalFixedS32Value
508 case "varint":
509 // this could be int32 or enum
510 if pointer {
511 return unmarshalInt32Ptr
512 }
513 if slice {
514 return unmarshalInt32Slice
515 }
516 return unmarshalInt32Value
517 case "zigzag32":
518 if pointer {
519 return unmarshalSint32Ptr
520 }
521 if slice {
522 return unmarshalSint32Slice
523 }
524 return unmarshalSint32Value
525 }
526 case reflect.Int64:
527 switch encoding {
528 case "fixed64":
529 if pointer {
530 return unmarshalFixedS64Ptr
531 }
532 if slice {
533 return unmarshalFixedS64Slice
534 }
535 return unmarshalFixedS64Value
536 case "varint":
537 if pointer {
538 return unmarshalInt64Ptr
539 }
540 if slice {
541 return unmarshalInt64Slice
542 }
543 return unmarshalInt64Value
544 case "zigzag64":
545 if pointer {
546 return unmarshalSint64Ptr
547 }
548 if slice {
549 return unmarshalSint64Slice
550 }
551 return unmarshalSint64Value
552 }
553 case reflect.Uint32:
554 switch encoding {
555 case "fixed32":
556 if pointer {
557 return unmarshalFixed32Ptr
558 }
559 if slice {
560 return unmarshalFixed32Slice
561 }
562 return unmarshalFixed32Value
563 case "varint":
564 if pointer {
565 return unmarshalUint32Ptr
566 }
567 if slice {
568 return unmarshalUint32Slice
569 }
570 return unmarshalUint32Value
571 }
572 case reflect.Uint64:
573 switch encoding {
574 case "fixed64":
575 if pointer {
576 return unmarshalFixed64Ptr
577 }
578 if slice {
579 return unmarshalFixed64Slice
580 }
581 return unmarshalFixed64Value
582 case "varint":
583 if pointer {
584 return unmarshalUint64Ptr
585 }
586 if slice {
587 return unmarshalUint64Slice
588 }
589 return unmarshalUint64Value
590 }
591 case reflect.Float32:
592 if pointer {
593 return unmarshalFloat32Ptr
594 }
595 if slice {
596 return unmarshalFloat32Slice
597 }
598 return unmarshalFloat32Value
599 case reflect.Float64:
600 if pointer {
601 return unmarshalFloat64Ptr
602 }
603 if slice {
604 return unmarshalFloat64Slice
605 }
606 return unmarshalFloat64Value
607 case reflect.Map:
608 panic("map type in typeUnmarshaler in " + t.Name())
609 case reflect.Slice:
610 if pointer {
611 panic("bad pointer in slice case in " + t.Name())
612 }
613 if slice {
614 return unmarshalBytesSlice
615 }
616 return unmarshalBytesValue
617 case reflect.String:
618 if validateUTF8 {
619 if pointer {
620 return unmarshalUTF8StringPtr
621 }
622 if slice {
623 return unmarshalUTF8StringSlice
624 }
625 return unmarshalUTF8StringValue
626 }
627 if pointer {
628 return unmarshalStringPtr
629 }
630 if slice {
631 return unmarshalStringSlice
632 }
633 return unmarshalStringValue
634 case reflect.Struct:
635 // message or group field
636 if !pointer {
637 panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding))
638 }
639 switch encoding {
640 case "bytes":
641 if slice {
642 return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name)
643 }
644 return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name)
645 case "group":
646 if slice {
647 return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name)
648 }
649 return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name)
650 }
651 }
652 panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding))
653}
654
655// Below are all the unmarshalers for individual fields of various types.
656
657func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) {
658 if w != WireVarint {
659 return b, errInternalBadWireType
660 }
661 x, n := decodeVarint(b)
662 if n == 0 {
663 return nil, io.ErrUnexpectedEOF
664 }
665 b = b[n:]
666 v := int64(x)
667 *f.toInt64() = v
668 return b, nil
669}
670
671func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) {
672 if w != WireVarint {
673 return b, errInternalBadWireType
674 }
675 x, n := decodeVarint(b)
676 if n == 0 {
677 return nil, io.ErrUnexpectedEOF
678 }
679 b = b[n:]
680 v := int64(x)
681 *f.toInt64Ptr() = &v
682 return b, nil
683}
684
685func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) {
686 if w == WireBytes { // packed
687 x, n := decodeVarint(b)
688 if n == 0 {
689 return nil, io.ErrUnexpectedEOF
690 }
691 b = b[n:]
692 if x > uint64(len(b)) {
693 return nil, io.ErrUnexpectedEOF
694 }
695 res := b[x:]
696 b = b[:x]
697 for len(b) > 0 {
698 x, n = decodeVarint(b)
699 if n == 0 {
700 return nil, io.ErrUnexpectedEOF
701 }
702 b = b[n:]
703 v := int64(x)
704 s := f.toInt64Slice()
705 *s = append(*s, v)
706 }
707 return res, nil
708 }
709 if w != WireVarint {
710 return b, errInternalBadWireType
711 }
712 x, n := decodeVarint(b)
713 if n == 0 {
714 return nil, io.ErrUnexpectedEOF
715 }
716 b = b[n:]
717 v := int64(x)
718 s := f.toInt64Slice()
719 *s = append(*s, v)
720 return b, nil
721}
722
723func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) {
724 if w != WireVarint {
725 return b, errInternalBadWireType
726 }
727 x, n := decodeVarint(b)
728 if n == 0 {
729 return nil, io.ErrUnexpectedEOF
730 }
731 b = b[n:]
732 v := int64(x>>1) ^ int64(x)<<63>>63
733 *f.toInt64() = v
734 return b, nil
735}
736
737func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) {
738 if w != WireVarint {
739 return b, errInternalBadWireType
740 }
741 x, n := decodeVarint(b)
742 if n == 0 {
743 return nil, io.ErrUnexpectedEOF
744 }
745 b = b[n:]
746 v := int64(x>>1) ^ int64(x)<<63>>63
747 *f.toInt64Ptr() = &v
748 return b, nil
749}
750
751func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) {
752 if w == WireBytes { // packed
753 x, n := decodeVarint(b)
754 if n == 0 {
755 return nil, io.ErrUnexpectedEOF
756 }
757 b = b[n:]
758 if x > uint64(len(b)) {
759 return nil, io.ErrUnexpectedEOF
760 }
761 res := b[x:]
762 b = b[:x]
763 for len(b) > 0 {
764 x, n = decodeVarint(b)
765 if n == 0 {
766 return nil, io.ErrUnexpectedEOF
767 }
768 b = b[n:]
769 v := int64(x>>1) ^ int64(x)<<63>>63
770 s := f.toInt64Slice()
771 *s = append(*s, v)
772 }
773 return res, nil
774 }
775 if w != WireVarint {
776 return b, errInternalBadWireType
777 }
778 x, n := decodeVarint(b)
779 if n == 0 {
780 return nil, io.ErrUnexpectedEOF
781 }
782 b = b[n:]
783 v := int64(x>>1) ^ int64(x)<<63>>63
784 s := f.toInt64Slice()
785 *s = append(*s, v)
786 return b, nil
787}
788
789func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) {
790 if w != WireVarint {
791 return b, errInternalBadWireType
792 }
793 x, n := decodeVarint(b)
794 if n == 0 {
795 return nil, io.ErrUnexpectedEOF
796 }
797 b = b[n:]
798 v := uint64(x)
799 *f.toUint64() = v
800 return b, nil
801}
802
803func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) {
804 if w != WireVarint {
805 return b, errInternalBadWireType
806 }
807 x, n := decodeVarint(b)
808 if n == 0 {
809 return nil, io.ErrUnexpectedEOF
810 }
811 b = b[n:]
812 v := uint64(x)
813 *f.toUint64Ptr() = &v
814 return b, nil
815}
816
817func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) {
818 if w == WireBytes { // packed
819 x, n := decodeVarint(b)
820 if n == 0 {
821 return nil, io.ErrUnexpectedEOF
822 }
823 b = b[n:]
824 if x > uint64(len(b)) {
825 return nil, io.ErrUnexpectedEOF
826 }
827 res := b[x:]
828 b = b[:x]
829 for len(b) > 0 {
830 x, n = decodeVarint(b)
831 if n == 0 {
832 return nil, io.ErrUnexpectedEOF
833 }
834 b = b[n:]
835 v := uint64(x)
836 s := f.toUint64Slice()
837 *s = append(*s, v)
838 }
839 return res, nil
840 }
841 if w != WireVarint {
842 return b, errInternalBadWireType
843 }
844 x, n := decodeVarint(b)
845 if n == 0 {
846 return nil, io.ErrUnexpectedEOF
847 }
848 b = b[n:]
849 v := uint64(x)
850 s := f.toUint64Slice()
851 *s = append(*s, v)
852 return b, nil
853}
854
855func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) {
856 if w != WireVarint {
857 return b, errInternalBadWireType
858 }
859 x, n := decodeVarint(b)
860 if n == 0 {
861 return nil, io.ErrUnexpectedEOF
862 }
863 b = b[n:]
864 v := int32(x)
865 *f.toInt32() = v
866 return b, nil
867}
868
869func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) {
870 if w != WireVarint {
871 return b, errInternalBadWireType
872 }
873 x, n := decodeVarint(b)
874 if n == 0 {
875 return nil, io.ErrUnexpectedEOF
876 }
877 b = b[n:]
878 v := int32(x)
879 f.setInt32Ptr(v)
880 return b, nil
881}
882
883func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) {
884 if w == WireBytes { // packed
885 x, n := decodeVarint(b)
886 if n == 0 {
887 return nil, io.ErrUnexpectedEOF
888 }
889 b = b[n:]
890 if x > uint64(len(b)) {
891 return nil, io.ErrUnexpectedEOF
892 }
893 res := b[x:]
894 b = b[:x]
895 for len(b) > 0 {
896 x, n = decodeVarint(b)
897 if n == 0 {
898 return nil, io.ErrUnexpectedEOF
899 }
900 b = b[n:]
901 v := int32(x)
902 f.appendInt32Slice(v)
903 }
904 return res, nil
905 }
906 if w != WireVarint {
907 return b, errInternalBadWireType
908 }
909 x, n := decodeVarint(b)
910 if n == 0 {
911 return nil, io.ErrUnexpectedEOF
912 }
913 b = b[n:]
914 v := int32(x)
915 f.appendInt32Slice(v)
916 return b, nil
917}
918
919func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) {
920 if w != WireVarint {
921 return b, errInternalBadWireType
922 }
923 x, n := decodeVarint(b)
924 if n == 0 {
925 return nil, io.ErrUnexpectedEOF
926 }
927 b = b[n:]
928 v := int32(x>>1) ^ int32(x)<<31>>31
929 *f.toInt32() = v
930 return b, nil
931}
932
933func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) {
934 if w != WireVarint {
935 return b, errInternalBadWireType
936 }
937 x, n := decodeVarint(b)
938 if n == 0 {
939 return nil, io.ErrUnexpectedEOF
940 }
941 b = b[n:]
942 v := int32(x>>1) ^ int32(x)<<31>>31
943 f.setInt32Ptr(v)
944 return b, nil
945}
946
947func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) {
948 if w == WireBytes { // packed
949 x, n := decodeVarint(b)
950 if n == 0 {
951 return nil, io.ErrUnexpectedEOF
952 }
953 b = b[n:]
954 if x > uint64(len(b)) {
955 return nil, io.ErrUnexpectedEOF
956 }
957 res := b[x:]
958 b = b[:x]
959 for len(b) > 0 {
960 x, n = decodeVarint(b)
961 if n == 0 {
962 return nil, io.ErrUnexpectedEOF
963 }
964 b = b[n:]
965 v := int32(x>>1) ^ int32(x)<<31>>31
966 f.appendInt32Slice(v)
967 }
968 return res, nil
969 }
970 if w != WireVarint {
971 return b, errInternalBadWireType
972 }
973 x, n := decodeVarint(b)
974 if n == 0 {
975 return nil, io.ErrUnexpectedEOF
976 }
977 b = b[n:]
978 v := int32(x>>1) ^ int32(x)<<31>>31
979 f.appendInt32Slice(v)
980 return b, nil
981}
982
983func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) {
984 if w != WireVarint {
985 return b, errInternalBadWireType
986 }
987 x, n := decodeVarint(b)
988 if n == 0 {
989 return nil, io.ErrUnexpectedEOF
990 }
991 b = b[n:]
992 v := uint32(x)
993 *f.toUint32() = v
994 return b, nil
995}
996
997func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) {
998 if w != WireVarint {
999 return b, errInternalBadWireType
1000 }
1001 x, n := decodeVarint(b)
1002 if n == 0 {
1003 return nil, io.ErrUnexpectedEOF
1004 }
1005 b = b[n:]
1006 v := uint32(x)
1007 *f.toUint32Ptr() = &v
1008 return b, nil
1009}
1010
1011func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) {
1012 if w == WireBytes { // packed
1013 x, n := decodeVarint(b)
1014 if n == 0 {
1015 return nil, io.ErrUnexpectedEOF
1016 }
1017 b = b[n:]
1018 if x > uint64(len(b)) {
1019 return nil, io.ErrUnexpectedEOF
1020 }
1021 res := b[x:]
1022 b = b[:x]
1023 for len(b) > 0 {
1024 x, n = decodeVarint(b)
1025 if n == 0 {
1026 return nil, io.ErrUnexpectedEOF
1027 }
1028 b = b[n:]
1029 v := uint32(x)
1030 s := f.toUint32Slice()
1031 *s = append(*s, v)
1032 }
1033 return res, nil
1034 }
1035 if w != WireVarint {
1036 return b, errInternalBadWireType
1037 }
1038 x, n := decodeVarint(b)
1039 if n == 0 {
1040 return nil, io.ErrUnexpectedEOF
1041 }
1042 b = b[n:]
1043 v := uint32(x)
1044 s := f.toUint32Slice()
1045 *s = append(*s, v)
1046 return b, nil
1047}
1048
1049func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) {
1050 if w != WireFixed64 {
1051 return b, errInternalBadWireType
1052 }
1053 if len(b) < 8 {
1054 return nil, io.ErrUnexpectedEOF
1055 }
1056 v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
1057 *f.toUint64() = v
1058 return b[8:], nil
1059}
1060
1061func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) {
1062 if w != WireFixed64 {
1063 return b, errInternalBadWireType
1064 }
1065 if len(b) < 8 {
1066 return nil, io.ErrUnexpectedEOF
1067 }
1068 v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
1069 *f.toUint64Ptr() = &v
1070 return b[8:], nil
1071}
1072
1073func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) {
1074 if w == WireBytes { // packed
1075 x, n := decodeVarint(b)
1076 if n == 0 {
1077 return nil, io.ErrUnexpectedEOF
1078 }
1079 b = b[n:]
1080 if x > uint64(len(b)) {
1081 return nil, io.ErrUnexpectedEOF
1082 }
1083 res := b[x:]
1084 b = b[:x]
1085 for len(b) > 0 {
1086 if len(b) < 8 {
1087 return nil, io.ErrUnexpectedEOF
1088 }
1089 v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
1090 s := f.toUint64Slice()
1091 *s = append(*s, v)
1092 b = b[8:]
1093 }
1094 return res, nil
1095 }
1096 if w != WireFixed64 {
1097 return b, errInternalBadWireType
1098 }
1099 if len(b) < 8 {
1100 return nil, io.ErrUnexpectedEOF
1101 }
1102 v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
1103 s := f.toUint64Slice()
1104 *s = append(*s, v)
1105 return b[8:], nil
1106}
1107
1108func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) {
1109 if w != WireFixed64 {
1110 return b, errInternalBadWireType
1111 }
1112 if len(b) < 8 {
1113 return nil, io.ErrUnexpectedEOF
1114 }
1115 v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56
1116 *f.toInt64() = v
1117 return b[8:], nil
1118}
1119
1120func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) {
1121 if w != WireFixed64 {
1122 return b, errInternalBadWireType
1123 }
1124 if len(b) < 8 {
1125 return nil, io.ErrUnexpectedEOF
1126 }
1127 v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56
1128 *f.toInt64Ptr() = &v
1129 return b[8:], nil
1130}
1131
1132func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) {
1133 if w == WireBytes { // packed
1134 x, n := decodeVarint(b)
1135 if n == 0 {
1136 return nil, io.ErrUnexpectedEOF
1137 }
1138 b = b[n:]
1139 if x > uint64(len(b)) {
1140 return nil, io.ErrUnexpectedEOF
1141 }
1142 res := b[x:]
1143 b = b[:x]
1144 for len(b) > 0 {
1145 if len(b) < 8 {
1146 return nil, io.ErrUnexpectedEOF
1147 }
1148 v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56
1149 s := f.toInt64Slice()
1150 *s = append(*s, v)
1151 b = b[8:]
1152 }
1153 return res, nil
1154 }
1155 if w != WireFixed64 {
1156 return b, errInternalBadWireType
1157 }
1158 if len(b) < 8 {
1159 return nil, io.ErrUnexpectedEOF
1160 }
1161 v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56
1162 s := f.toInt64Slice()
1163 *s = append(*s, v)
1164 return b[8:], nil
1165}
1166
1167func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) {
1168 if w != WireFixed32 {
1169 return b, errInternalBadWireType
1170 }
1171 if len(b) < 4 {
1172 return nil, io.ErrUnexpectedEOF
1173 }
1174 v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
1175 *f.toUint32() = v
1176 return b[4:], nil
1177}
1178
1179func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) {
1180 if w != WireFixed32 {
1181 return b, errInternalBadWireType
1182 }
1183 if len(b) < 4 {
1184 return nil, io.ErrUnexpectedEOF
1185 }
1186 v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
1187 *f.toUint32Ptr() = &v
1188 return b[4:], nil
1189}
1190
1191func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) {
1192 if w == WireBytes { // packed
1193 x, n := decodeVarint(b)
1194 if n == 0 {
1195 return nil, io.ErrUnexpectedEOF
1196 }
1197 b = b[n:]
1198 if x > uint64(len(b)) {
1199 return nil, io.ErrUnexpectedEOF
1200 }
1201 res := b[x:]
1202 b = b[:x]
1203 for len(b) > 0 {
1204 if len(b) < 4 {
1205 return nil, io.ErrUnexpectedEOF
1206 }
1207 v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
1208 s := f.toUint32Slice()
1209 *s = append(*s, v)
1210 b = b[4:]
1211 }
1212 return res, nil
1213 }
1214 if w != WireFixed32 {
1215 return b, errInternalBadWireType
1216 }
1217 if len(b) < 4 {
1218 return nil, io.ErrUnexpectedEOF
1219 }
1220 v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
1221 s := f.toUint32Slice()
1222 *s = append(*s, v)
1223 return b[4:], nil
1224}
1225
1226func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) {
1227 if w != WireFixed32 {
1228 return b, errInternalBadWireType
1229 }
1230 if len(b) < 4 {
1231 return nil, io.ErrUnexpectedEOF
1232 }
1233 v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24
1234 *f.toInt32() = v
1235 return b[4:], nil
1236}
1237
1238func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) {
1239 if w != WireFixed32 {
1240 return b, errInternalBadWireType
1241 }
1242 if len(b) < 4 {
1243 return nil, io.ErrUnexpectedEOF
1244 }
1245 v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24
1246 f.setInt32Ptr(v)
1247 return b[4:], nil
1248}
1249
1250func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) {
1251 if w == WireBytes { // packed
1252 x, n := decodeVarint(b)
1253 if n == 0 {
1254 return nil, io.ErrUnexpectedEOF
1255 }
1256 b = b[n:]
1257 if x > uint64(len(b)) {
1258 return nil, io.ErrUnexpectedEOF
1259 }
1260 res := b[x:]
1261 b = b[:x]
1262 for len(b) > 0 {
1263 if len(b) < 4 {
1264 return nil, io.ErrUnexpectedEOF
1265 }
1266 v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24
1267 f.appendInt32Slice(v)
1268 b = b[4:]
1269 }
1270 return res, nil
1271 }
1272 if w != WireFixed32 {
1273 return b, errInternalBadWireType
1274 }
1275 if len(b) < 4 {
1276 return nil, io.ErrUnexpectedEOF
1277 }
1278 v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24
1279 f.appendInt32Slice(v)
1280 return b[4:], nil
1281}
1282
1283func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) {
1284 if w != WireVarint {
1285 return b, errInternalBadWireType
1286 }
1287 // Note: any length varint is allowed, even though any sane
1288 // encoder will use one byte.
1289 // See https://github.com/golang/protobuf/issues/76
1290 x, n := decodeVarint(b)
1291 if n == 0 {
1292 return nil, io.ErrUnexpectedEOF
1293 }
1294 // TODO: check if x>1? Tests seem to indicate no.
1295 v := x != 0
1296 *f.toBool() = v
1297 return b[n:], nil
1298}
1299
1300func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) {
1301 if w != WireVarint {
1302 return b, errInternalBadWireType
1303 }
1304 x, n := decodeVarint(b)
1305 if n == 0 {
1306 return nil, io.ErrUnexpectedEOF
1307 }
1308 v := x != 0
1309 *f.toBoolPtr() = &v
1310 return b[n:], nil
1311}
1312
1313func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) {
1314 if w == WireBytes { // packed
1315 x, n := decodeVarint(b)
1316 if n == 0 {
1317 return nil, io.ErrUnexpectedEOF
1318 }
1319 b = b[n:]
1320 if x > uint64(len(b)) {
1321 return nil, io.ErrUnexpectedEOF
1322 }
1323 res := b[x:]
1324 b = b[:x]
1325 for len(b) > 0 {
1326 x, n = decodeVarint(b)
1327 if n == 0 {
1328 return nil, io.ErrUnexpectedEOF
1329 }
1330 v := x != 0
1331 s := f.toBoolSlice()
1332 *s = append(*s, v)
1333 b = b[n:]
1334 }
1335 return res, nil
1336 }
1337 if w != WireVarint {
1338 return b, errInternalBadWireType
1339 }
1340 x, n := decodeVarint(b)
1341 if n == 0 {
1342 return nil, io.ErrUnexpectedEOF
1343 }
1344 v := x != 0
1345 s := f.toBoolSlice()
1346 *s = append(*s, v)
1347 return b[n:], nil
1348}
1349
1350func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) {
1351 if w != WireFixed64 {
1352 return b, errInternalBadWireType
1353 }
1354 if len(b) < 8 {
1355 return nil, io.ErrUnexpectedEOF
1356 }
1357 v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56)
1358 *f.toFloat64() = v
1359 return b[8:], nil
1360}
1361
1362func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) {
1363 if w != WireFixed64 {
1364 return b, errInternalBadWireType
1365 }
1366 if len(b) < 8 {
1367 return nil, io.ErrUnexpectedEOF
1368 }
1369 v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56)
1370 *f.toFloat64Ptr() = &v
1371 return b[8:], nil
1372}
1373
1374func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) {
1375 if w == WireBytes { // packed
1376 x, n := decodeVarint(b)
1377 if n == 0 {
1378 return nil, io.ErrUnexpectedEOF
1379 }
1380 b = b[n:]
1381 if x > uint64(len(b)) {
1382 return nil, io.ErrUnexpectedEOF
1383 }
1384 res := b[x:]
1385 b = b[:x]
1386 for len(b) > 0 {
1387 if len(b) < 8 {
1388 return nil, io.ErrUnexpectedEOF
1389 }
1390 v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56)
1391 s := f.toFloat64Slice()
1392 *s = append(*s, v)
1393 b = b[8:]
1394 }
1395 return res, nil
1396 }
1397 if w != WireFixed64 {
1398 return b, errInternalBadWireType
1399 }
1400 if len(b) < 8 {
1401 return nil, io.ErrUnexpectedEOF
1402 }
1403 v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56)
1404 s := f.toFloat64Slice()
1405 *s = append(*s, v)
1406 return b[8:], nil
1407}
1408
1409func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) {
1410 if w != WireFixed32 {
1411 return b, errInternalBadWireType
1412 }
1413 if len(b) < 4 {
1414 return nil, io.ErrUnexpectedEOF
1415 }
1416 v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24)
1417 *f.toFloat32() = v
1418 return b[4:], nil
1419}
1420
1421func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) {
1422 if w != WireFixed32 {
1423 return b, errInternalBadWireType
1424 }
1425 if len(b) < 4 {
1426 return nil, io.ErrUnexpectedEOF
1427 }
1428 v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24)
1429 *f.toFloat32Ptr() = &v
1430 return b[4:], nil
1431}
1432
1433func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) {
1434 if w == WireBytes { // packed
1435 x, n := decodeVarint(b)
1436 if n == 0 {
1437 return nil, io.ErrUnexpectedEOF
1438 }
1439 b = b[n:]
1440 if x > uint64(len(b)) {
1441 return nil, io.ErrUnexpectedEOF
1442 }
1443 res := b[x:]
1444 b = b[:x]
1445 for len(b) > 0 {
1446 if len(b) < 4 {
1447 return nil, io.ErrUnexpectedEOF
1448 }
1449 v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24)
1450 s := f.toFloat32Slice()
1451 *s = append(*s, v)
1452 b = b[4:]
1453 }
1454 return res, nil
1455 }
1456 if w != WireFixed32 {
1457 return b, errInternalBadWireType
1458 }
1459 if len(b) < 4 {
1460 return nil, io.ErrUnexpectedEOF
1461 }
1462 v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24)
1463 s := f.toFloat32Slice()
1464 *s = append(*s, v)
1465 return b[4:], nil
1466}
1467
1468func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) {
1469 if w != WireBytes {
1470 return b, errInternalBadWireType
1471 }
1472 x, n := decodeVarint(b)
1473 if n == 0 {
1474 return nil, io.ErrUnexpectedEOF
1475 }
1476 b = b[n:]
1477 if x > uint64(len(b)) {
1478 return nil, io.ErrUnexpectedEOF
1479 }
1480 v := string(b[:x])
1481 *f.toString() = v
1482 return b[x:], nil
1483}
1484
1485func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) {
1486 if w != WireBytes {
1487 return b, errInternalBadWireType
1488 }
1489 x, n := decodeVarint(b)
1490 if n == 0 {
1491 return nil, io.ErrUnexpectedEOF
1492 }
1493 b = b[n:]
1494 if x > uint64(len(b)) {
1495 return nil, io.ErrUnexpectedEOF
1496 }
1497 v := string(b[:x])
1498 *f.toStringPtr() = &v
1499 return b[x:], nil
1500}
1501
1502func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) {
1503 if w != WireBytes {
1504 return b, errInternalBadWireType
1505 }
1506 x, n := decodeVarint(b)
1507 if n == 0 {
1508 return nil, io.ErrUnexpectedEOF
1509 }
1510 b = b[n:]
1511 if x > uint64(len(b)) {
1512 return nil, io.ErrUnexpectedEOF
1513 }
1514 v := string(b[:x])
1515 s := f.toStringSlice()
1516 *s = append(*s, v)
1517 return b[x:], nil
1518}
1519
1520func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) {
1521 if w != WireBytes {
1522 return b, errInternalBadWireType
1523 }
1524 x, n := decodeVarint(b)
1525 if n == 0 {
1526 return nil, io.ErrUnexpectedEOF
1527 }
1528 b = b[n:]
1529 if x > uint64(len(b)) {
1530 return nil, io.ErrUnexpectedEOF
1531 }
1532 v := string(b[:x])
1533 *f.toString() = v
1534 if !utf8.ValidString(v) {
1535 return b[x:], errInvalidUTF8
1536 }
1537 return b[x:], nil
1538}
1539
1540func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) {
1541 if w != WireBytes {
1542 return b, errInternalBadWireType
1543 }
1544 x, n := decodeVarint(b)
1545 if n == 0 {
1546 return nil, io.ErrUnexpectedEOF
1547 }
1548 b = b[n:]
1549 if x > uint64(len(b)) {
1550 return nil, io.ErrUnexpectedEOF
1551 }
1552 v := string(b[:x])
1553 *f.toStringPtr() = &v
1554 if !utf8.ValidString(v) {
1555 return b[x:], errInvalidUTF8
1556 }
1557 return b[x:], nil
1558}
1559
1560func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) {
1561 if w != WireBytes {
1562 return b, errInternalBadWireType
1563 }
1564 x, n := decodeVarint(b)
1565 if n == 0 {
1566 return nil, io.ErrUnexpectedEOF
1567 }
1568 b = b[n:]
1569 if x > uint64(len(b)) {
1570 return nil, io.ErrUnexpectedEOF
1571 }
1572 v := string(b[:x])
1573 s := f.toStringSlice()
1574 *s = append(*s, v)
1575 if !utf8.ValidString(v) {
1576 return b[x:], errInvalidUTF8
1577 }
1578 return b[x:], nil
1579}
1580
1581var emptyBuf [0]byte
1582
1583func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) {
1584 if w != WireBytes {
1585 return b, errInternalBadWireType
1586 }
1587 x, n := decodeVarint(b)
1588 if n == 0 {
1589 return nil, io.ErrUnexpectedEOF
1590 }
1591 b = b[n:]
1592 if x > uint64(len(b)) {
1593 return nil, io.ErrUnexpectedEOF
1594 }
1595 // The use of append here is a trick which avoids the zeroing
1596 // that would be required if we used a make/copy pair.
1597 // We append to emptyBuf instead of nil because we want
1598 // a non-nil result even when the length is 0.
1599 v := append(emptyBuf[:], b[:x]...)
1600 *f.toBytes() = v
1601 return b[x:], nil
1602}
1603
1604func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) {
1605 if w != WireBytes {
1606 return b, errInternalBadWireType
1607 }
1608 x, n := decodeVarint(b)
1609 if n == 0 {
1610 return nil, io.ErrUnexpectedEOF
1611 }
1612 b = b[n:]
1613 if x > uint64(len(b)) {
1614 return nil, io.ErrUnexpectedEOF
1615 }
1616 v := append(emptyBuf[:], b[:x]...)
1617 s := f.toBytesSlice()
1618 *s = append(*s, v)
1619 return b[x:], nil
1620}
1621
1622func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler {
1623 return func(b []byte, f pointer, w int) ([]byte, error) {
1624 if w != WireBytes {
1625 return b, errInternalBadWireType
1626 }
1627 x, n := decodeVarint(b)
1628 if n == 0 {
1629 return nil, io.ErrUnexpectedEOF
1630 }
1631 b = b[n:]
1632 if x > uint64(len(b)) {
1633 return nil, io.ErrUnexpectedEOF
1634 }
1635 // First read the message field to see if something is there.
1636 // The semantics of multiple submessages are weird. Instead of
1637 // the last one winning (as it is for all other fields), multiple
1638 // submessages are merged.
1639 v := f.getPointer()
1640 if v.isNil() {
1641 v = valToPointer(reflect.New(sub.typ))
1642 f.setPointer(v)
1643 }
1644 err := sub.unmarshal(v, b[:x])
1645 if err != nil {
1646 if r, ok := err.(*RequiredNotSetError); ok {
1647 r.field = name + "." + r.field
1648 } else {
1649 return nil, err
1650 }
1651 }
1652 return b[x:], err
1653 }
1654}
1655
1656func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler {
1657 return func(b []byte, f pointer, w int) ([]byte, error) {
1658 if w != WireBytes {
1659 return b, errInternalBadWireType
1660 }
1661 x, n := decodeVarint(b)
1662 if n == 0 {
1663 return nil, io.ErrUnexpectedEOF
1664 }
1665 b = b[n:]
1666 if x > uint64(len(b)) {
1667 return nil, io.ErrUnexpectedEOF
1668 }
1669 v := valToPointer(reflect.New(sub.typ))
1670 err := sub.unmarshal(v, b[:x])
1671 if err != nil {
1672 if r, ok := err.(*RequiredNotSetError); ok {
1673 r.field = name + "." + r.field
1674 } else {
1675 return nil, err
1676 }
1677 }
1678 f.appendPointer(v)
1679 return b[x:], err
1680 }
1681}
1682
1683func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler {
1684 return func(b []byte, f pointer, w int) ([]byte, error) {
1685 if w != WireStartGroup {
1686 return b, errInternalBadWireType
1687 }
1688 x, y := findEndGroup(b)
1689 if x < 0 {
1690 return nil, io.ErrUnexpectedEOF
1691 }
1692 v := f.getPointer()
1693 if v.isNil() {
1694 v = valToPointer(reflect.New(sub.typ))
1695 f.setPointer(v)
1696 }
1697 err := sub.unmarshal(v, b[:x])
1698 if err != nil {
1699 if r, ok := err.(*RequiredNotSetError); ok {
1700 r.field = name + "." + r.field
1701 } else {
1702 return nil, err
1703 }
1704 }
1705 return b[y:], err
1706 }
1707}
1708
1709func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler {
1710 return func(b []byte, f pointer, w int) ([]byte, error) {
1711 if w != WireStartGroup {
1712 return b, errInternalBadWireType
1713 }
1714 x, y := findEndGroup(b)
1715 if x < 0 {
1716 return nil, io.ErrUnexpectedEOF
1717 }
1718 v := valToPointer(reflect.New(sub.typ))
1719 err := sub.unmarshal(v, b[:x])
1720 if err != nil {
1721 if r, ok := err.(*RequiredNotSetError); ok {
1722 r.field = name + "." + r.field
1723 } else {
1724 return nil, err
1725 }
1726 }
1727 f.appendPointer(v)
1728 return b[y:], err
1729 }
1730}
1731
1732func makeUnmarshalMap(f *reflect.StructField) unmarshaler {
1733 t := f.Type
1734 kt := t.Key()
1735 vt := t.Elem()
1736 unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key"))
1737 unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val"))
1738 return func(b []byte, f pointer, w int) ([]byte, error) {
1739 // The map entry is a submessage. Figure out how big it is.
1740 if w != WireBytes {
1741 return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes)
1742 }
1743 x, n := decodeVarint(b)
1744 if n == 0 {
1745 return nil, io.ErrUnexpectedEOF
1746 }
1747 b = b[n:]
1748 if x > uint64(len(b)) {
1749 return nil, io.ErrUnexpectedEOF
1750 }
1751 r := b[x:] // unused data to return
1752 b = b[:x] // data for map entry
1753
1754 // Note: we could use #keys * #values ~= 200 functions
1755 // to do map decoding without reflection. Probably not worth it.
1756 // Maps will be somewhat slow. Oh well.
1757
1758 // Read key and value from data.
1759 var nerr nonFatal
1760 k := reflect.New(kt)
1761 v := reflect.New(vt)
1762 for len(b) > 0 {
1763 x, n := decodeVarint(b)
1764 if n == 0 {
1765 return nil, io.ErrUnexpectedEOF
1766 }
1767 wire := int(x) & 7
1768 b = b[n:]
1769
1770 var err error
1771 switch x >> 3 {
1772 case 1:
1773 b, err = unmarshalKey(b, valToPointer(k), wire)
1774 case 2:
1775 b, err = unmarshalVal(b, valToPointer(v), wire)
1776 default:
1777 err = errInternalBadWireType // skip unknown tag
1778 }
1779
1780 if nerr.Merge(err) {
1781 continue
1782 }
1783 if err != errInternalBadWireType {
1784 return nil, err
1785 }
1786
1787 // Skip past unknown fields.
1788 b, err = skipField(b, wire)
1789 if err != nil {
1790 return nil, err
1791 }
1792 }
1793
1794 // Get map, allocate if needed.
1795 m := f.asPointerTo(t).Elem() // an addressable map[K]T
1796 if m.IsNil() {
1797 m.Set(reflect.MakeMap(t))
1798 }
1799
1800 // Insert into map.
1801 m.SetMapIndex(k.Elem(), v.Elem())
1802
1803 return r, nerr.E
1804 }
1805}
1806
1807// makeUnmarshalOneof makes an unmarshaler for oneof fields.
1808// for:
1809// message Msg {
1810// oneof F {
1811// int64 X = 1;
1812// float64 Y = 2;
1813// }
1814// }
1815// typ is the type of the concrete entry for a oneof case (e.g. Msg_X).
1816// ityp is the interface type of the oneof field (e.g. isMsg_F).
1817// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64).
1818// Note that this function will be called once for each case in the oneof.
1819func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler {
1820 sf := typ.Field(0)
1821 field0 := toField(&sf)
1822 return func(b []byte, f pointer, w int) ([]byte, error) {
1823 // Allocate holder for value.
1824 v := reflect.New(typ)
1825
1826 // Unmarshal data into holder.
1827 // We unmarshal into the first field of the holder object.
1828 var err error
1829 var nerr nonFatal
1830 b, err = unmarshal(b, valToPointer(v).offset(field0), w)
1831 if !nerr.Merge(err) {
1832 return nil, err
1833 }
1834
1835 // Write pointer to holder into target field.
1836 f.asPointerTo(ityp).Elem().Set(v)
1837
1838 return b, nerr.E
1839 }
1840}
1841
1842// Error used by decode internally.
1843var errInternalBadWireType = errors.New("proto: internal error: bad wiretype")
1844
1845// skipField skips past a field of type wire and returns the remaining bytes.
1846func skipField(b []byte, wire int) ([]byte, error) {
1847 switch wire {
1848 case WireVarint:
1849 _, k := decodeVarint(b)
1850 if k == 0 {
1851 return b, io.ErrUnexpectedEOF
1852 }
1853 b = b[k:]
1854 case WireFixed32:
1855 if len(b) < 4 {
1856 return b, io.ErrUnexpectedEOF
1857 }
1858 b = b[4:]
1859 case WireFixed64:
1860 if len(b) < 8 {
1861 return b, io.ErrUnexpectedEOF
1862 }
1863 b = b[8:]
1864 case WireBytes:
1865 m, k := decodeVarint(b)
1866 if k == 0 || uint64(len(b)-k) < m {
1867 return b, io.ErrUnexpectedEOF
1868 }
1869 b = b[uint64(k)+m:]
1870 case WireStartGroup:
1871 _, i := findEndGroup(b)
1872 if i == -1 {
1873 return b, io.ErrUnexpectedEOF
1874 }
1875 b = b[i:]
1876 default:
1877 return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire)
1878 }
1879 return b, nil
1880}
1881
1882// findEndGroup finds the index of the next EndGroup tag.
1883// Groups may be nested, so the "next" EndGroup tag is the first
1884// unpaired EndGroup.
1885// findEndGroup returns the indexes of the start and end of the EndGroup tag.
1886// Returns (-1,-1) if it can't find one.
1887func findEndGroup(b []byte) (int, int) {
1888 depth := 1
1889 i := 0
1890 for {
1891 x, n := decodeVarint(b[i:])
1892 if n == 0 {
1893 return -1, -1
1894 }
1895 j := i
1896 i += n
1897 switch x & 7 {
1898 case WireVarint:
1899 _, k := decodeVarint(b[i:])
1900 if k == 0 {
1901 return -1, -1
1902 }
1903 i += k
1904 case WireFixed32:
1905 if len(b)-4 < i {
1906 return -1, -1
1907 }
1908 i += 4
1909 case WireFixed64:
1910 if len(b)-8 < i {
1911 return -1, -1
1912 }
1913 i += 8
1914 case WireBytes:
1915 m, k := decodeVarint(b[i:])
1916 if k == 0 {
1917 return -1, -1
1918 }
1919 i += k
1920 if uint64(len(b)-i) < m {
1921 return -1, -1
1922 }
1923 i += int(m)
1924 case WireStartGroup:
1925 depth++
1926 case WireEndGroup:
1927 depth--
1928 if depth == 0 {
1929 return j, i
1930 }
1931 default:
1932 return -1, -1
1933 }
1934 }
1935}
1936
1937// encodeVarint appends a varint-encoded integer to b and returns the result.
1938func encodeVarint(b []byte, x uint64) []byte {
1939 for x >= 1<<7 {
1940 b = append(b, byte(x&0x7f|0x80))
1941 x >>= 7
1942 }
1943 return append(b, byte(x))
1944}
1945
1946// decodeVarint reads a varint-encoded integer from b.
1947// Returns the decoded integer and the number of bytes read.
1948// If there is an error, it returns 0,0.
1949func decodeVarint(b []byte) (uint64, int) {
1950 var x, y uint64
1951 if len(b) <= 0 {
1952 goto bad
1953 }
1954 x = uint64(b[0])
1955 if x < 0x80 {
1956 return x, 1
1957 }
1958 x -= 0x80
1959
1960 if len(b) <= 1 {
1961 goto bad
1962 }
1963 y = uint64(b[1])
1964 x += y << 7
1965 if y < 0x80 {
1966 return x, 2
1967 }
1968 x -= 0x80 << 7
1969
1970 if len(b) <= 2 {
1971 goto bad
1972 }
1973 y = uint64(b[2])
1974 x += y << 14
1975 if y < 0x80 {
1976 return x, 3
1977 }
1978 x -= 0x80 << 14
1979
1980 if len(b) <= 3 {
1981 goto bad
1982 }
1983 y = uint64(b[3])
1984 x += y << 21
1985 if y < 0x80 {
1986 return x, 4
1987 }
1988 x -= 0x80 << 21
1989
1990 if len(b) <= 4 {
1991 goto bad
1992 }
1993 y = uint64(b[4])
1994 x += y << 28
1995 if y < 0x80 {
1996 return x, 5
1997 }
1998 x -= 0x80 << 28
1999
2000 if len(b) <= 5 {
2001 goto bad
2002 }
2003 y = uint64(b[5])
2004 x += y << 35
2005 if y < 0x80 {
2006 return x, 6
2007 }
2008 x -= 0x80 << 35
2009
2010 if len(b) <= 6 {
2011 goto bad
2012 }
2013 y = uint64(b[6])
2014 x += y << 42
2015 if y < 0x80 {
2016 return x, 7
2017 }
2018 x -= 0x80 << 42
2019
2020 if len(b) <= 7 {
2021 goto bad
2022 }
2023 y = uint64(b[7])
2024 x += y << 49
2025 if y < 0x80 {
2026 return x, 8
2027 }
2028 x -= 0x80 << 49
2029
2030 if len(b) <= 8 {
2031 goto bad
2032 }
2033 y = uint64(b[8])
2034 x += y << 56
2035 if y < 0x80 {
2036 return x, 9
2037 }
2038 x -= 0x80 << 56
2039
2040 if len(b) <= 9 {
2041 goto bad
2042 }
2043 y = uint64(b[9])
2044 x += y << 63
2045 if y < 2 {
2046 return x, 10
2047 }
2048
2049bad:
2050 return 0, 0
2051}