podman

Форк
0
/
table_unmarshal.go 
2249 строк · 54.1 Кб
1
// Go support for Protocol Buffers - Google's data interchange format
2
//
3
// Copyright 2016 The Go Authors.  All rights reserved.
4
// https://github.com/golang/protobuf
5
//
6
// Redistribution and use in source and binary forms, with or without
7
// modification, are permitted provided that the following conditions are
8
// met:
9
//
10
//     * Redistributions of source code must retain the above copyright
11
// notice, this list of conditions and the following disclaimer.
12
//     * Redistributions in binary form must reproduce the above
13
// copyright notice, this list of conditions and the following disclaimer
14
// in the documentation and/or other materials provided with the
15
// distribution.
16
//     * Neither the name of Google Inc. nor the names of its
17
// contributors may be used to endorse or promote products derived from
18
// this software without specific prior written permission.
19
//
20
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31

32
package proto
33

34
import (
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.
53
func (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

67
type 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
	bytesExtensions field // offset of XXX_extensions with type []byte
85
}
86

87
// An unmarshaler takes a stream of bytes and a pointer to a field of a message.
88
// It decodes the field, stores it at f, and returns the unused bytes.
89
// w is the wire encoding.
90
// b is the data after the tag and wire encoding have been read.
91
type unmarshaler func(b []byte, f pointer, w int) ([]byte, error)
92

93
type unmarshalFieldInfo struct {
94
	// location of the field in the proto message structure.
95
	field field
96

97
	// function to unmarshal the data for the field.
98
	unmarshal unmarshaler
99

100
	// if a required field, contains a single set bit at this field's index in the required field list.
101
	reqMask uint64
102

103
	name string // name of the field, for error reporting
104
}
105

106
var (
107
	unmarshalInfoMap  = map[reflect.Type]*unmarshalInfo{}
108
	unmarshalInfoLock sync.Mutex
109
)
110

111
// getUnmarshalInfo returns the data structure which can be
112
// subsequently used to unmarshal a message of the given type.
113
// t is the type of the message (note: not pointer to message).
114
func getUnmarshalInfo(t reflect.Type) *unmarshalInfo {
115
	// It would be correct to return a new unmarshalInfo
116
	// unconditionally. We would end up allocating one
117
	// per occurrence of that type as a message or submessage.
118
	// We use a cache here just to reduce memory usage.
119
	unmarshalInfoLock.Lock()
120
	defer unmarshalInfoLock.Unlock()
121
	u := unmarshalInfoMap[t]
122
	if u == nil {
123
		u = &unmarshalInfo{typ: t}
124
		// Note: we just set the type here. The rest of the fields
125
		// will be initialized on first use.
126
		unmarshalInfoMap[t] = u
127
	}
128
	return u
129
}
130

131
// unmarshal does the main work of unmarshaling a message.
132
// u provides type information used to unmarshal the message.
133
// m is a pointer to a protocol buffer message.
134
// b is a byte stream to unmarshal into m.
135
// This is top routine used when recursively unmarshaling submessages.
136
func (u *unmarshalInfo) unmarshal(m pointer, b []byte) error {
137
	if atomic.LoadInt32(&u.initialized) == 0 {
138
		u.computeUnmarshalInfo()
139
	}
140
	if u.isMessageSet {
141
		return unmarshalMessageSet(b, m.offset(u.extensions).toExtensions())
142
	}
143
	var reqMask uint64 // bitmask of required fields we've seen.
144
	var errLater error
145
	for len(b) > 0 {
146
		// Read tag and wire type.
147
		// Special case 1 and 2 byte varints.
148
		var x uint64
149
		if b[0] < 128 {
150
			x = uint64(b[0])
151
			b = b[1:]
152
		} else if len(b) >= 2 && b[1] < 128 {
153
			x = uint64(b[0]&0x7f) + uint64(b[1])<<7
154
			b = b[2:]
155
		} else {
156
			var n int
157
			x, n = decodeVarint(b)
158
			if n == 0 {
159
				return io.ErrUnexpectedEOF
160
			}
161
			b = b[n:]
162
		}
163
		tag := x >> 3
164
		wire := int(x) & 7
165

166
		// Dispatch on the tag to one of the unmarshal* functions below.
167
		var f unmarshalFieldInfo
168
		if tag < uint64(len(u.dense)) {
169
			f = u.dense[tag]
170
		} else {
171
			f = u.sparse[tag]
172
		}
173
		if fn := f.unmarshal; fn != nil {
174
			var err error
175
			b, err = fn(b, m.offset(f.field), wire)
176
			if err == nil {
177
				reqMask |= f.reqMask
178
				continue
179
			}
180
			if r, ok := err.(*RequiredNotSetError); ok {
181
				// Remember this error, but keep parsing. We need to produce
182
				// a full parse even if a required field is missing.
183
				if errLater == nil {
184
					errLater = r
185
				}
186
				reqMask |= f.reqMask
187
				continue
188
			}
189
			if err != errInternalBadWireType {
190
				if err == errInvalidUTF8 {
191
					if errLater == nil {
192
						fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name
193
						errLater = &invalidUTF8Error{fullName}
194
					}
195
					continue
196
				}
197
				return err
198
			}
199
			// Fragments with bad wire type are treated as unknown fields.
200
		}
201

202
		// Unknown tag.
203
		if !u.unrecognized.IsValid() {
204
			// Don't keep unrecognized data; just skip it.
205
			var err error
206
			b, err = skipField(b, wire)
207
			if err != nil {
208
				return err
209
			}
210
			continue
211
		}
212
		// Keep unrecognized data around.
213
		// maybe in extensions, maybe in the unrecognized field.
214
		z := m.offset(u.unrecognized).toBytes()
215
		var emap map[int32]Extension
216
		var e Extension
217
		for _, r := range u.extensionRanges {
218
			if uint64(r.Start) <= tag && tag <= uint64(r.End) {
219
				if u.extensions.IsValid() {
220
					mp := m.offset(u.extensions).toExtensions()
221
					emap = mp.extensionsWrite()
222
					e = emap[int32(tag)]
223
					z = &e.enc
224
					break
225
				}
226
				if u.oldExtensions.IsValid() {
227
					p := m.offset(u.oldExtensions).toOldExtensions()
228
					emap = *p
229
					if emap == nil {
230
						emap = map[int32]Extension{}
231
						*p = emap
232
					}
233
					e = emap[int32(tag)]
234
					z = &e.enc
235
					break
236
				}
237
				if u.bytesExtensions.IsValid() {
238
					z = m.offset(u.bytesExtensions).toBytes()
239
					break
240
				}
241
				panic("no extensions field available")
242
			}
243
		}
244
		// Use wire type to skip data.
245
		var err error
246
		b0 := b
247
		b, err = skipField(b, wire)
248
		if err != nil {
249
			return err
250
		}
251
		*z = encodeVarint(*z, tag<<3|uint64(wire))
252
		*z = append(*z, b0[:len(b0)-len(b)]...)
253

254
		if emap != nil {
255
			emap[int32(tag)] = e
256
		}
257
	}
258
	if reqMask != u.reqMask && errLater == nil {
259
		// A required field of this message is missing.
260
		for _, n := range u.reqFields {
261
			if reqMask&1 == 0 {
262
				errLater = &RequiredNotSetError{n}
263
			}
264
			reqMask >>= 1
265
		}
266
	}
267
	return errLater
268
}
269

270
// computeUnmarshalInfo fills in u with information for use
271
// in unmarshaling protocol buffers of type u.typ.
272
func (u *unmarshalInfo) computeUnmarshalInfo() {
273
	u.lock.Lock()
274
	defer u.lock.Unlock()
275
	if u.initialized != 0 {
276
		return
277
	}
278
	t := u.typ
279
	n := t.NumField()
280

281
	// Set up the "not found" value for the unrecognized byte buffer.
282
	// This is the default for proto3.
283
	u.unrecognized = invalidField
284
	u.extensions = invalidField
285
	u.oldExtensions = invalidField
286
	u.bytesExtensions = invalidField
287

288
	// List of the generated type and offset for each oneof field.
289
	type oneofField struct {
290
		ityp  reflect.Type // interface type of oneof field
291
		field field        // offset in containing message
292
	}
293
	var oneofFields []oneofField
294

295
	for i := 0; i < n; i++ {
296
		f := t.Field(i)
297
		if f.Name == "XXX_unrecognized" {
298
			// The byte slice used to hold unrecognized input is special.
299
			if f.Type != reflect.TypeOf(([]byte)(nil)) {
300
				panic("bad type for XXX_unrecognized field: " + f.Type.Name())
301
			}
302
			u.unrecognized = toField(&f)
303
			continue
304
		}
305
		if f.Name == "XXX_InternalExtensions" {
306
			// Ditto here.
307
			if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) {
308
				panic("bad type for XXX_InternalExtensions field: " + f.Type.Name())
309
			}
310
			u.extensions = toField(&f)
311
			if f.Tag.Get("protobuf_messageset") == "1" {
312
				u.isMessageSet = true
313
			}
314
			continue
315
		}
316
		if f.Name == "XXX_extensions" {
317
			// An older form of the extensions field.
318
			if f.Type == reflect.TypeOf((map[int32]Extension)(nil)) {
319
				u.oldExtensions = toField(&f)
320
				continue
321
			} else if f.Type == reflect.TypeOf(([]byte)(nil)) {
322
				u.bytesExtensions = toField(&f)
323
				continue
324
			}
325
			panic("bad type for XXX_extensions field: " + f.Type.Name())
326
		}
327
		if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" {
328
			continue
329
		}
330

331
		oneof := f.Tag.Get("protobuf_oneof")
332
		if oneof != "" {
333
			oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)})
334
			// The rest of oneof processing happens below.
335
			continue
336
		}
337

338
		tags := f.Tag.Get("protobuf")
339
		tagArray := strings.Split(tags, ",")
340
		if len(tagArray) < 2 {
341
			panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags)
342
		}
343
		tag, err := strconv.Atoi(tagArray[1])
344
		if err != nil {
345
			panic("protobuf tag field not an integer: " + tagArray[1])
346
		}
347

348
		name := ""
349
		for _, tag := range tagArray[3:] {
350
			if strings.HasPrefix(tag, "name=") {
351
				name = tag[5:]
352
			}
353
		}
354

355
		// Extract unmarshaling function from the field (its type and tags).
356
		unmarshal := fieldUnmarshaler(&f)
357

358
		// Required field?
359
		var reqMask uint64
360
		if tagArray[2] == "req" {
361
			bit := len(u.reqFields)
362
			u.reqFields = append(u.reqFields, name)
363
			reqMask = uint64(1) << uint(bit)
364
			// TODO: if we have more than 64 required fields, we end up
365
			// not verifying that all required fields are present.
366
			// Fix this, perhaps using a count of required fields?
367
		}
368

369
		// Store the info in the correct slot in the message.
370
		u.setTag(tag, toField(&f), unmarshal, reqMask, name)
371
	}
372

373
	// Find any types associated with oneof fields.
374
	// gogo: len(oneofFields) > 0 is needed for embedded oneof messages, without a marshaler and unmarshaler
375
	if len(oneofFields) > 0 {
376
		var oneofImplementers []interface{}
377
		switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) {
378
		case oneofFuncsIface:
379
			_, _, _, oneofImplementers = m.XXX_OneofFuncs()
380
		case oneofWrappersIface:
381
			oneofImplementers = m.XXX_OneofWrappers()
382
		}
383
		for _, v := range oneofImplementers {
384
			tptr := reflect.TypeOf(v) // *Msg_X
385
			typ := tptr.Elem()        // Msg_X
386

387
			f := typ.Field(0) // oneof implementers have one field
388
			baseUnmarshal := fieldUnmarshaler(&f)
389
			tags := strings.Split(f.Tag.Get("protobuf"), ",")
390
			fieldNum, err := strconv.Atoi(tags[1])
391
			if err != nil {
392
				panic("protobuf tag field not an integer: " + tags[1])
393
			}
394
			var name string
395
			for _, tag := range tags {
396
				if strings.HasPrefix(tag, "name=") {
397
					name = strings.TrimPrefix(tag, "name=")
398
					break
399
				}
400
			}
401

402
			// Find the oneof field that this struct implements.
403
			// Might take O(n^2) to process all of the oneofs, but who cares.
404
			for _, of := range oneofFields {
405
				if tptr.Implements(of.ityp) {
406
					// We have found the corresponding interface for this struct.
407
					// That lets us know where this struct should be stored
408
					// when we encounter it during unmarshaling.
409
					unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal)
410
					u.setTag(fieldNum, of.field, unmarshal, 0, name)
411
				}
412
			}
413

414
		}
415
	}
416

417
	// Get extension ranges, if any.
418
	fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray")
419
	if fn.IsValid() {
420
		if !u.extensions.IsValid() && !u.oldExtensions.IsValid() && !u.bytesExtensions.IsValid() {
421
			panic("a message with extensions, but no extensions field in " + t.Name())
422
		}
423
		u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange)
424
	}
425

426
	// Explicitly disallow tag 0. This will ensure we flag an error
427
	// when decoding a buffer of all zeros. Without this code, we
428
	// would decode and skip an all-zero buffer of even length.
429
	// [0 0] is [tag=0/wiretype=varint varint-encoded-0].
430
	u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) {
431
		return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w)
432
	}, 0, "")
433

434
	// Set mask for required field check.
435
	u.reqMask = uint64(1)<<uint(len(u.reqFields)) - 1
436

437
	atomic.StoreInt32(&u.initialized, 1)
438
}
439

440
// setTag stores the unmarshal information for the given tag.
441
// tag = tag # for field
442
// field/unmarshal = unmarshal info for that field.
443
// reqMask = if required, bitmask for field position in required field list. 0 otherwise.
444
// name = short name of the field.
445
func (u *unmarshalInfo) setTag(tag int, field field, unmarshal unmarshaler, reqMask uint64, name string) {
446
	i := unmarshalFieldInfo{field: field, unmarshal: unmarshal, reqMask: reqMask, name: name}
447
	n := u.typ.NumField()
448
	if tag >= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here?
449
		for len(u.dense) <= tag {
450
			u.dense = append(u.dense, unmarshalFieldInfo{})
451
		}
452
		u.dense[tag] = i
453
		return
454
	}
455
	if u.sparse == nil {
456
		u.sparse = map[uint64]unmarshalFieldInfo{}
457
	}
458
	u.sparse[uint64(tag)] = i
459
}
460

461
// fieldUnmarshaler returns an unmarshaler for the given field.
462
func fieldUnmarshaler(f *reflect.StructField) unmarshaler {
463
	if f.Type.Kind() == reflect.Map {
464
		return makeUnmarshalMap(f)
465
	}
466
	return typeUnmarshaler(f.Type, f.Tag.Get("protobuf"))
467
}
468

469
// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair.
470
func typeUnmarshaler(t reflect.Type, tags string) unmarshaler {
471
	tagArray := strings.Split(tags, ",")
472
	encoding := tagArray[0]
473
	name := "unknown"
474
	ctype := false
475
	isTime := false
476
	isDuration := false
477
	isWktPointer := false
478
	proto3 := false
479
	validateUTF8 := true
480
	for _, tag := range tagArray[3:] {
481
		if strings.HasPrefix(tag, "name=") {
482
			name = tag[5:]
483
		}
484
		if tag == "proto3" {
485
			proto3 = true
486
		}
487
		if strings.HasPrefix(tag, "customtype=") {
488
			ctype = true
489
		}
490
		if tag == "stdtime" {
491
			isTime = true
492
		}
493
		if tag == "stdduration" {
494
			isDuration = true
495
		}
496
		if tag == "wktptr" {
497
			isWktPointer = true
498
		}
499
	}
500
	validateUTF8 = validateUTF8 && proto3
501

502
	// Figure out packaging (pointer, slice, or both)
503
	slice := false
504
	pointer := false
505
	if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
506
		slice = true
507
		t = t.Elem()
508
	}
509
	if t.Kind() == reflect.Ptr {
510
		pointer = true
511
		t = t.Elem()
512
	}
513

514
	if ctype {
515
		if reflect.PtrTo(t).Implements(customType) {
516
			if slice {
517
				return makeUnmarshalCustomSlice(getUnmarshalInfo(t), name)
518
			}
519
			if pointer {
520
				return makeUnmarshalCustomPtr(getUnmarshalInfo(t), name)
521
			}
522
			return makeUnmarshalCustom(getUnmarshalInfo(t), name)
523
		} else {
524
			panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t))
525
		}
526
	}
527

528
	if isTime {
529
		if pointer {
530
			if slice {
531
				return makeUnmarshalTimePtrSlice(getUnmarshalInfo(t), name)
532
			}
533
			return makeUnmarshalTimePtr(getUnmarshalInfo(t), name)
534
		}
535
		if slice {
536
			return makeUnmarshalTimeSlice(getUnmarshalInfo(t), name)
537
		}
538
		return makeUnmarshalTime(getUnmarshalInfo(t), name)
539
	}
540

541
	if isDuration {
542
		if pointer {
543
			if slice {
544
				return makeUnmarshalDurationPtrSlice(getUnmarshalInfo(t), name)
545
			}
546
			return makeUnmarshalDurationPtr(getUnmarshalInfo(t), name)
547
		}
548
		if slice {
549
			return makeUnmarshalDurationSlice(getUnmarshalInfo(t), name)
550
		}
551
		return makeUnmarshalDuration(getUnmarshalInfo(t), name)
552
	}
553

554
	if isWktPointer {
555
		switch t.Kind() {
556
		case reflect.Float64:
557
			if pointer {
558
				if slice {
559
					return makeStdDoubleValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name)
560
				}
561
				return makeStdDoubleValuePtrUnmarshaler(getUnmarshalInfo(t), name)
562
			}
563
			if slice {
564
				return makeStdDoubleValueSliceUnmarshaler(getUnmarshalInfo(t), name)
565
			}
566
			return makeStdDoubleValueUnmarshaler(getUnmarshalInfo(t), name)
567
		case reflect.Float32:
568
			if pointer {
569
				if slice {
570
					return makeStdFloatValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name)
571
				}
572
				return makeStdFloatValuePtrUnmarshaler(getUnmarshalInfo(t), name)
573
			}
574
			if slice {
575
				return makeStdFloatValueSliceUnmarshaler(getUnmarshalInfo(t), name)
576
			}
577
			return makeStdFloatValueUnmarshaler(getUnmarshalInfo(t), name)
578
		case reflect.Int64:
579
			if pointer {
580
				if slice {
581
					return makeStdInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name)
582
				}
583
				return makeStdInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name)
584
			}
585
			if slice {
586
				return makeStdInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name)
587
			}
588
			return makeStdInt64ValueUnmarshaler(getUnmarshalInfo(t), name)
589
		case reflect.Uint64:
590
			if pointer {
591
				if slice {
592
					return makeStdUInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name)
593
				}
594
				return makeStdUInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name)
595
			}
596
			if slice {
597
				return makeStdUInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name)
598
			}
599
			return makeStdUInt64ValueUnmarshaler(getUnmarshalInfo(t), name)
600
		case reflect.Int32:
601
			if pointer {
602
				if slice {
603
					return makeStdInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name)
604
				}
605
				return makeStdInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name)
606
			}
607
			if slice {
608
				return makeStdInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name)
609
			}
610
			return makeStdInt32ValueUnmarshaler(getUnmarshalInfo(t), name)
611
		case reflect.Uint32:
612
			if pointer {
613
				if slice {
614
					return makeStdUInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name)
615
				}
616
				return makeStdUInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name)
617
			}
618
			if slice {
619
				return makeStdUInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name)
620
			}
621
			return makeStdUInt32ValueUnmarshaler(getUnmarshalInfo(t), name)
622
		case reflect.Bool:
623
			if pointer {
624
				if slice {
625
					return makeStdBoolValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name)
626
				}
627
				return makeStdBoolValuePtrUnmarshaler(getUnmarshalInfo(t), name)
628
			}
629
			if slice {
630
				return makeStdBoolValueSliceUnmarshaler(getUnmarshalInfo(t), name)
631
			}
632
			return makeStdBoolValueUnmarshaler(getUnmarshalInfo(t), name)
633
		case reflect.String:
634
			if pointer {
635
				if slice {
636
					return makeStdStringValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name)
637
				}
638
				return makeStdStringValuePtrUnmarshaler(getUnmarshalInfo(t), name)
639
			}
640
			if slice {
641
				return makeStdStringValueSliceUnmarshaler(getUnmarshalInfo(t), name)
642
			}
643
			return makeStdStringValueUnmarshaler(getUnmarshalInfo(t), name)
644
		case uint8SliceType:
645
			if pointer {
646
				if slice {
647
					return makeStdBytesValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name)
648
				}
649
				return makeStdBytesValuePtrUnmarshaler(getUnmarshalInfo(t), name)
650
			}
651
			if slice {
652
				return makeStdBytesValueSliceUnmarshaler(getUnmarshalInfo(t), name)
653
			}
654
			return makeStdBytesValueUnmarshaler(getUnmarshalInfo(t), name)
655
		default:
656
			panic(fmt.Sprintf("unknown wktpointer type %#v", t))
657
		}
658
	}
659

660
	// We'll never have both pointer and slice for basic types.
661
	if pointer && slice && t.Kind() != reflect.Struct {
662
		panic("both pointer and slice for basic type in " + t.Name())
663
	}
664

665
	switch t.Kind() {
666
	case reflect.Bool:
667
		if pointer {
668
			return unmarshalBoolPtr
669
		}
670
		if slice {
671
			return unmarshalBoolSlice
672
		}
673
		return unmarshalBoolValue
674
	case reflect.Int32:
675
		switch encoding {
676
		case "fixed32":
677
			if pointer {
678
				return unmarshalFixedS32Ptr
679
			}
680
			if slice {
681
				return unmarshalFixedS32Slice
682
			}
683
			return unmarshalFixedS32Value
684
		case "varint":
685
			// this could be int32 or enum
686
			if pointer {
687
				return unmarshalInt32Ptr
688
			}
689
			if slice {
690
				return unmarshalInt32Slice
691
			}
692
			return unmarshalInt32Value
693
		case "zigzag32":
694
			if pointer {
695
				return unmarshalSint32Ptr
696
			}
697
			if slice {
698
				return unmarshalSint32Slice
699
			}
700
			return unmarshalSint32Value
701
		}
702
	case reflect.Int64:
703
		switch encoding {
704
		case "fixed64":
705
			if pointer {
706
				return unmarshalFixedS64Ptr
707
			}
708
			if slice {
709
				return unmarshalFixedS64Slice
710
			}
711
			return unmarshalFixedS64Value
712
		case "varint":
713
			if pointer {
714
				return unmarshalInt64Ptr
715
			}
716
			if slice {
717
				return unmarshalInt64Slice
718
			}
719
			return unmarshalInt64Value
720
		case "zigzag64":
721
			if pointer {
722
				return unmarshalSint64Ptr
723
			}
724
			if slice {
725
				return unmarshalSint64Slice
726
			}
727
			return unmarshalSint64Value
728
		}
729
	case reflect.Uint32:
730
		switch encoding {
731
		case "fixed32":
732
			if pointer {
733
				return unmarshalFixed32Ptr
734
			}
735
			if slice {
736
				return unmarshalFixed32Slice
737
			}
738
			return unmarshalFixed32Value
739
		case "varint":
740
			if pointer {
741
				return unmarshalUint32Ptr
742
			}
743
			if slice {
744
				return unmarshalUint32Slice
745
			}
746
			return unmarshalUint32Value
747
		}
748
	case reflect.Uint64:
749
		switch encoding {
750
		case "fixed64":
751
			if pointer {
752
				return unmarshalFixed64Ptr
753
			}
754
			if slice {
755
				return unmarshalFixed64Slice
756
			}
757
			return unmarshalFixed64Value
758
		case "varint":
759
			if pointer {
760
				return unmarshalUint64Ptr
761
			}
762
			if slice {
763
				return unmarshalUint64Slice
764
			}
765
			return unmarshalUint64Value
766
		}
767
	case reflect.Float32:
768
		if pointer {
769
			return unmarshalFloat32Ptr
770
		}
771
		if slice {
772
			return unmarshalFloat32Slice
773
		}
774
		return unmarshalFloat32Value
775
	case reflect.Float64:
776
		if pointer {
777
			return unmarshalFloat64Ptr
778
		}
779
		if slice {
780
			return unmarshalFloat64Slice
781
		}
782
		return unmarshalFloat64Value
783
	case reflect.Map:
784
		panic("map type in typeUnmarshaler in " + t.Name())
785
	case reflect.Slice:
786
		if pointer {
787
			panic("bad pointer in slice case in " + t.Name())
788
		}
789
		if slice {
790
			return unmarshalBytesSlice
791
		}
792
		return unmarshalBytesValue
793
	case reflect.String:
794
		if validateUTF8 {
795
			if pointer {
796
				return unmarshalUTF8StringPtr
797
			}
798
			if slice {
799
				return unmarshalUTF8StringSlice
800
			}
801
			return unmarshalUTF8StringValue
802
		}
803
		if pointer {
804
			return unmarshalStringPtr
805
		}
806
		if slice {
807
			return unmarshalStringSlice
808
		}
809
		return unmarshalStringValue
810
	case reflect.Struct:
811
		// message or group field
812
		if !pointer {
813
			switch encoding {
814
			case "bytes":
815
				if slice {
816
					return makeUnmarshalMessageSlice(getUnmarshalInfo(t), name)
817
				}
818
				return makeUnmarshalMessage(getUnmarshalInfo(t), name)
819
			}
820
		}
821
		switch encoding {
822
		case "bytes":
823
			if slice {
824
				return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name)
825
			}
826
			return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name)
827
		case "group":
828
			if slice {
829
				return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name)
830
			}
831
			return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name)
832
		}
833
	}
834
	panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding))
835
}
836

837
// Below are all the unmarshalers for individual fields of various types.
838

839
func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) {
840
	if w != WireVarint {
841
		return b, errInternalBadWireType
842
	}
843
	x, n := decodeVarint(b)
844
	if n == 0 {
845
		return nil, io.ErrUnexpectedEOF
846
	}
847
	b = b[n:]
848
	v := int64(x)
849
	*f.toInt64() = v
850
	return b, nil
851
}
852

853
func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) {
854
	if w != WireVarint {
855
		return b, errInternalBadWireType
856
	}
857
	x, n := decodeVarint(b)
858
	if n == 0 {
859
		return nil, io.ErrUnexpectedEOF
860
	}
861
	b = b[n:]
862
	v := int64(x)
863
	*f.toInt64Ptr() = &v
864
	return b, nil
865
}
866

867
func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) {
868
	if w == WireBytes { // packed
869
		x, n := decodeVarint(b)
870
		if n == 0 {
871
			return nil, io.ErrUnexpectedEOF
872
		}
873
		b = b[n:]
874
		if x > uint64(len(b)) {
875
			return nil, io.ErrUnexpectedEOF
876
		}
877
		res := b[x:]
878
		b = b[:x]
879
		for len(b) > 0 {
880
			x, n = decodeVarint(b)
881
			if n == 0 {
882
				return nil, io.ErrUnexpectedEOF
883
			}
884
			b = b[n:]
885
			v := int64(x)
886
			s := f.toInt64Slice()
887
			*s = append(*s, v)
888
		}
889
		return res, nil
890
	}
891
	if w != WireVarint {
892
		return b, errInternalBadWireType
893
	}
894
	x, n := decodeVarint(b)
895
	if n == 0 {
896
		return nil, io.ErrUnexpectedEOF
897
	}
898
	b = b[n:]
899
	v := int64(x)
900
	s := f.toInt64Slice()
901
	*s = append(*s, v)
902
	return b, nil
903
}
904

905
func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) {
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 := int64(x>>1) ^ int64(x)<<63>>63
915
	*f.toInt64() = v
916
	return b, nil
917
}
918

919
func unmarshalSint64Ptr(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 := int64(x>>1) ^ int64(x)<<63>>63
929
	*f.toInt64Ptr() = &v
930
	return b, nil
931
}
932

933
func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) {
934
	if w == WireBytes { // packed
935
		x, n := decodeVarint(b)
936
		if n == 0 {
937
			return nil, io.ErrUnexpectedEOF
938
		}
939
		b = b[n:]
940
		if x > uint64(len(b)) {
941
			return nil, io.ErrUnexpectedEOF
942
		}
943
		res := b[x:]
944
		b = b[:x]
945
		for len(b) > 0 {
946
			x, n = decodeVarint(b)
947
			if n == 0 {
948
				return nil, io.ErrUnexpectedEOF
949
			}
950
			b = b[n:]
951
			v := int64(x>>1) ^ int64(x)<<63>>63
952
			s := f.toInt64Slice()
953
			*s = append(*s, v)
954
		}
955
		return res, nil
956
	}
957
	if w != WireVarint {
958
		return b, errInternalBadWireType
959
	}
960
	x, n := decodeVarint(b)
961
	if n == 0 {
962
		return nil, io.ErrUnexpectedEOF
963
	}
964
	b = b[n:]
965
	v := int64(x>>1) ^ int64(x)<<63>>63
966
	s := f.toInt64Slice()
967
	*s = append(*s, v)
968
	return b, nil
969
}
970

971
func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) {
972
	if w != WireVarint {
973
		return b, errInternalBadWireType
974
	}
975
	x, n := decodeVarint(b)
976
	if n == 0 {
977
		return nil, io.ErrUnexpectedEOF
978
	}
979
	b = b[n:]
980
	v := uint64(x)
981
	*f.toUint64() = v
982
	return b, nil
983
}
984

985
func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) {
986
	if w != WireVarint {
987
		return b, errInternalBadWireType
988
	}
989
	x, n := decodeVarint(b)
990
	if n == 0 {
991
		return nil, io.ErrUnexpectedEOF
992
	}
993
	b = b[n:]
994
	v := uint64(x)
995
	*f.toUint64Ptr() = &v
996
	return b, nil
997
}
998

999
func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) {
1000
	if w == WireBytes { // packed
1001
		x, n := decodeVarint(b)
1002
		if n == 0 {
1003
			return nil, io.ErrUnexpectedEOF
1004
		}
1005
		b = b[n:]
1006
		if x > uint64(len(b)) {
1007
			return nil, io.ErrUnexpectedEOF
1008
		}
1009
		res := b[x:]
1010
		b = b[:x]
1011
		for len(b) > 0 {
1012
			x, n = decodeVarint(b)
1013
			if n == 0 {
1014
				return nil, io.ErrUnexpectedEOF
1015
			}
1016
			b = b[n:]
1017
			v := uint64(x)
1018
			s := f.toUint64Slice()
1019
			*s = append(*s, v)
1020
		}
1021
		return res, nil
1022
	}
1023
	if w != WireVarint {
1024
		return b, errInternalBadWireType
1025
	}
1026
	x, n := decodeVarint(b)
1027
	if n == 0 {
1028
		return nil, io.ErrUnexpectedEOF
1029
	}
1030
	b = b[n:]
1031
	v := uint64(x)
1032
	s := f.toUint64Slice()
1033
	*s = append(*s, v)
1034
	return b, nil
1035
}
1036

1037
func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) {
1038
	if w != WireVarint {
1039
		return b, errInternalBadWireType
1040
	}
1041
	x, n := decodeVarint(b)
1042
	if n == 0 {
1043
		return nil, io.ErrUnexpectedEOF
1044
	}
1045
	b = b[n:]
1046
	v := int32(x)
1047
	*f.toInt32() = v
1048
	return b, nil
1049
}
1050

1051
func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) {
1052
	if w != WireVarint {
1053
		return b, errInternalBadWireType
1054
	}
1055
	x, n := decodeVarint(b)
1056
	if n == 0 {
1057
		return nil, io.ErrUnexpectedEOF
1058
	}
1059
	b = b[n:]
1060
	v := int32(x)
1061
	f.setInt32Ptr(v)
1062
	return b, nil
1063
}
1064

1065
func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) {
1066
	if w == WireBytes { // packed
1067
		x, n := decodeVarint(b)
1068
		if n == 0 {
1069
			return nil, io.ErrUnexpectedEOF
1070
		}
1071
		b = b[n:]
1072
		if x > uint64(len(b)) {
1073
			return nil, io.ErrUnexpectedEOF
1074
		}
1075
		res := b[x:]
1076
		b = b[:x]
1077
		for len(b) > 0 {
1078
			x, n = decodeVarint(b)
1079
			if n == 0 {
1080
				return nil, io.ErrUnexpectedEOF
1081
			}
1082
			b = b[n:]
1083
			v := int32(x)
1084
			f.appendInt32Slice(v)
1085
		}
1086
		return res, nil
1087
	}
1088
	if w != WireVarint {
1089
		return b, errInternalBadWireType
1090
	}
1091
	x, n := decodeVarint(b)
1092
	if n == 0 {
1093
		return nil, io.ErrUnexpectedEOF
1094
	}
1095
	b = b[n:]
1096
	v := int32(x)
1097
	f.appendInt32Slice(v)
1098
	return b, nil
1099
}
1100

1101
func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) {
1102
	if w != WireVarint {
1103
		return b, errInternalBadWireType
1104
	}
1105
	x, n := decodeVarint(b)
1106
	if n == 0 {
1107
		return nil, io.ErrUnexpectedEOF
1108
	}
1109
	b = b[n:]
1110
	v := int32(x>>1) ^ int32(x)<<31>>31
1111
	*f.toInt32() = v
1112
	return b, nil
1113
}
1114

1115
func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) {
1116
	if w != WireVarint {
1117
		return b, errInternalBadWireType
1118
	}
1119
	x, n := decodeVarint(b)
1120
	if n == 0 {
1121
		return nil, io.ErrUnexpectedEOF
1122
	}
1123
	b = b[n:]
1124
	v := int32(x>>1) ^ int32(x)<<31>>31
1125
	f.setInt32Ptr(v)
1126
	return b, nil
1127
}
1128

1129
func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) {
1130
	if w == WireBytes { // packed
1131
		x, n := decodeVarint(b)
1132
		if n == 0 {
1133
			return nil, io.ErrUnexpectedEOF
1134
		}
1135
		b = b[n:]
1136
		if x > uint64(len(b)) {
1137
			return nil, io.ErrUnexpectedEOF
1138
		}
1139
		res := b[x:]
1140
		b = b[:x]
1141
		for len(b) > 0 {
1142
			x, n = decodeVarint(b)
1143
			if n == 0 {
1144
				return nil, io.ErrUnexpectedEOF
1145
			}
1146
			b = b[n:]
1147
			v := int32(x>>1) ^ int32(x)<<31>>31
1148
			f.appendInt32Slice(v)
1149
		}
1150
		return res, nil
1151
	}
1152
	if w != WireVarint {
1153
		return b, errInternalBadWireType
1154
	}
1155
	x, n := decodeVarint(b)
1156
	if n == 0 {
1157
		return nil, io.ErrUnexpectedEOF
1158
	}
1159
	b = b[n:]
1160
	v := int32(x>>1) ^ int32(x)<<31>>31
1161
	f.appendInt32Slice(v)
1162
	return b, nil
1163
}
1164

1165
func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) {
1166
	if w != WireVarint {
1167
		return b, errInternalBadWireType
1168
	}
1169
	x, n := decodeVarint(b)
1170
	if n == 0 {
1171
		return nil, io.ErrUnexpectedEOF
1172
	}
1173
	b = b[n:]
1174
	v := uint32(x)
1175
	*f.toUint32() = v
1176
	return b, nil
1177
}
1178

1179
func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) {
1180
	if w != WireVarint {
1181
		return b, errInternalBadWireType
1182
	}
1183
	x, n := decodeVarint(b)
1184
	if n == 0 {
1185
		return nil, io.ErrUnexpectedEOF
1186
	}
1187
	b = b[n:]
1188
	v := uint32(x)
1189
	*f.toUint32Ptr() = &v
1190
	return b, nil
1191
}
1192

1193
func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) {
1194
	if w == WireBytes { // packed
1195
		x, n := decodeVarint(b)
1196
		if n == 0 {
1197
			return nil, io.ErrUnexpectedEOF
1198
		}
1199
		b = b[n:]
1200
		if x > uint64(len(b)) {
1201
			return nil, io.ErrUnexpectedEOF
1202
		}
1203
		res := b[x:]
1204
		b = b[:x]
1205
		for len(b) > 0 {
1206
			x, n = decodeVarint(b)
1207
			if n == 0 {
1208
				return nil, io.ErrUnexpectedEOF
1209
			}
1210
			b = b[n:]
1211
			v := uint32(x)
1212
			s := f.toUint32Slice()
1213
			*s = append(*s, v)
1214
		}
1215
		return res, nil
1216
	}
1217
	if w != WireVarint {
1218
		return b, errInternalBadWireType
1219
	}
1220
	x, n := decodeVarint(b)
1221
	if n == 0 {
1222
		return nil, io.ErrUnexpectedEOF
1223
	}
1224
	b = b[n:]
1225
	v := uint32(x)
1226
	s := f.toUint32Slice()
1227
	*s = append(*s, v)
1228
	return b, nil
1229
}
1230

1231
func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) {
1232
	if w != WireFixed64 {
1233
		return b, errInternalBadWireType
1234
	}
1235
	if len(b) < 8 {
1236
		return nil, io.ErrUnexpectedEOF
1237
	}
1238
	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
1239
	*f.toUint64() = v
1240
	return b[8:], nil
1241
}
1242

1243
func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) {
1244
	if w != WireFixed64 {
1245
		return b, errInternalBadWireType
1246
	}
1247
	if len(b) < 8 {
1248
		return nil, io.ErrUnexpectedEOF
1249
	}
1250
	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
1251
	*f.toUint64Ptr() = &v
1252
	return b[8:], nil
1253
}
1254

1255
func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) {
1256
	if w == WireBytes { // packed
1257
		x, n := decodeVarint(b)
1258
		if n == 0 {
1259
			return nil, io.ErrUnexpectedEOF
1260
		}
1261
		b = b[n:]
1262
		if x > uint64(len(b)) {
1263
			return nil, io.ErrUnexpectedEOF
1264
		}
1265
		res := b[x:]
1266
		b = b[:x]
1267
		for len(b) > 0 {
1268
			if len(b) < 8 {
1269
				return nil, io.ErrUnexpectedEOF
1270
			}
1271
			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
1272
			s := f.toUint64Slice()
1273
			*s = append(*s, v)
1274
			b = b[8:]
1275
		}
1276
		return res, nil
1277
	}
1278
	if w != WireFixed64 {
1279
		return b, errInternalBadWireType
1280
	}
1281
	if len(b) < 8 {
1282
		return nil, io.ErrUnexpectedEOF
1283
	}
1284
	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
1285
	s := f.toUint64Slice()
1286
	*s = append(*s, v)
1287
	return b[8:], nil
1288
}
1289

1290
func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) {
1291
	if w != WireFixed64 {
1292
		return b, errInternalBadWireType
1293
	}
1294
	if len(b) < 8 {
1295
		return nil, io.ErrUnexpectedEOF
1296
	}
1297
	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
1298
	*f.toInt64() = v
1299
	return b[8:], nil
1300
}
1301

1302
func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) {
1303
	if w != WireFixed64 {
1304
		return b, errInternalBadWireType
1305
	}
1306
	if len(b) < 8 {
1307
		return nil, io.ErrUnexpectedEOF
1308
	}
1309
	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
1310
	*f.toInt64Ptr() = &v
1311
	return b[8:], nil
1312
}
1313

1314
func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) {
1315
	if w == WireBytes { // packed
1316
		x, n := decodeVarint(b)
1317
		if n == 0 {
1318
			return nil, io.ErrUnexpectedEOF
1319
		}
1320
		b = b[n:]
1321
		if x > uint64(len(b)) {
1322
			return nil, io.ErrUnexpectedEOF
1323
		}
1324
		res := b[x:]
1325
		b = b[:x]
1326
		for len(b) > 0 {
1327
			if len(b) < 8 {
1328
				return nil, io.ErrUnexpectedEOF
1329
			}
1330
			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
1331
			s := f.toInt64Slice()
1332
			*s = append(*s, v)
1333
			b = b[8:]
1334
		}
1335
		return res, nil
1336
	}
1337
	if w != WireFixed64 {
1338
		return b, errInternalBadWireType
1339
	}
1340
	if len(b) < 8 {
1341
		return nil, io.ErrUnexpectedEOF
1342
	}
1343
	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
1344
	s := f.toInt64Slice()
1345
	*s = append(*s, v)
1346
	return b[8:], nil
1347
}
1348

1349
func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) {
1350
	if w != WireFixed32 {
1351
		return b, errInternalBadWireType
1352
	}
1353
	if len(b) < 4 {
1354
		return nil, io.ErrUnexpectedEOF
1355
	}
1356
	v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
1357
	*f.toUint32() = v
1358
	return b[4:], nil
1359
}
1360

1361
func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) {
1362
	if w != WireFixed32 {
1363
		return b, errInternalBadWireType
1364
	}
1365
	if len(b) < 4 {
1366
		return nil, io.ErrUnexpectedEOF
1367
	}
1368
	v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
1369
	*f.toUint32Ptr() = &v
1370
	return b[4:], nil
1371
}
1372

1373
func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) {
1374
	if w == WireBytes { // packed
1375
		x, n := decodeVarint(b)
1376
		if n == 0 {
1377
			return nil, io.ErrUnexpectedEOF
1378
		}
1379
		b = b[n:]
1380
		if x > uint64(len(b)) {
1381
			return nil, io.ErrUnexpectedEOF
1382
		}
1383
		res := b[x:]
1384
		b = b[:x]
1385
		for len(b) > 0 {
1386
			if len(b) < 4 {
1387
				return nil, io.ErrUnexpectedEOF
1388
			}
1389
			v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
1390
			s := f.toUint32Slice()
1391
			*s = append(*s, v)
1392
			b = b[4:]
1393
		}
1394
		return res, nil
1395
	}
1396
	if w != WireFixed32 {
1397
		return b, errInternalBadWireType
1398
	}
1399
	if len(b) < 4 {
1400
		return nil, io.ErrUnexpectedEOF
1401
	}
1402
	v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
1403
	s := f.toUint32Slice()
1404
	*s = append(*s, v)
1405
	return b[4:], nil
1406
}
1407

1408
func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) {
1409
	if w != WireFixed32 {
1410
		return b, errInternalBadWireType
1411
	}
1412
	if len(b) < 4 {
1413
		return nil, io.ErrUnexpectedEOF
1414
	}
1415
	v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24
1416
	*f.toInt32() = v
1417
	return b[4:], nil
1418
}
1419

1420
func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) {
1421
	if w != WireFixed32 {
1422
		return b, errInternalBadWireType
1423
	}
1424
	if len(b) < 4 {
1425
		return nil, io.ErrUnexpectedEOF
1426
	}
1427
	v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24
1428
	f.setInt32Ptr(v)
1429
	return b[4:], nil
1430
}
1431

1432
func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) {
1433
	if w == WireBytes { // packed
1434
		x, n := decodeVarint(b)
1435
		if n == 0 {
1436
			return nil, io.ErrUnexpectedEOF
1437
		}
1438
		b = b[n:]
1439
		if x > uint64(len(b)) {
1440
			return nil, io.ErrUnexpectedEOF
1441
		}
1442
		res := b[x:]
1443
		b = b[:x]
1444
		for len(b) > 0 {
1445
			if len(b) < 4 {
1446
				return nil, io.ErrUnexpectedEOF
1447
			}
1448
			v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24
1449
			f.appendInt32Slice(v)
1450
			b = b[4:]
1451
		}
1452
		return res, nil
1453
	}
1454
	if w != WireFixed32 {
1455
		return b, errInternalBadWireType
1456
	}
1457
	if len(b) < 4 {
1458
		return nil, io.ErrUnexpectedEOF
1459
	}
1460
	v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24
1461
	f.appendInt32Slice(v)
1462
	return b[4:], nil
1463
}
1464

1465
func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) {
1466
	if w != WireVarint {
1467
		return b, errInternalBadWireType
1468
	}
1469
	// Note: any length varint is allowed, even though any sane
1470
	// encoder will use one byte.
1471
	// See https://github.com/golang/protobuf/issues/76
1472
	x, n := decodeVarint(b)
1473
	if n == 0 {
1474
		return nil, io.ErrUnexpectedEOF
1475
	}
1476
	// TODO: check if x>1? Tests seem to indicate no.
1477
	v := x != 0
1478
	*f.toBool() = v
1479
	return b[n:], nil
1480
}
1481

1482
func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) {
1483
	if w != WireVarint {
1484
		return b, errInternalBadWireType
1485
	}
1486
	x, n := decodeVarint(b)
1487
	if n == 0 {
1488
		return nil, io.ErrUnexpectedEOF
1489
	}
1490
	v := x != 0
1491
	*f.toBoolPtr() = &v
1492
	return b[n:], nil
1493
}
1494

1495
func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) {
1496
	if w == WireBytes { // packed
1497
		x, n := decodeVarint(b)
1498
		if n == 0 {
1499
			return nil, io.ErrUnexpectedEOF
1500
		}
1501
		b = b[n:]
1502
		if x > uint64(len(b)) {
1503
			return nil, io.ErrUnexpectedEOF
1504
		}
1505
		res := b[x:]
1506
		b = b[:x]
1507
		for len(b) > 0 {
1508
			x, n = decodeVarint(b)
1509
			if n == 0 {
1510
				return nil, io.ErrUnexpectedEOF
1511
			}
1512
			v := x != 0
1513
			s := f.toBoolSlice()
1514
			*s = append(*s, v)
1515
			b = b[n:]
1516
		}
1517
		return res, nil
1518
	}
1519
	if w != WireVarint {
1520
		return b, errInternalBadWireType
1521
	}
1522
	x, n := decodeVarint(b)
1523
	if n == 0 {
1524
		return nil, io.ErrUnexpectedEOF
1525
	}
1526
	v := x != 0
1527
	s := f.toBoolSlice()
1528
	*s = append(*s, v)
1529
	return b[n:], nil
1530
}
1531

1532
func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) {
1533
	if w != WireFixed64 {
1534
		return b, errInternalBadWireType
1535
	}
1536
	if len(b) < 8 {
1537
		return nil, io.ErrUnexpectedEOF
1538
	}
1539
	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)
1540
	*f.toFloat64() = v
1541
	return b[8:], nil
1542
}
1543

1544
func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) {
1545
	if w != WireFixed64 {
1546
		return b, errInternalBadWireType
1547
	}
1548
	if len(b) < 8 {
1549
		return nil, io.ErrUnexpectedEOF
1550
	}
1551
	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)
1552
	*f.toFloat64Ptr() = &v
1553
	return b[8:], nil
1554
}
1555

1556
func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) {
1557
	if w == WireBytes { // packed
1558
		x, n := decodeVarint(b)
1559
		if n == 0 {
1560
			return nil, io.ErrUnexpectedEOF
1561
		}
1562
		b = b[n:]
1563
		if x > uint64(len(b)) {
1564
			return nil, io.ErrUnexpectedEOF
1565
		}
1566
		res := b[x:]
1567
		b = b[:x]
1568
		for len(b) > 0 {
1569
			if len(b) < 8 {
1570
				return nil, io.ErrUnexpectedEOF
1571
			}
1572
			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)
1573
			s := f.toFloat64Slice()
1574
			*s = append(*s, v)
1575
			b = b[8:]
1576
		}
1577
		return res, nil
1578
	}
1579
	if w != WireFixed64 {
1580
		return b, errInternalBadWireType
1581
	}
1582
	if len(b) < 8 {
1583
		return nil, io.ErrUnexpectedEOF
1584
	}
1585
	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)
1586
	s := f.toFloat64Slice()
1587
	*s = append(*s, v)
1588
	return b[8:], nil
1589
}
1590

1591
func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) {
1592
	if w != WireFixed32 {
1593
		return b, errInternalBadWireType
1594
	}
1595
	if len(b) < 4 {
1596
		return nil, io.ErrUnexpectedEOF
1597
	}
1598
	v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24)
1599
	*f.toFloat32() = v
1600
	return b[4:], nil
1601
}
1602

1603
func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) {
1604
	if w != WireFixed32 {
1605
		return b, errInternalBadWireType
1606
	}
1607
	if len(b) < 4 {
1608
		return nil, io.ErrUnexpectedEOF
1609
	}
1610
	v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24)
1611
	*f.toFloat32Ptr() = &v
1612
	return b[4:], nil
1613
}
1614

1615
func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) {
1616
	if w == WireBytes { // packed
1617
		x, n := decodeVarint(b)
1618
		if n == 0 {
1619
			return nil, io.ErrUnexpectedEOF
1620
		}
1621
		b = b[n:]
1622
		if x > uint64(len(b)) {
1623
			return nil, io.ErrUnexpectedEOF
1624
		}
1625
		res := b[x:]
1626
		b = b[:x]
1627
		for len(b) > 0 {
1628
			if len(b) < 4 {
1629
				return nil, io.ErrUnexpectedEOF
1630
			}
1631
			v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24)
1632
			s := f.toFloat32Slice()
1633
			*s = append(*s, v)
1634
			b = b[4:]
1635
		}
1636
		return res, nil
1637
	}
1638
	if w != WireFixed32 {
1639
		return b, errInternalBadWireType
1640
	}
1641
	if len(b) < 4 {
1642
		return nil, io.ErrUnexpectedEOF
1643
	}
1644
	v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24)
1645
	s := f.toFloat32Slice()
1646
	*s = append(*s, v)
1647
	return b[4:], nil
1648
}
1649

1650
func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) {
1651
	if w != WireBytes {
1652
		return b, errInternalBadWireType
1653
	}
1654
	x, n := decodeVarint(b)
1655
	if n == 0 {
1656
		return nil, io.ErrUnexpectedEOF
1657
	}
1658
	b = b[n:]
1659
	if x > uint64(len(b)) {
1660
		return nil, io.ErrUnexpectedEOF
1661
	}
1662
	v := string(b[:x])
1663
	*f.toString() = v
1664
	return b[x:], nil
1665
}
1666

1667
func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) {
1668
	if w != WireBytes {
1669
		return b, errInternalBadWireType
1670
	}
1671
	x, n := decodeVarint(b)
1672
	if n == 0 {
1673
		return nil, io.ErrUnexpectedEOF
1674
	}
1675
	b = b[n:]
1676
	if x > uint64(len(b)) {
1677
		return nil, io.ErrUnexpectedEOF
1678
	}
1679
	v := string(b[:x])
1680
	*f.toStringPtr() = &v
1681
	return b[x:], nil
1682
}
1683

1684
func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) {
1685
	if w != WireBytes {
1686
		return b, errInternalBadWireType
1687
	}
1688
	x, n := decodeVarint(b)
1689
	if n == 0 {
1690
		return nil, io.ErrUnexpectedEOF
1691
	}
1692
	b = b[n:]
1693
	if x > uint64(len(b)) {
1694
		return nil, io.ErrUnexpectedEOF
1695
	}
1696
	v := string(b[:x])
1697
	s := f.toStringSlice()
1698
	*s = append(*s, v)
1699
	return b[x:], nil
1700
}
1701

1702
func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) {
1703
	if w != WireBytes {
1704
		return b, errInternalBadWireType
1705
	}
1706
	x, n := decodeVarint(b)
1707
	if n == 0 {
1708
		return nil, io.ErrUnexpectedEOF
1709
	}
1710
	b = b[n:]
1711
	if x > uint64(len(b)) {
1712
		return nil, io.ErrUnexpectedEOF
1713
	}
1714
	v := string(b[:x])
1715
	*f.toString() = v
1716
	if !utf8.ValidString(v) {
1717
		return b[x:], errInvalidUTF8
1718
	}
1719
	return b[x:], nil
1720
}
1721

1722
func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) {
1723
	if w != WireBytes {
1724
		return b, errInternalBadWireType
1725
	}
1726
	x, n := decodeVarint(b)
1727
	if n == 0 {
1728
		return nil, io.ErrUnexpectedEOF
1729
	}
1730
	b = b[n:]
1731
	if x > uint64(len(b)) {
1732
		return nil, io.ErrUnexpectedEOF
1733
	}
1734
	v := string(b[:x])
1735
	*f.toStringPtr() = &v
1736
	if !utf8.ValidString(v) {
1737
		return b[x:], errInvalidUTF8
1738
	}
1739
	return b[x:], nil
1740
}
1741

1742
func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) {
1743
	if w != WireBytes {
1744
		return b, errInternalBadWireType
1745
	}
1746
	x, n := decodeVarint(b)
1747
	if n == 0 {
1748
		return nil, io.ErrUnexpectedEOF
1749
	}
1750
	b = b[n:]
1751
	if x > uint64(len(b)) {
1752
		return nil, io.ErrUnexpectedEOF
1753
	}
1754
	v := string(b[:x])
1755
	s := f.toStringSlice()
1756
	*s = append(*s, v)
1757
	if !utf8.ValidString(v) {
1758
		return b[x:], errInvalidUTF8
1759
	}
1760
	return b[x:], nil
1761
}
1762

1763
var emptyBuf [0]byte
1764

1765
func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) {
1766
	if w != WireBytes {
1767
		return b, errInternalBadWireType
1768
	}
1769
	x, n := decodeVarint(b)
1770
	if n == 0 {
1771
		return nil, io.ErrUnexpectedEOF
1772
	}
1773
	b = b[n:]
1774
	if x > uint64(len(b)) {
1775
		return nil, io.ErrUnexpectedEOF
1776
	}
1777
	// The use of append here is a trick which avoids the zeroing
1778
	// that would be required if we used a make/copy pair.
1779
	// We append to emptyBuf instead of nil because we want
1780
	// a non-nil result even when the length is 0.
1781
	v := append(emptyBuf[:], b[:x]...)
1782
	*f.toBytes() = v
1783
	return b[x:], nil
1784
}
1785

1786
func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) {
1787
	if w != WireBytes {
1788
		return b, errInternalBadWireType
1789
	}
1790
	x, n := decodeVarint(b)
1791
	if n == 0 {
1792
		return nil, io.ErrUnexpectedEOF
1793
	}
1794
	b = b[n:]
1795
	if x > uint64(len(b)) {
1796
		return nil, io.ErrUnexpectedEOF
1797
	}
1798
	v := append(emptyBuf[:], b[:x]...)
1799
	s := f.toBytesSlice()
1800
	*s = append(*s, v)
1801
	return b[x:], nil
1802
}
1803

1804
func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler {
1805
	return func(b []byte, f pointer, w int) ([]byte, error) {
1806
		if w != WireBytes {
1807
			return b, errInternalBadWireType
1808
		}
1809
		x, n := decodeVarint(b)
1810
		if n == 0 {
1811
			return nil, io.ErrUnexpectedEOF
1812
		}
1813
		b = b[n:]
1814
		if x > uint64(len(b)) {
1815
			return nil, io.ErrUnexpectedEOF
1816
		}
1817
		// First read the message field to see if something is there.
1818
		// The semantics of multiple submessages are weird.  Instead of
1819
		// the last one winning (as it is for all other fields), multiple
1820
		// submessages are merged.
1821
		v := f.getPointer()
1822
		if v.isNil() {
1823
			v = valToPointer(reflect.New(sub.typ))
1824
			f.setPointer(v)
1825
		}
1826
		err := sub.unmarshal(v, b[:x])
1827
		if err != nil {
1828
			if r, ok := err.(*RequiredNotSetError); ok {
1829
				r.field = name + "." + r.field
1830
			} else {
1831
				return nil, err
1832
			}
1833
		}
1834
		return b[x:], err
1835
	}
1836
}
1837

1838
func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler {
1839
	return func(b []byte, f pointer, w int) ([]byte, error) {
1840
		if w != WireBytes {
1841
			return b, errInternalBadWireType
1842
		}
1843
		x, n := decodeVarint(b)
1844
		if n == 0 {
1845
			return nil, io.ErrUnexpectedEOF
1846
		}
1847
		b = b[n:]
1848
		if x > uint64(len(b)) {
1849
			return nil, io.ErrUnexpectedEOF
1850
		}
1851
		v := valToPointer(reflect.New(sub.typ))
1852
		err := sub.unmarshal(v, b[:x])
1853
		if err != nil {
1854
			if r, ok := err.(*RequiredNotSetError); ok {
1855
				r.field = name + "." + r.field
1856
			} else {
1857
				return nil, err
1858
			}
1859
		}
1860
		f.appendPointer(v)
1861
		return b[x:], err
1862
	}
1863
}
1864

1865
func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler {
1866
	return func(b []byte, f pointer, w int) ([]byte, error) {
1867
		if w != WireStartGroup {
1868
			return b, errInternalBadWireType
1869
		}
1870
		x, y := findEndGroup(b)
1871
		if x < 0 {
1872
			return nil, io.ErrUnexpectedEOF
1873
		}
1874
		v := f.getPointer()
1875
		if v.isNil() {
1876
			v = valToPointer(reflect.New(sub.typ))
1877
			f.setPointer(v)
1878
		}
1879
		err := sub.unmarshal(v, b[:x])
1880
		if err != nil {
1881
			if r, ok := err.(*RequiredNotSetError); ok {
1882
				r.field = name + "." + r.field
1883
			} else {
1884
				return nil, err
1885
			}
1886
		}
1887
		return b[y:], err
1888
	}
1889
}
1890

1891
func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler {
1892
	return func(b []byte, f pointer, w int) ([]byte, error) {
1893
		if w != WireStartGroup {
1894
			return b, errInternalBadWireType
1895
		}
1896
		x, y := findEndGroup(b)
1897
		if x < 0 {
1898
			return nil, io.ErrUnexpectedEOF
1899
		}
1900
		v := valToPointer(reflect.New(sub.typ))
1901
		err := sub.unmarshal(v, b[:x])
1902
		if err != nil {
1903
			if r, ok := err.(*RequiredNotSetError); ok {
1904
				r.field = name + "." + r.field
1905
			} else {
1906
				return nil, err
1907
			}
1908
		}
1909
		f.appendPointer(v)
1910
		return b[y:], err
1911
	}
1912
}
1913

1914
func makeUnmarshalMap(f *reflect.StructField) unmarshaler {
1915
	t := f.Type
1916
	kt := t.Key()
1917
	vt := t.Elem()
1918
	tagArray := strings.Split(f.Tag.Get("protobuf"), ",")
1919
	valTags := strings.Split(f.Tag.Get("protobuf_val"), ",")
1920
	for _, t := range tagArray {
1921
		if strings.HasPrefix(t, "customtype=") {
1922
			valTags = append(valTags, t)
1923
		}
1924
		if t == "stdtime" {
1925
			valTags = append(valTags, t)
1926
		}
1927
		if t == "stdduration" {
1928
			valTags = append(valTags, t)
1929
		}
1930
		if t == "wktptr" {
1931
			valTags = append(valTags, t)
1932
		}
1933
	}
1934
	unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key"))
1935
	unmarshalVal := typeUnmarshaler(vt, strings.Join(valTags, ","))
1936
	return func(b []byte, f pointer, w int) ([]byte, error) {
1937
		// The map entry is a submessage. Figure out how big it is.
1938
		if w != WireBytes {
1939
			return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes)
1940
		}
1941
		x, n := decodeVarint(b)
1942
		if n == 0 {
1943
			return nil, io.ErrUnexpectedEOF
1944
		}
1945
		b = b[n:]
1946
		if x > uint64(len(b)) {
1947
			return nil, io.ErrUnexpectedEOF
1948
		}
1949
		r := b[x:] // unused data to return
1950
		b = b[:x]  // data for map entry
1951

1952
		// Note: we could use #keys * #values ~= 200 functions
1953
		// to do map decoding without reflection. Probably not worth it.
1954
		// Maps will be somewhat slow. Oh well.
1955

1956
		// Read key and value from data.
1957
		var nerr nonFatal
1958
		k := reflect.New(kt)
1959
		v := reflect.New(vt)
1960
		for len(b) > 0 {
1961
			x, n := decodeVarint(b)
1962
			if n == 0 {
1963
				return nil, io.ErrUnexpectedEOF
1964
			}
1965
			wire := int(x) & 7
1966
			b = b[n:]
1967

1968
			var err error
1969
			switch x >> 3 {
1970
			case 1:
1971
				b, err = unmarshalKey(b, valToPointer(k), wire)
1972
			case 2:
1973
				b, err = unmarshalVal(b, valToPointer(v), wire)
1974
			default:
1975
				err = errInternalBadWireType // skip unknown tag
1976
			}
1977

1978
			if nerr.Merge(err) {
1979
				continue
1980
			}
1981
			if err != errInternalBadWireType {
1982
				return nil, err
1983
			}
1984

1985
			// Skip past unknown fields.
1986
			b, err = skipField(b, wire)
1987
			if err != nil {
1988
				return nil, err
1989
			}
1990
		}
1991

1992
		// Get map, allocate if needed.
1993
		m := f.asPointerTo(t).Elem() // an addressable map[K]T
1994
		if m.IsNil() {
1995
			m.Set(reflect.MakeMap(t))
1996
		}
1997

1998
		// Insert into map.
1999
		m.SetMapIndex(k.Elem(), v.Elem())
2000

2001
		return r, nerr.E
2002
	}
2003
}
2004

2005
// makeUnmarshalOneof makes an unmarshaler for oneof fields.
2006
// for:
2007
// message Msg {
2008
//   oneof F {
2009
//     int64 X = 1;
2010
//     float64 Y = 2;
2011
//   }
2012
// }
2013
// typ is the type of the concrete entry for a oneof case (e.g. Msg_X).
2014
// ityp is the interface type of the oneof field (e.g. isMsg_F).
2015
// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64).
2016
// Note that this function will be called once for each case in the oneof.
2017
func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler {
2018
	sf := typ.Field(0)
2019
	field0 := toField(&sf)
2020
	return func(b []byte, f pointer, w int) ([]byte, error) {
2021
		// Allocate holder for value.
2022
		v := reflect.New(typ)
2023

2024
		// Unmarshal data into holder.
2025
		// We unmarshal into the first field of the holder object.
2026
		var err error
2027
		var nerr nonFatal
2028
		b, err = unmarshal(b, valToPointer(v).offset(field0), w)
2029
		if !nerr.Merge(err) {
2030
			return nil, err
2031
		}
2032

2033
		// Write pointer to holder into target field.
2034
		f.asPointerTo(ityp).Elem().Set(v)
2035

2036
		return b, nerr.E
2037
	}
2038
}
2039

2040
// Error used by decode internally.
2041
var errInternalBadWireType = errors.New("proto: internal error: bad wiretype")
2042

2043
// skipField skips past a field of type wire and returns the remaining bytes.
2044
func skipField(b []byte, wire int) ([]byte, error) {
2045
	switch wire {
2046
	case WireVarint:
2047
		_, k := decodeVarint(b)
2048
		if k == 0 {
2049
			return b, io.ErrUnexpectedEOF
2050
		}
2051
		b = b[k:]
2052
	case WireFixed32:
2053
		if len(b) < 4 {
2054
			return b, io.ErrUnexpectedEOF
2055
		}
2056
		b = b[4:]
2057
	case WireFixed64:
2058
		if len(b) < 8 {
2059
			return b, io.ErrUnexpectedEOF
2060
		}
2061
		b = b[8:]
2062
	case WireBytes:
2063
		m, k := decodeVarint(b)
2064
		if k == 0 || uint64(len(b)-k) < m {
2065
			return b, io.ErrUnexpectedEOF
2066
		}
2067
		b = b[uint64(k)+m:]
2068
	case WireStartGroup:
2069
		_, i := findEndGroup(b)
2070
		if i == -1 {
2071
			return b, io.ErrUnexpectedEOF
2072
		}
2073
		b = b[i:]
2074
	default:
2075
		return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire)
2076
	}
2077
	return b, nil
2078
}
2079

2080
// findEndGroup finds the index of the next EndGroup tag.
2081
// Groups may be nested, so the "next" EndGroup tag is the first
2082
// unpaired EndGroup.
2083
// findEndGroup returns the indexes of the start and end of the EndGroup tag.
2084
// Returns (-1,-1) if it can't find one.
2085
func findEndGroup(b []byte) (int, int) {
2086
	depth := 1
2087
	i := 0
2088
	for {
2089
		x, n := decodeVarint(b[i:])
2090
		if n == 0 {
2091
			return -1, -1
2092
		}
2093
		j := i
2094
		i += n
2095
		switch x & 7 {
2096
		case WireVarint:
2097
			_, k := decodeVarint(b[i:])
2098
			if k == 0 {
2099
				return -1, -1
2100
			}
2101
			i += k
2102
		case WireFixed32:
2103
			if len(b)-4 < i {
2104
				return -1, -1
2105
			}
2106
			i += 4
2107
		case WireFixed64:
2108
			if len(b)-8 < i {
2109
				return -1, -1
2110
			}
2111
			i += 8
2112
		case WireBytes:
2113
			m, k := decodeVarint(b[i:])
2114
			if k == 0 {
2115
				return -1, -1
2116
			}
2117
			i += k
2118
			if uint64(len(b)-i) < m {
2119
				return -1, -1
2120
			}
2121
			i += int(m)
2122
		case WireStartGroup:
2123
			depth++
2124
		case WireEndGroup:
2125
			depth--
2126
			if depth == 0 {
2127
				return j, i
2128
			}
2129
		default:
2130
			return -1, -1
2131
		}
2132
	}
2133
}
2134

2135
// encodeVarint appends a varint-encoded integer to b and returns the result.
2136
func encodeVarint(b []byte, x uint64) []byte {
2137
	for x >= 1<<7 {
2138
		b = append(b, byte(x&0x7f|0x80))
2139
		x >>= 7
2140
	}
2141
	return append(b, byte(x))
2142
}
2143

2144
// decodeVarint reads a varint-encoded integer from b.
2145
// Returns the decoded integer and the number of bytes read.
2146
// If there is an error, it returns 0,0.
2147
func decodeVarint(b []byte) (uint64, int) {
2148
	var x, y uint64
2149
	if len(b) == 0 {
2150
		goto bad
2151
	}
2152
	x = uint64(b[0])
2153
	if x < 0x80 {
2154
		return x, 1
2155
	}
2156
	x -= 0x80
2157

2158
	if len(b) <= 1 {
2159
		goto bad
2160
	}
2161
	y = uint64(b[1])
2162
	x += y << 7
2163
	if y < 0x80 {
2164
		return x, 2
2165
	}
2166
	x -= 0x80 << 7
2167

2168
	if len(b) <= 2 {
2169
		goto bad
2170
	}
2171
	y = uint64(b[2])
2172
	x += y << 14
2173
	if y < 0x80 {
2174
		return x, 3
2175
	}
2176
	x -= 0x80 << 14
2177

2178
	if len(b) <= 3 {
2179
		goto bad
2180
	}
2181
	y = uint64(b[3])
2182
	x += y << 21
2183
	if y < 0x80 {
2184
		return x, 4
2185
	}
2186
	x -= 0x80 << 21
2187

2188
	if len(b) <= 4 {
2189
		goto bad
2190
	}
2191
	y = uint64(b[4])
2192
	x += y << 28
2193
	if y < 0x80 {
2194
		return x, 5
2195
	}
2196
	x -= 0x80 << 28
2197

2198
	if len(b) <= 5 {
2199
		goto bad
2200
	}
2201
	y = uint64(b[5])
2202
	x += y << 35
2203
	if y < 0x80 {
2204
		return x, 6
2205
	}
2206
	x -= 0x80 << 35
2207

2208
	if len(b) <= 6 {
2209
		goto bad
2210
	}
2211
	y = uint64(b[6])
2212
	x += y << 42
2213
	if y < 0x80 {
2214
		return x, 7
2215
	}
2216
	x -= 0x80 << 42
2217

2218
	if len(b) <= 7 {
2219
		goto bad
2220
	}
2221
	y = uint64(b[7])
2222
	x += y << 49
2223
	if y < 0x80 {
2224
		return x, 8
2225
	}
2226
	x -= 0x80 << 49
2227

2228
	if len(b) <= 8 {
2229
		goto bad
2230
	}
2231
	y = uint64(b[8])
2232
	x += y << 56
2233
	if y < 0x80 {
2234
		return x, 9
2235
	}
2236
	x -= 0x80 << 56
2237

2238
	if len(b) <= 9 {
2239
		goto bad
2240
	}
2241
	y = uint64(b[9])
2242
	x += y << 63
2243
	if y < 2 {
2244
		return x, 10
2245
	}
2246

2247
bad:
2248
	return 0, 0
2249
}
2250

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.