podman

Форк
0
3009 строк · 78.8 Кб
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
	"math"
38
	"reflect"
39
	"sort"
40
	"strconv"
41
	"strings"
42
	"sync"
43
	"sync/atomic"
44
	"unicode/utf8"
45
)
46

47
// a sizer takes a pointer to a field and the size of its tag, computes the size of
48
// the encoded data.
49
type sizer func(pointer, int) int
50

51
// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format),
52
// marshals the field to the end of the slice, returns the slice and error (if any).
53
type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error)
54

55
// marshalInfo is the information used for marshaling a message.
56
type marshalInfo struct {
57
	typ          reflect.Type
58
	fields       []*marshalFieldInfo
59
	unrecognized field                      // offset of XXX_unrecognized
60
	extensions   field                      // offset of XXX_InternalExtensions
61
	v1extensions field                      // offset of XXX_extensions
62
	sizecache    field                      // offset of XXX_sizecache
63
	initialized  int32                      // 0 -- only typ is set, 1 -- fully initialized
64
	messageset   bool                       // uses message set wire format
65
	hasmarshaler bool                       // has custom marshaler
66
	sync.RWMutex                            // protect extElems map, also for initialization
67
	extElems     map[int32]*marshalElemInfo // info of extension elements
68

69
	hassizer      bool // has custom sizer
70
	hasprotosizer bool // has custom protosizer
71

72
	bytesExtensions field // offset of XXX_extensions where the field type is []byte
73
}
74

75
// marshalFieldInfo is the information used for marshaling a field of a message.
76
type marshalFieldInfo struct {
77
	field      field
78
	wiretag    uint64 // tag in wire format
79
	tagsize    int    // size of tag in wire format
80
	sizer      sizer
81
	marshaler  marshaler
82
	isPointer  bool
83
	required   bool                              // field is required
84
	name       string                            // name of the field, for error reporting
85
	oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements
86
}
87

88
// marshalElemInfo is the information used for marshaling an extension or oneof element.
89
type marshalElemInfo struct {
90
	wiretag   uint64 // tag in wire format
91
	tagsize   int    // size of tag in wire format
92
	sizer     sizer
93
	marshaler marshaler
94
	isptr     bool // elem is pointer typed, thus interface of this type is a direct interface (extension only)
95
}
96

97
var (
98
	marshalInfoMap  = map[reflect.Type]*marshalInfo{}
99
	marshalInfoLock sync.Mutex
100

101
	uint8SliceType = reflect.TypeOf(([]uint8)(nil)).Kind()
102
)
103

104
// getMarshalInfo returns the information to marshal a given type of message.
105
// The info it returns may not necessarily initialized.
106
// t is the type of the message (NOT the pointer to it).
107
func getMarshalInfo(t reflect.Type) *marshalInfo {
108
	marshalInfoLock.Lock()
109
	u, ok := marshalInfoMap[t]
110
	if !ok {
111
		u = &marshalInfo{typ: t}
112
		marshalInfoMap[t] = u
113
	}
114
	marshalInfoLock.Unlock()
115
	return u
116
}
117

118
// Size is the entry point from generated code,
119
// and should be ONLY called by generated code.
120
// It computes the size of encoded data of msg.
121
// a is a pointer to a place to store cached marshal info.
122
func (a *InternalMessageInfo) Size(msg Message) int {
123
	u := getMessageMarshalInfo(msg, a)
124
	ptr := toPointer(&msg)
125
	if ptr.isNil() {
126
		// We get here if msg is a typed nil ((*SomeMessage)(nil)),
127
		// so it satisfies the interface, and msg == nil wouldn't
128
		// catch it. We don't want crash in this case.
129
		return 0
130
	}
131
	return u.size(ptr)
132
}
133

134
// Marshal is the entry point from generated code,
135
// and should be ONLY called by generated code.
136
// It marshals msg to the end of b.
137
// a is a pointer to a place to store cached marshal info.
138
func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) {
139
	u := getMessageMarshalInfo(msg, a)
140
	ptr := toPointer(&msg)
141
	if ptr.isNil() {
142
		// We get here if msg is a typed nil ((*SomeMessage)(nil)),
143
		// so it satisfies the interface, and msg == nil wouldn't
144
		// catch it. We don't want crash in this case.
145
		return b, ErrNil
146
	}
147
	return u.marshal(b, ptr, deterministic)
148
}
149

150
func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo {
151
	// u := a.marshal, but atomically.
152
	// We use an atomic here to ensure memory consistency.
153
	u := atomicLoadMarshalInfo(&a.marshal)
154
	if u == nil {
155
		// Get marshal information from type of message.
156
		t := reflect.ValueOf(msg).Type()
157
		if t.Kind() != reflect.Ptr {
158
			panic(fmt.Sprintf("cannot handle non-pointer message type %v", t))
159
		}
160
		u = getMarshalInfo(t.Elem())
161
		// Store it in the cache for later users.
162
		// a.marshal = u, but atomically.
163
		atomicStoreMarshalInfo(&a.marshal, u)
164
	}
165
	return u
166
}
167

168
// size is the main function to compute the size of the encoded data of a message.
169
// ptr is the pointer to the message.
170
func (u *marshalInfo) size(ptr pointer) int {
171
	if atomic.LoadInt32(&u.initialized) == 0 {
172
		u.computeMarshalInfo()
173
	}
174

175
	// If the message can marshal itself, let it do it, for compatibility.
176
	// NOTE: This is not efficient.
177
	if u.hasmarshaler {
178
		// Uses the message's Size method if available
179
		if u.hassizer {
180
			s := ptr.asPointerTo(u.typ).Interface().(Sizer)
181
			return s.Size()
182
		}
183
		// Uses the message's ProtoSize method if available
184
		if u.hasprotosizer {
185
			s := ptr.asPointerTo(u.typ).Interface().(ProtoSizer)
186
			return s.ProtoSize()
187
		}
188

189
		m := ptr.asPointerTo(u.typ).Interface().(Marshaler)
190
		b, _ := m.Marshal()
191
		return len(b)
192
	}
193

194
	n := 0
195
	for _, f := range u.fields {
196
		if f.isPointer && ptr.offset(f.field).getPointer().isNil() {
197
			// nil pointer always marshals to nothing
198
			continue
199
		}
200
		n += f.sizer(ptr.offset(f.field), f.tagsize)
201
	}
202
	if u.extensions.IsValid() {
203
		e := ptr.offset(u.extensions).toExtensions()
204
		if u.messageset {
205
			n += u.sizeMessageSet(e)
206
		} else {
207
			n += u.sizeExtensions(e)
208
		}
209
	}
210
	if u.v1extensions.IsValid() {
211
		m := *ptr.offset(u.v1extensions).toOldExtensions()
212
		n += u.sizeV1Extensions(m)
213
	}
214
	if u.bytesExtensions.IsValid() {
215
		s := *ptr.offset(u.bytesExtensions).toBytes()
216
		n += len(s)
217
	}
218
	if u.unrecognized.IsValid() {
219
		s := *ptr.offset(u.unrecognized).toBytes()
220
		n += len(s)
221
	}
222

223
	// cache the result for use in marshal
224
	if u.sizecache.IsValid() {
225
		atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n))
226
	}
227
	return n
228
}
229

230
// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated),
231
// fall back to compute the size.
232
func (u *marshalInfo) cachedsize(ptr pointer) int {
233
	if u.sizecache.IsValid() {
234
		return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32()))
235
	}
236
	return u.size(ptr)
237
}
238

239
// marshal is the main function to marshal a message. It takes a byte slice and appends
240
// the encoded data to the end of the slice, returns the slice and error (if any).
241
// ptr is the pointer to the message.
242
// If deterministic is true, map is marshaled in deterministic order.
243
func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) {
244
	if atomic.LoadInt32(&u.initialized) == 0 {
245
		u.computeMarshalInfo()
246
	}
247

248
	// If the message can marshal itself, let it do it, for compatibility.
249
	// NOTE: This is not efficient.
250
	if u.hasmarshaler {
251
		m := ptr.asPointerTo(u.typ).Interface().(Marshaler)
252
		b1, err := m.Marshal()
253
		b = append(b, b1...)
254
		return b, err
255
	}
256

257
	var err, errLater error
258
	// The old marshaler encodes extensions at beginning.
259
	if u.extensions.IsValid() {
260
		e := ptr.offset(u.extensions).toExtensions()
261
		if u.messageset {
262
			b, err = u.appendMessageSet(b, e, deterministic)
263
		} else {
264
			b, err = u.appendExtensions(b, e, deterministic)
265
		}
266
		if err != nil {
267
			return b, err
268
		}
269
	}
270
	if u.v1extensions.IsValid() {
271
		m := *ptr.offset(u.v1extensions).toOldExtensions()
272
		b, err = u.appendV1Extensions(b, m, deterministic)
273
		if err != nil {
274
			return b, err
275
		}
276
	}
277
	if u.bytesExtensions.IsValid() {
278
		s := *ptr.offset(u.bytesExtensions).toBytes()
279
		b = append(b, s...)
280
	}
281
	for _, f := range u.fields {
282
		if f.required {
283
			if f.isPointer && ptr.offset(f.field).getPointer().isNil() {
284
				// Required field is not set.
285
				// We record the error but keep going, to give a complete marshaling.
286
				if errLater == nil {
287
					errLater = &RequiredNotSetError{f.name}
288
				}
289
				continue
290
			}
291
		}
292
		if f.isPointer && ptr.offset(f.field).getPointer().isNil() {
293
			// nil pointer always marshals to nothing
294
			continue
295
		}
296
		b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic)
297
		if err != nil {
298
			if err1, ok := err.(*RequiredNotSetError); ok {
299
				// Required field in submessage is not set.
300
				// We record the error but keep going, to give a complete marshaling.
301
				if errLater == nil {
302
					errLater = &RequiredNotSetError{f.name + "." + err1.field}
303
				}
304
				continue
305
			}
306
			if err == errRepeatedHasNil {
307
				err = errors.New("proto: repeated field " + f.name + " has nil element")
308
			}
309
			if err == errInvalidUTF8 {
310
				if errLater == nil {
311
					fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name
312
					errLater = &invalidUTF8Error{fullName}
313
				}
314
				continue
315
			}
316
			return b, err
317
		}
318
	}
319
	if u.unrecognized.IsValid() {
320
		s := *ptr.offset(u.unrecognized).toBytes()
321
		b = append(b, s...)
322
	}
323
	return b, errLater
324
}
325

326
// computeMarshalInfo initializes the marshal info.
327
func (u *marshalInfo) computeMarshalInfo() {
328
	u.Lock()
329
	defer u.Unlock()
330
	if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock
331
		return
332
	}
333

334
	t := u.typ
335
	u.unrecognized = invalidField
336
	u.extensions = invalidField
337
	u.v1extensions = invalidField
338
	u.bytesExtensions = invalidField
339
	u.sizecache = invalidField
340
	isOneofMessage := false
341

342
	if reflect.PtrTo(t).Implements(sizerType) {
343
		u.hassizer = true
344
	}
345
	if reflect.PtrTo(t).Implements(protosizerType) {
346
		u.hasprotosizer = true
347
	}
348
	// If the message can marshal itself, let it do it, for compatibility.
349
	// NOTE: This is not efficient.
350
	if reflect.PtrTo(t).Implements(marshalerType) {
351
		u.hasmarshaler = true
352
		atomic.StoreInt32(&u.initialized, 1)
353
		return
354
	}
355

356
	n := t.NumField()
357

358
	// deal with XXX fields first
359
	for i := 0; i < t.NumField(); i++ {
360
		f := t.Field(i)
361
		if f.Tag.Get("protobuf_oneof") != "" {
362
			isOneofMessage = true
363
		}
364
		if !strings.HasPrefix(f.Name, "XXX_") {
365
			continue
366
		}
367
		switch f.Name {
368
		case "XXX_sizecache":
369
			u.sizecache = toField(&f)
370
		case "XXX_unrecognized":
371
			u.unrecognized = toField(&f)
372
		case "XXX_InternalExtensions":
373
			u.extensions = toField(&f)
374
			u.messageset = f.Tag.Get("protobuf_messageset") == "1"
375
		case "XXX_extensions":
376
			if f.Type.Kind() == reflect.Map {
377
				u.v1extensions = toField(&f)
378
			} else {
379
				u.bytesExtensions = toField(&f)
380
			}
381
		case "XXX_NoUnkeyedLiteral":
382
			// nothing to do
383
		default:
384
			panic("unknown XXX field: " + f.Name)
385
		}
386
		n--
387
	}
388

389
	// get oneof implementers
390
	var oneofImplementers []interface{}
391
	// gogo: isOneofMessage is needed for embedded oneof messages, without a marshaler and unmarshaler
392
	if isOneofMessage {
393
		switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) {
394
		case oneofFuncsIface:
395
			_, _, _, oneofImplementers = m.XXX_OneofFuncs()
396
		case oneofWrappersIface:
397
			oneofImplementers = m.XXX_OneofWrappers()
398
		}
399
	}
400

401
	// normal fields
402
	fields := make([]marshalFieldInfo, n) // batch allocation
403
	u.fields = make([]*marshalFieldInfo, 0, n)
404
	for i, j := 0, 0; i < t.NumField(); i++ {
405
		f := t.Field(i)
406

407
		if strings.HasPrefix(f.Name, "XXX_") {
408
			continue
409
		}
410
		field := &fields[j]
411
		j++
412
		field.name = f.Name
413
		u.fields = append(u.fields, field)
414
		if f.Tag.Get("protobuf_oneof") != "" {
415
			field.computeOneofFieldInfo(&f, oneofImplementers)
416
			continue
417
		}
418
		if f.Tag.Get("protobuf") == "" {
419
			// field has no tag (not in generated message), ignore it
420
			u.fields = u.fields[:len(u.fields)-1]
421
			j--
422
			continue
423
		}
424
		field.computeMarshalFieldInfo(&f)
425
	}
426

427
	// fields are marshaled in tag order on the wire.
428
	sort.Sort(byTag(u.fields))
429

430
	atomic.StoreInt32(&u.initialized, 1)
431
}
432

433
// helper for sorting fields by tag
434
type byTag []*marshalFieldInfo
435

436
func (a byTag) Len() int           { return len(a) }
437
func (a byTag) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
438
func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag }
439

440
// getExtElemInfo returns the information to marshal an extension element.
441
// The info it returns is initialized.
442
func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo {
443
	// get from cache first
444
	u.RLock()
445
	e, ok := u.extElems[desc.Field]
446
	u.RUnlock()
447
	if ok {
448
		return e
449
	}
450

451
	t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct
452
	tags := strings.Split(desc.Tag, ",")
453
	tag, err := strconv.Atoi(tags[1])
454
	if err != nil {
455
		panic("tag is not an integer")
456
	}
457
	wt := wiretype(tags[0])
458
	sizr, marshalr := typeMarshaler(t, tags, false, false)
459
	e = &marshalElemInfo{
460
		wiretag:   uint64(tag)<<3 | wt,
461
		tagsize:   SizeVarint(uint64(tag) << 3),
462
		sizer:     sizr,
463
		marshaler: marshalr,
464
		isptr:     t.Kind() == reflect.Ptr,
465
	}
466

467
	// update cache
468
	u.Lock()
469
	if u.extElems == nil {
470
		u.extElems = make(map[int32]*marshalElemInfo)
471
	}
472
	u.extElems[desc.Field] = e
473
	u.Unlock()
474
	return e
475
}
476

477
// computeMarshalFieldInfo fills up the information to marshal a field.
478
func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) {
479
	// parse protobuf tag of the field.
480
	// tag has format of "bytes,49,opt,name=foo,def=hello!"
481
	tags := strings.Split(f.Tag.Get("protobuf"), ",")
482
	if tags[0] == "" {
483
		return
484
	}
485
	tag, err := strconv.Atoi(tags[1])
486
	if err != nil {
487
		panic("tag is not an integer")
488
	}
489
	wt := wiretype(tags[0])
490
	if tags[2] == "req" {
491
		fi.required = true
492
	}
493
	fi.setTag(f, tag, wt)
494
	fi.setMarshaler(f, tags)
495
}
496

497
func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) {
498
	fi.field = toField(f)
499
	fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire.
500
	fi.isPointer = true
501
	fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f)
502
	fi.oneofElems = make(map[reflect.Type]*marshalElemInfo)
503

504
	ityp := f.Type // interface type
505
	for _, o := range oneofImplementers {
506
		t := reflect.TypeOf(o)
507
		if !t.Implements(ityp) {
508
			continue
509
		}
510
		sf := t.Elem().Field(0) // oneof implementer is a struct with a single field
511
		tags := strings.Split(sf.Tag.Get("protobuf"), ",")
512
		tag, err := strconv.Atoi(tags[1])
513
		if err != nil {
514
			panic("tag is not an integer")
515
		}
516
		wt := wiretype(tags[0])
517
		sizr, marshalr := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value
518
		fi.oneofElems[t.Elem()] = &marshalElemInfo{
519
			wiretag:   uint64(tag)<<3 | wt,
520
			tagsize:   SizeVarint(uint64(tag) << 3),
521
			sizer:     sizr,
522
			marshaler: marshalr,
523
		}
524
	}
525
}
526

527
// wiretype returns the wire encoding of the type.
528
func wiretype(encoding string) uint64 {
529
	switch encoding {
530
	case "fixed32":
531
		return WireFixed32
532
	case "fixed64":
533
		return WireFixed64
534
	case "varint", "zigzag32", "zigzag64":
535
		return WireVarint
536
	case "bytes":
537
		return WireBytes
538
	case "group":
539
		return WireStartGroup
540
	}
541
	panic("unknown wire type " + encoding)
542
}
543

544
// setTag fills up the tag (in wire format) and its size in the info of a field.
545
func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) {
546
	fi.field = toField(f)
547
	fi.wiretag = uint64(tag)<<3 | wt
548
	fi.tagsize = SizeVarint(uint64(tag) << 3)
549
}
550

551
// setMarshaler fills up the sizer and marshaler in the info of a field.
552
func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) {
553
	switch f.Type.Kind() {
554
	case reflect.Map:
555
		// map field
556
		fi.isPointer = true
557
		fi.sizer, fi.marshaler = makeMapMarshaler(f)
558
		return
559
	case reflect.Ptr, reflect.Slice:
560
		fi.isPointer = true
561
	}
562
	fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false)
563
}
564

565
// typeMarshaler returns the sizer and marshaler of a given field.
566
// t is the type of the field.
567
// tags is the generated "protobuf" tag of the field.
568
// If nozero is true, zero value is not marshaled to the wire.
569
// If oneof is true, it is a oneof field.
570
func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) {
571
	encoding := tags[0]
572

573
	pointer := false
574
	slice := false
575
	if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
576
		slice = true
577
		t = t.Elem()
578
	}
579
	if t.Kind() == reflect.Ptr {
580
		pointer = true
581
		t = t.Elem()
582
	}
583

584
	packed := false
585
	proto3 := false
586
	ctype := false
587
	isTime := false
588
	isDuration := false
589
	isWktPointer := false
590
	validateUTF8 := true
591
	for i := 2; i < len(tags); i++ {
592
		if tags[i] == "packed" {
593
			packed = true
594
		}
595
		if tags[i] == "proto3" {
596
			proto3 = true
597
		}
598
		if strings.HasPrefix(tags[i], "customtype=") {
599
			ctype = true
600
		}
601
		if tags[i] == "stdtime" {
602
			isTime = true
603
		}
604
		if tags[i] == "stdduration" {
605
			isDuration = true
606
		}
607
		if tags[i] == "wktptr" {
608
			isWktPointer = true
609
		}
610
	}
611
	validateUTF8 = validateUTF8 && proto3
612
	if !proto3 && !pointer && !slice {
613
		nozero = false
614
	}
615

616
	if ctype {
617
		if reflect.PtrTo(t).Implements(customType) {
618
			if slice {
619
				return makeMessageRefSliceMarshaler(getMarshalInfo(t))
620
			}
621
			if pointer {
622
				return makeCustomPtrMarshaler(getMarshalInfo(t))
623
			}
624
			return makeCustomMarshaler(getMarshalInfo(t))
625
		} else {
626
			panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t))
627
		}
628
	}
629

630
	if isTime {
631
		if pointer {
632
			if slice {
633
				return makeTimePtrSliceMarshaler(getMarshalInfo(t))
634
			}
635
			return makeTimePtrMarshaler(getMarshalInfo(t))
636
		}
637
		if slice {
638
			return makeTimeSliceMarshaler(getMarshalInfo(t))
639
		}
640
		return makeTimeMarshaler(getMarshalInfo(t))
641
	}
642

643
	if isDuration {
644
		if pointer {
645
			if slice {
646
				return makeDurationPtrSliceMarshaler(getMarshalInfo(t))
647
			}
648
			return makeDurationPtrMarshaler(getMarshalInfo(t))
649
		}
650
		if slice {
651
			return makeDurationSliceMarshaler(getMarshalInfo(t))
652
		}
653
		return makeDurationMarshaler(getMarshalInfo(t))
654
	}
655

656
	if isWktPointer {
657
		switch t.Kind() {
658
		case reflect.Float64:
659
			if pointer {
660
				if slice {
661
					return makeStdDoubleValuePtrSliceMarshaler(getMarshalInfo(t))
662
				}
663
				return makeStdDoubleValuePtrMarshaler(getMarshalInfo(t))
664
			}
665
			if slice {
666
				return makeStdDoubleValueSliceMarshaler(getMarshalInfo(t))
667
			}
668
			return makeStdDoubleValueMarshaler(getMarshalInfo(t))
669
		case reflect.Float32:
670
			if pointer {
671
				if slice {
672
					return makeStdFloatValuePtrSliceMarshaler(getMarshalInfo(t))
673
				}
674
				return makeStdFloatValuePtrMarshaler(getMarshalInfo(t))
675
			}
676
			if slice {
677
				return makeStdFloatValueSliceMarshaler(getMarshalInfo(t))
678
			}
679
			return makeStdFloatValueMarshaler(getMarshalInfo(t))
680
		case reflect.Int64:
681
			if pointer {
682
				if slice {
683
					return makeStdInt64ValuePtrSliceMarshaler(getMarshalInfo(t))
684
				}
685
				return makeStdInt64ValuePtrMarshaler(getMarshalInfo(t))
686
			}
687
			if slice {
688
				return makeStdInt64ValueSliceMarshaler(getMarshalInfo(t))
689
			}
690
			return makeStdInt64ValueMarshaler(getMarshalInfo(t))
691
		case reflect.Uint64:
692
			if pointer {
693
				if slice {
694
					return makeStdUInt64ValuePtrSliceMarshaler(getMarshalInfo(t))
695
				}
696
				return makeStdUInt64ValuePtrMarshaler(getMarshalInfo(t))
697
			}
698
			if slice {
699
				return makeStdUInt64ValueSliceMarshaler(getMarshalInfo(t))
700
			}
701
			return makeStdUInt64ValueMarshaler(getMarshalInfo(t))
702
		case reflect.Int32:
703
			if pointer {
704
				if slice {
705
					return makeStdInt32ValuePtrSliceMarshaler(getMarshalInfo(t))
706
				}
707
				return makeStdInt32ValuePtrMarshaler(getMarshalInfo(t))
708
			}
709
			if slice {
710
				return makeStdInt32ValueSliceMarshaler(getMarshalInfo(t))
711
			}
712
			return makeStdInt32ValueMarshaler(getMarshalInfo(t))
713
		case reflect.Uint32:
714
			if pointer {
715
				if slice {
716
					return makeStdUInt32ValuePtrSliceMarshaler(getMarshalInfo(t))
717
				}
718
				return makeStdUInt32ValuePtrMarshaler(getMarshalInfo(t))
719
			}
720
			if slice {
721
				return makeStdUInt32ValueSliceMarshaler(getMarshalInfo(t))
722
			}
723
			return makeStdUInt32ValueMarshaler(getMarshalInfo(t))
724
		case reflect.Bool:
725
			if pointer {
726
				if slice {
727
					return makeStdBoolValuePtrSliceMarshaler(getMarshalInfo(t))
728
				}
729
				return makeStdBoolValuePtrMarshaler(getMarshalInfo(t))
730
			}
731
			if slice {
732
				return makeStdBoolValueSliceMarshaler(getMarshalInfo(t))
733
			}
734
			return makeStdBoolValueMarshaler(getMarshalInfo(t))
735
		case reflect.String:
736
			if pointer {
737
				if slice {
738
					return makeStdStringValuePtrSliceMarshaler(getMarshalInfo(t))
739
				}
740
				return makeStdStringValuePtrMarshaler(getMarshalInfo(t))
741
			}
742
			if slice {
743
				return makeStdStringValueSliceMarshaler(getMarshalInfo(t))
744
			}
745
			return makeStdStringValueMarshaler(getMarshalInfo(t))
746
		case uint8SliceType:
747
			if pointer {
748
				if slice {
749
					return makeStdBytesValuePtrSliceMarshaler(getMarshalInfo(t))
750
				}
751
				return makeStdBytesValuePtrMarshaler(getMarshalInfo(t))
752
			}
753
			if slice {
754
				return makeStdBytesValueSliceMarshaler(getMarshalInfo(t))
755
			}
756
			return makeStdBytesValueMarshaler(getMarshalInfo(t))
757
		default:
758
			panic(fmt.Sprintf("unknown wktpointer type %#v", t))
759
		}
760
	}
761

762
	switch t.Kind() {
763
	case reflect.Bool:
764
		if pointer {
765
			return sizeBoolPtr, appendBoolPtr
766
		}
767
		if slice {
768
			if packed {
769
				return sizeBoolPackedSlice, appendBoolPackedSlice
770
			}
771
			return sizeBoolSlice, appendBoolSlice
772
		}
773
		if nozero {
774
			return sizeBoolValueNoZero, appendBoolValueNoZero
775
		}
776
		return sizeBoolValue, appendBoolValue
777
	case reflect.Uint32:
778
		switch encoding {
779
		case "fixed32":
780
			if pointer {
781
				return sizeFixed32Ptr, appendFixed32Ptr
782
			}
783
			if slice {
784
				if packed {
785
					return sizeFixed32PackedSlice, appendFixed32PackedSlice
786
				}
787
				return sizeFixed32Slice, appendFixed32Slice
788
			}
789
			if nozero {
790
				return sizeFixed32ValueNoZero, appendFixed32ValueNoZero
791
			}
792
			return sizeFixed32Value, appendFixed32Value
793
		case "varint":
794
			if pointer {
795
				return sizeVarint32Ptr, appendVarint32Ptr
796
			}
797
			if slice {
798
				if packed {
799
					return sizeVarint32PackedSlice, appendVarint32PackedSlice
800
				}
801
				return sizeVarint32Slice, appendVarint32Slice
802
			}
803
			if nozero {
804
				return sizeVarint32ValueNoZero, appendVarint32ValueNoZero
805
			}
806
			return sizeVarint32Value, appendVarint32Value
807
		}
808
	case reflect.Int32:
809
		switch encoding {
810
		case "fixed32":
811
			if pointer {
812
				return sizeFixedS32Ptr, appendFixedS32Ptr
813
			}
814
			if slice {
815
				if packed {
816
					return sizeFixedS32PackedSlice, appendFixedS32PackedSlice
817
				}
818
				return sizeFixedS32Slice, appendFixedS32Slice
819
			}
820
			if nozero {
821
				return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero
822
			}
823
			return sizeFixedS32Value, appendFixedS32Value
824
		case "varint":
825
			if pointer {
826
				return sizeVarintS32Ptr, appendVarintS32Ptr
827
			}
828
			if slice {
829
				if packed {
830
					return sizeVarintS32PackedSlice, appendVarintS32PackedSlice
831
				}
832
				return sizeVarintS32Slice, appendVarintS32Slice
833
			}
834
			if nozero {
835
				return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero
836
			}
837
			return sizeVarintS32Value, appendVarintS32Value
838
		case "zigzag32":
839
			if pointer {
840
				return sizeZigzag32Ptr, appendZigzag32Ptr
841
			}
842
			if slice {
843
				if packed {
844
					return sizeZigzag32PackedSlice, appendZigzag32PackedSlice
845
				}
846
				return sizeZigzag32Slice, appendZigzag32Slice
847
			}
848
			if nozero {
849
				return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero
850
			}
851
			return sizeZigzag32Value, appendZigzag32Value
852
		}
853
	case reflect.Uint64:
854
		switch encoding {
855
		case "fixed64":
856
			if pointer {
857
				return sizeFixed64Ptr, appendFixed64Ptr
858
			}
859
			if slice {
860
				if packed {
861
					return sizeFixed64PackedSlice, appendFixed64PackedSlice
862
				}
863
				return sizeFixed64Slice, appendFixed64Slice
864
			}
865
			if nozero {
866
				return sizeFixed64ValueNoZero, appendFixed64ValueNoZero
867
			}
868
			return sizeFixed64Value, appendFixed64Value
869
		case "varint":
870
			if pointer {
871
				return sizeVarint64Ptr, appendVarint64Ptr
872
			}
873
			if slice {
874
				if packed {
875
					return sizeVarint64PackedSlice, appendVarint64PackedSlice
876
				}
877
				return sizeVarint64Slice, appendVarint64Slice
878
			}
879
			if nozero {
880
				return sizeVarint64ValueNoZero, appendVarint64ValueNoZero
881
			}
882
			return sizeVarint64Value, appendVarint64Value
883
		}
884
	case reflect.Int64:
885
		switch encoding {
886
		case "fixed64":
887
			if pointer {
888
				return sizeFixedS64Ptr, appendFixedS64Ptr
889
			}
890
			if slice {
891
				if packed {
892
					return sizeFixedS64PackedSlice, appendFixedS64PackedSlice
893
				}
894
				return sizeFixedS64Slice, appendFixedS64Slice
895
			}
896
			if nozero {
897
				return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero
898
			}
899
			return sizeFixedS64Value, appendFixedS64Value
900
		case "varint":
901
			if pointer {
902
				return sizeVarintS64Ptr, appendVarintS64Ptr
903
			}
904
			if slice {
905
				if packed {
906
					return sizeVarintS64PackedSlice, appendVarintS64PackedSlice
907
				}
908
				return sizeVarintS64Slice, appendVarintS64Slice
909
			}
910
			if nozero {
911
				return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero
912
			}
913
			return sizeVarintS64Value, appendVarintS64Value
914
		case "zigzag64":
915
			if pointer {
916
				return sizeZigzag64Ptr, appendZigzag64Ptr
917
			}
918
			if slice {
919
				if packed {
920
					return sizeZigzag64PackedSlice, appendZigzag64PackedSlice
921
				}
922
				return sizeZigzag64Slice, appendZigzag64Slice
923
			}
924
			if nozero {
925
				return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero
926
			}
927
			return sizeZigzag64Value, appendZigzag64Value
928
		}
929
	case reflect.Float32:
930
		if pointer {
931
			return sizeFloat32Ptr, appendFloat32Ptr
932
		}
933
		if slice {
934
			if packed {
935
				return sizeFloat32PackedSlice, appendFloat32PackedSlice
936
			}
937
			return sizeFloat32Slice, appendFloat32Slice
938
		}
939
		if nozero {
940
			return sizeFloat32ValueNoZero, appendFloat32ValueNoZero
941
		}
942
		return sizeFloat32Value, appendFloat32Value
943
	case reflect.Float64:
944
		if pointer {
945
			return sizeFloat64Ptr, appendFloat64Ptr
946
		}
947
		if slice {
948
			if packed {
949
				return sizeFloat64PackedSlice, appendFloat64PackedSlice
950
			}
951
			return sizeFloat64Slice, appendFloat64Slice
952
		}
953
		if nozero {
954
			return sizeFloat64ValueNoZero, appendFloat64ValueNoZero
955
		}
956
		return sizeFloat64Value, appendFloat64Value
957
	case reflect.String:
958
		if validateUTF8 {
959
			if pointer {
960
				return sizeStringPtr, appendUTF8StringPtr
961
			}
962
			if slice {
963
				return sizeStringSlice, appendUTF8StringSlice
964
			}
965
			if nozero {
966
				return sizeStringValueNoZero, appendUTF8StringValueNoZero
967
			}
968
			return sizeStringValue, appendUTF8StringValue
969
		}
970
		if pointer {
971
			return sizeStringPtr, appendStringPtr
972
		}
973
		if slice {
974
			return sizeStringSlice, appendStringSlice
975
		}
976
		if nozero {
977
			return sizeStringValueNoZero, appendStringValueNoZero
978
		}
979
		return sizeStringValue, appendStringValue
980
	case reflect.Slice:
981
		if slice {
982
			return sizeBytesSlice, appendBytesSlice
983
		}
984
		if oneof {
985
			// Oneof bytes field may also have "proto3" tag.
986
			// We want to marshal it as a oneof field. Do this
987
			// check before the proto3 check.
988
			return sizeBytesOneof, appendBytesOneof
989
		}
990
		if proto3 {
991
			return sizeBytes3, appendBytes3
992
		}
993
		return sizeBytes, appendBytes
994
	case reflect.Struct:
995
		switch encoding {
996
		case "group":
997
			if slice {
998
				return makeGroupSliceMarshaler(getMarshalInfo(t))
999
			}
1000
			return makeGroupMarshaler(getMarshalInfo(t))
1001
		case "bytes":
1002
			if pointer {
1003
				if slice {
1004
					return makeMessageSliceMarshaler(getMarshalInfo(t))
1005
				}
1006
				return makeMessageMarshaler(getMarshalInfo(t))
1007
			} else {
1008
				if slice {
1009
					return makeMessageRefSliceMarshaler(getMarshalInfo(t))
1010
				}
1011
				return makeMessageRefMarshaler(getMarshalInfo(t))
1012
			}
1013
		}
1014
	}
1015
	panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding))
1016
}
1017

1018
// Below are functions to size/marshal a specific type of a field.
1019
// They are stored in the field's info, and called by function pointers.
1020
// They have type sizer or marshaler.
1021

1022
func sizeFixed32Value(_ pointer, tagsize int) int {
1023
	return 4 + tagsize
1024
}
1025
func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int {
1026
	v := *ptr.toUint32()
1027
	if v == 0 {
1028
		return 0
1029
	}
1030
	return 4 + tagsize
1031
}
1032
func sizeFixed32Ptr(ptr pointer, tagsize int) int {
1033
	p := *ptr.toUint32Ptr()
1034
	if p == nil {
1035
		return 0
1036
	}
1037
	return 4 + tagsize
1038
}
1039
func sizeFixed32Slice(ptr pointer, tagsize int) int {
1040
	s := *ptr.toUint32Slice()
1041
	return (4 + tagsize) * len(s)
1042
}
1043
func sizeFixed32PackedSlice(ptr pointer, tagsize int) int {
1044
	s := *ptr.toUint32Slice()
1045
	if len(s) == 0 {
1046
		return 0
1047
	}
1048
	return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize
1049
}
1050
func sizeFixedS32Value(_ pointer, tagsize int) int {
1051
	return 4 + tagsize
1052
}
1053
func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int {
1054
	v := *ptr.toInt32()
1055
	if v == 0 {
1056
		return 0
1057
	}
1058
	return 4 + tagsize
1059
}
1060
func sizeFixedS32Ptr(ptr pointer, tagsize int) int {
1061
	p := ptr.getInt32Ptr()
1062
	if p == nil {
1063
		return 0
1064
	}
1065
	return 4 + tagsize
1066
}
1067
func sizeFixedS32Slice(ptr pointer, tagsize int) int {
1068
	s := ptr.getInt32Slice()
1069
	return (4 + tagsize) * len(s)
1070
}
1071
func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int {
1072
	s := ptr.getInt32Slice()
1073
	if len(s) == 0 {
1074
		return 0
1075
	}
1076
	return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize
1077
}
1078
func sizeFloat32Value(_ pointer, tagsize int) int {
1079
	return 4 + tagsize
1080
}
1081
func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int {
1082
	v := math.Float32bits(*ptr.toFloat32())
1083
	if v == 0 {
1084
		return 0
1085
	}
1086
	return 4 + tagsize
1087
}
1088
func sizeFloat32Ptr(ptr pointer, tagsize int) int {
1089
	p := *ptr.toFloat32Ptr()
1090
	if p == nil {
1091
		return 0
1092
	}
1093
	return 4 + tagsize
1094
}
1095
func sizeFloat32Slice(ptr pointer, tagsize int) int {
1096
	s := *ptr.toFloat32Slice()
1097
	return (4 + tagsize) * len(s)
1098
}
1099
func sizeFloat32PackedSlice(ptr pointer, tagsize int) int {
1100
	s := *ptr.toFloat32Slice()
1101
	if len(s) == 0 {
1102
		return 0
1103
	}
1104
	return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize
1105
}
1106
func sizeFixed64Value(_ pointer, tagsize int) int {
1107
	return 8 + tagsize
1108
}
1109
func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int {
1110
	v := *ptr.toUint64()
1111
	if v == 0 {
1112
		return 0
1113
	}
1114
	return 8 + tagsize
1115
}
1116
func sizeFixed64Ptr(ptr pointer, tagsize int) int {
1117
	p := *ptr.toUint64Ptr()
1118
	if p == nil {
1119
		return 0
1120
	}
1121
	return 8 + tagsize
1122
}
1123
func sizeFixed64Slice(ptr pointer, tagsize int) int {
1124
	s := *ptr.toUint64Slice()
1125
	return (8 + tagsize) * len(s)
1126
}
1127
func sizeFixed64PackedSlice(ptr pointer, tagsize int) int {
1128
	s := *ptr.toUint64Slice()
1129
	if len(s) == 0 {
1130
		return 0
1131
	}
1132
	return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize
1133
}
1134
func sizeFixedS64Value(_ pointer, tagsize int) int {
1135
	return 8 + tagsize
1136
}
1137
func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int {
1138
	v := *ptr.toInt64()
1139
	if v == 0 {
1140
		return 0
1141
	}
1142
	return 8 + tagsize
1143
}
1144
func sizeFixedS64Ptr(ptr pointer, tagsize int) int {
1145
	p := *ptr.toInt64Ptr()
1146
	if p == nil {
1147
		return 0
1148
	}
1149
	return 8 + tagsize
1150
}
1151
func sizeFixedS64Slice(ptr pointer, tagsize int) int {
1152
	s := *ptr.toInt64Slice()
1153
	return (8 + tagsize) * len(s)
1154
}
1155
func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int {
1156
	s := *ptr.toInt64Slice()
1157
	if len(s) == 0 {
1158
		return 0
1159
	}
1160
	return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize
1161
}
1162
func sizeFloat64Value(_ pointer, tagsize int) int {
1163
	return 8 + tagsize
1164
}
1165
func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int {
1166
	v := math.Float64bits(*ptr.toFloat64())
1167
	if v == 0 {
1168
		return 0
1169
	}
1170
	return 8 + tagsize
1171
}
1172
func sizeFloat64Ptr(ptr pointer, tagsize int) int {
1173
	p := *ptr.toFloat64Ptr()
1174
	if p == nil {
1175
		return 0
1176
	}
1177
	return 8 + tagsize
1178
}
1179
func sizeFloat64Slice(ptr pointer, tagsize int) int {
1180
	s := *ptr.toFloat64Slice()
1181
	return (8 + tagsize) * len(s)
1182
}
1183
func sizeFloat64PackedSlice(ptr pointer, tagsize int) int {
1184
	s := *ptr.toFloat64Slice()
1185
	if len(s) == 0 {
1186
		return 0
1187
	}
1188
	return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize
1189
}
1190
func sizeVarint32Value(ptr pointer, tagsize int) int {
1191
	v := *ptr.toUint32()
1192
	return SizeVarint(uint64(v)) + tagsize
1193
}
1194
func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int {
1195
	v := *ptr.toUint32()
1196
	if v == 0 {
1197
		return 0
1198
	}
1199
	return SizeVarint(uint64(v)) + tagsize
1200
}
1201
func sizeVarint32Ptr(ptr pointer, tagsize int) int {
1202
	p := *ptr.toUint32Ptr()
1203
	if p == nil {
1204
		return 0
1205
	}
1206
	return SizeVarint(uint64(*p)) + tagsize
1207
}
1208
func sizeVarint32Slice(ptr pointer, tagsize int) int {
1209
	s := *ptr.toUint32Slice()
1210
	n := 0
1211
	for _, v := range s {
1212
		n += SizeVarint(uint64(v)) + tagsize
1213
	}
1214
	return n
1215
}
1216
func sizeVarint32PackedSlice(ptr pointer, tagsize int) int {
1217
	s := *ptr.toUint32Slice()
1218
	if len(s) == 0 {
1219
		return 0
1220
	}
1221
	n := 0
1222
	for _, v := range s {
1223
		n += SizeVarint(uint64(v))
1224
	}
1225
	return n + SizeVarint(uint64(n)) + tagsize
1226
}
1227
func sizeVarintS32Value(ptr pointer, tagsize int) int {
1228
	v := *ptr.toInt32()
1229
	return SizeVarint(uint64(v)) + tagsize
1230
}
1231
func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int {
1232
	v := *ptr.toInt32()
1233
	if v == 0 {
1234
		return 0
1235
	}
1236
	return SizeVarint(uint64(v)) + tagsize
1237
}
1238
func sizeVarintS32Ptr(ptr pointer, tagsize int) int {
1239
	p := ptr.getInt32Ptr()
1240
	if p == nil {
1241
		return 0
1242
	}
1243
	return SizeVarint(uint64(*p)) + tagsize
1244
}
1245
func sizeVarintS32Slice(ptr pointer, tagsize int) int {
1246
	s := ptr.getInt32Slice()
1247
	n := 0
1248
	for _, v := range s {
1249
		n += SizeVarint(uint64(v)) + tagsize
1250
	}
1251
	return n
1252
}
1253
func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int {
1254
	s := ptr.getInt32Slice()
1255
	if len(s) == 0 {
1256
		return 0
1257
	}
1258
	n := 0
1259
	for _, v := range s {
1260
		n += SizeVarint(uint64(v))
1261
	}
1262
	return n + SizeVarint(uint64(n)) + tagsize
1263
}
1264
func sizeVarint64Value(ptr pointer, tagsize int) int {
1265
	v := *ptr.toUint64()
1266
	return SizeVarint(v) + tagsize
1267
}
1268
func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int {
1269
	v := *ptr.toUint64()
1270
	if v == 0 {
1271
		return 0
1272
	}
1273
	return SizeVarint(v) + tagsize
1274
}
1275
func sizeVarint64Ptr(ptr pointer, tagsize int) int {
1276
	p := *ptr.toUint64Ptr()
1277
	if p == nil {
1278
		return 0
1279
	}
1280
	return SizeVarint(*p) + tagsize
1281
}
1282
func sizeVarint64Slice(ptr pointer, tagsize int) int {
1283
	s := *ptr.toUint64Slice()
1284
	n := 0
1285
	for _, v := range s {
1286
		n += SizeVarint(v) + tagsize
1287
	}
1288
	return n
1289
}
1290
func sizeVarint64PackedSlice(ptr pointer, tagsize int) int {
1291
	s := *ptr.toUint64Slice()
1292
	if len(s) == 0 {
1293
		return 0
1294
	}
1295
	n := 0
1296
	for _, v := range s {
1297
		n += SizeVarint(v)
1298
	}
1299
	return n + SizeVarint(uint64(n)) + tagsize
1300
}
1301
func sizeVarintS64Value(ptr pointer, tagsize int) int {
1302
	v := *ptr.toInt64()
1303
	return SizeVarint(uint64(v)) + tagsize
1304
}
1305
func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int {
1306
	v := *ptr.toInt64()
1307
	if v == 0 {
1308
		return 0
1309
	}
1310
	return SizeVarint(uint64(v)) + tagsize
1311
}
1312
func sizeVarintS64Ptr(ptr pointer, tagsize int) int {
1313
	p := *ptr.toInt64Ptr()
1314
	if p == nil {
1315
		return 0
1316
	}
1317
	return SizeVarint(uint64(*p)) + tagsize
1318
}
1319
func sizeVarintS64Slice(ptr pointer, tagsize int) int {
1320
	s := *ptr.toInt64Slice()
1321
	n := 0
1322
	for _, v := range s {
1323
		n += SizeVarint(uint64(v)) + tagsize
1324
	}
1325
	return n
1326
}
1327
func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int {
1328
	s := *ptr.toInt64Slice()
1329
	if len(s) == 0 {
1330
		return 0
1331
	}
1332
	n := 0
1333
	for _, v := range s {
1334
		n += SizeVarint(uint64(v))
1335
	}
1336
	return n + SizeVarint(uint64(n)) + tagsize
1337
}
1338
func sizeZigzag32Value(ptr pointer, tagsize int) int {
1339
	v := *ptr.toInt32()
1340
	return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize
1341
}
1342
func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int {
1343
	v := *ptr.toInt32()
1344
	if v == 0 {
1345
		return 0
1346
	}
1347
	return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize
1348
}
1349
func sizeZigzag32Ptr(ptr pointer, tagsize int) int {
1350
	p := ptr.getInt32Ptr()
1351
	if p == nil {
1352
		return 0
1353
	}
1354
	v := *p
1355
	return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize
1356
}
1357
func sizeZigzag32Slice(ptr pointer, tagsize int) int {
1358
	s := ptr.getInt32Slice()
1359
	n := 0
1360
	for _, v := range s {
1361
		n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize
1362
	}
1363
	return n
1364
}
1365
func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int {
1366
	s := ptr.getInt32Slice()
1367
	if len(s) == 0 {
1368
		return 0
1369
	}
1370
	n := 0
1371
	for _, v := range s {
1372
		n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31))))
1373
	}
1374
	return n + SizeVarint(uint64(n)) + tagsize
1375
}
1376
func sizeZigzag64Value(ptr pointer, tagsize int) int {
1377
	v := *ptr.toInt64()
1378
	return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize
1379
}
1380
func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int {
1381
	v := *ptr.toInt64()
1382
	if v == 0 {
1383
		return 0
1384
	}
1385
	return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize
1386
}
1387
func sizeZigzag64Ptr(ptr pointer, tagsize int) int {
1388
	p := *ptr.toInt64Ptr()
1389
	if p == nil {
1390
		return 0
1391
	}
1392
	v := *p
1393
	return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize
1394
}
1395
func sizeZigzag64Slice(ptr pointer, tagsize int) int {
1396
	s := *ptr.toInt64Slice()
1397
	n := 0
1398
	for _, v := range s {
1399
		n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize
1400
	}
1401
	return n
1402
}
1403
func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int {
1404
	s := *ptr.toInt64Slice()
1405
	if len(s) == 0 {
1406
		return 0
1407
	}
1408
	n := 0
1409
	for _, v := range s {
1410
		n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63)))
1411
	}
1412
	return n + SizeVarint(uint64(n)) + tagsize
1413
}
1414
func sizeBoolValue(_ pointer, tagsize int) int {
1415
	return 1 + tagsize
1416
}
1417
func sizeBoolValueNoZero(ptr pointer, tagsize int) int {
1418
	v := *ptr.toBool()
1419
	if !v {
1420
		return 0
1421
	}
1422
	return 1 + tagsize
1423
}
1424
func sizeBoolPtr(ptr pointer, tagsize int) int {
1425
	p := *ptr.toBoolPtr()
1426
	if p == nil {
1427
		return 0
1428
	}
1429
	return 1 + tagsize
1430
}
1431
func sizeBoolSlice(ptr pointer, tagsize int) int {
1432
	s := *ptr.toBoolSlice()
1433
	return (1 + tagsize) * len(s)
1434
}
1435
func sizeBoolPackedSlice(ptr pointer, tagsize int) int {
1436
	s := *ptr.toBoolSlice()
1437
	if len(s) == 0 {
1438
		return 0
1439
	}
1440
	return len(s) + SizeVarint(uint64(len(s))) + tagsize
1441
}
1442
func sizeStringValue(ptr pointer, tagsize int) int {
1443
	v := *ptr.toString()
1444
	return len(v) + SizeVarint(uint64(len(v))) + tagsize
1445
}
1446
func sizeStringValueNoZero(ptr pointer, tagsize int) int {
1447
	v := *ptr.toString()
1448
	if v == "" {
1449
		return 0
1450
	}
1451
	return len(v) + SizeVarint(uint64(len(v))) + tagsize
1452
}
1453
func sizeStringPtr(ptr pointer, tagsize int) int {
1454
	p := *ptr.toStringPtr()
1455
	if p == nil {
1456
		return 0
1457
	}
1458
	v := *p
1459
	return len(v) + SizeVarint(uint64(len(v))) + tagsize
1460
}
1461
func sizeStringSlice(ptr pointer, tagsize int) int {
1462
	s := *ptr.toStringSlice()
1463
	n := 0
1464
	for _, v := range s {
1465
		n += len(v) + SizeVarint(uint64(len(v))) + tagsize
1466
	}
1467
	return n
1468
}
1469
func sizeBytes(ptr pointer, tagsize int) int {
1470
	v := *ptr.toBytes()
1471
	if v == nil {
1472
		return 0
1473
	}
1474
	return len(v) + SizeVarint(uint64(len(v))) + tagsize
1475
}
1476
func sizeBytes3(ptr pointer, tagsize int) int {
1477
	v := *ptr.toBytes()
1478
	if len(v) == 0 {
1479
		return 0
1480
	}
1481
	return len(v) + SizeVarint(uint64(len(v))) + tagsize
1482
}
1483
func sizeBytesOneof(ptr pointer, tagsize int) int {
1484
	v := *ptr.toBytes()
1485
	return len(v) + SizeVarint(uint64(len(v))) + tagsize
1486
}
1487
func sizeBytesSlice(ptr pointer, tagsize int) int {
1488
	s := *ptr.toBytesSlice()
1489
	n := 0
1490
	for _, v := range s {
1491
		n += len(v) + SizeVarint(uint64(len(v))) + tagsize
1492
	}
1493
	return n
1494
}
1495

1496
// appendFixed32 appends an encoded fixed32 to b.
1497
func appendFixed32(b []byte, v uint32) []byte {
1498
	b = append(b,
1499
		byte(v),
1500
		byte(v>>8),
1501
		byte(v>>16),
1502
		byte(v>>24))
1503
	return b
1504
}
1505

1506
// appendFixed64 appends an encoded fixed64 to b.
1507
func appendFixed64(b []byte, v uint64) []byte {
1508
	b = append(b,
1509
		byte(v),
1510
		byte(v>>8),
1511
		byte(v>>16),
1512
		byte(v>>24),
1513
		byte(v>>32),
1514
		byte(v>>40),
1515
		byte(v>>48),
1516
		byte(v>>56))
1517
	return b
1518
}
1519

1520
// appendVarint appends an encoded varint to b.
1521
func appendVarint(b []byte, v uint64) []byte {
1522
	// TODO: make 1-byte (maybe 2-byte) case inline-able, once we
1523
	// have non-leaf inliner.
1524
	switch {
1525
	case v < 1<<7:
1526
		b = append(b, byte(v))
1527
	case v < 1<<14:
1528
		b = append(b,
1529
			byte(v&0x7f|0x80),
1530
			byte(v>>7))
1531
	case v < 1<<21:
1532
		b = append(b,
1533
			byte(v&0x7f|0x80),
1534
			byte((v>>7)&0x7f|0x80),
1535
			byte(v>>14))
1536
	case v < 1<<28:
1537
		b = append(b,
1538
			byte(v&0x7f|0x80),
1539
			byte((v>>7)&0x7f|0x80),
1540
			byte((v>>14)&0x7f|0x80),
1541
			byte(v>>21))
1542
	case v < 1<<35:
1543
		b = append(b,
1544
			byte(v&0x7f|0x80),
1545
			byte((v>>7)&0x7f|0x80),
1546
			byte((v>>14)&0x7f|0x80),
1547
			byte((v>>21)&0x7f|0x80),
1548
			byte(v>>28))
1549
	case v < 1<<42:
1550
		b = append(b,
1551
			byte(v&0x7f|0x80),
1552
			byte((v>>7)&0x7f|0x80),
1553
			byte((v>>14)&0x7f|0x80),
1554
			byte((v>>21)&0x7f|0x80),
1555
			byte((v>>28)&0x7f|0x80),
1556
			byte(v>>35))
1557
	case v < 1<<49:
1558
		b = append(b,
1559
			byte(v&0x7f|0x80),
1560
			byte((v>>7)&0x7f|0x80),
1561
			byte((v>>14)&0x7f|0x80),
1562
			byte((v>>21)&0x7f|0x80),
1563
			byte((v>>28)&0x7f|0x80),
1564
			byte((v>>35)&0x7f|0x80),
1565
			byte(v>>42))
1566
	case v < 1<<56:
1567
		b = append(b,
1568
			byte(v&0x7f|0x80),
1569
			byte((v>>7)&0x7f|0x80),
1570
			byte((v>>14)&0x7f|0x80),
1571
			byte((v>>21)&0x7f|0x80),
1572
			byte((v>>28)&0x7f|0x80),
1573
			byte((v>>35)&0x7f|0x80),
1574
			byte((v>>42)&0x7f|0x80),
1575
			byte(v>>49))
1576
	case v < 1<<63:
1577
		b = append(b,
1578
			byte(v&0x7f|0x80),
1579
			byte((v>>7)&0x7f|0x80),
1580
			byte((v>>14)&0x7f|0x80),
1581
			byte((v>>21)&0x7f|0x80),
1582
			byte((v>>28)&0x7f|0x80),
1583
			byte((v>>35)&0x7f|0x80),
1584
			byte((v>>42)&0x7f|0x80),
1585
			byte((v>>49)&0x7f|0x80),
1586
			byte(v>>56))
1587
	default:
1588
		b = append(b,
1589
			byte(v&0x7f|0x80),
1590
			byte((v>>7)&0x7f|0x80),
1591
			byte((v>>14)&0x7f|0x80),
1592
			byte((v>>21)&0x7f|0x80),
1593
			byte((v>>28)&0x7f|0x80),
1594
			byte((v>>35)&0x7f|0x80),
1595
			byte((v>>42)&0x7f|0x80),
1596
			byte((v>>49)&0x7f|0x80),
1597
			byte((v>>56)&0x7f|0x80),
1598
			1)
1599
	}
1600
	return b
1601
}
1602

1603
func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1604
	v := *ptr.toUint32()
1605
	b = appendVarint(b, wiretag)
1606
	b = appendFixed32(b, v)
1607
	return b, nil
1608
}
1609
func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1610
	v := *ptr.toUint32()
1611
	if v == 0 {
1612
		return b, nil
1613
	}
1614
	b = appendVarint(b, wiretag)
1615
	b = appendFixed32(b, v)
1616
	return b, nil
1617
}
1618
func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1619
	p := *ptr.toUint32Ptr()
1620
	if p == nil {
1621
		return b, nil
1622
	}
1623
	b = appendVarint(b, wiretag)
1624
	b = appendFixed32(b, *p)
1625
	return b, nil
1626
}
1627
func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1628
	s := *ptr.toUint32Slice()
1629
	for _, v := range s {
1630
		b = appendVarint(b, wiretag)
1631
		b = appendFixed32(b, v)
1632
	}
1633
	return b, nil
1634
}
1635
func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1636
	s := *ptr.toUint32Slice()
1637
	if len(s) == 0 {
1638
		return b, nil
1639
	}
1640
	b = appendVarint(b, wiretag&^7|WireBytes)
1641
	b = appendVarint(b, uint64(4*len(s)))
1642
	for _, v := range s {
1643
		b = appendFixed32(b, v)
1644
	}
1645
	return b, nil
1646
}
1647
func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1648
	v := *ptr.toInt32()
1649
	b = appendVarint(b, wiretag)
1650
	b = appendFixed32(b, uint32(v))
1651
	return b, nil
1652
}
1653
func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1654
	v := *ptr.toInt32()
1655
	if v == 0 {
1656
		return b, nil
1657
	}
1658
	b = appendVarint(b, wiretag)
1659
	b = appendFixed32(b, uint32(v))
1660
	return b, nil
1661
}
1662
func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1663
	p := ptr.getInt32Ptr()
1664
	if p == nil {
1665
		return b, nil
1666
	}
1667
	b = appendVarint(b, wiretag)
1668
	b = appendFixed32(b, uint32(*p))
1669
	return b, nil
1670
}
1671
func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1672
	s := ptr.getInt32Slice()
1673
	for _, v := range s {
1674
		b = appendVarint(b, wiretag)
1675
		b = appendFixed32(b, uint32(v))
1676
	}
1677
	return b, nil
1678
}
1679
func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1680
	s := ptr.getInt32Slice()
1681
	if len(s) == 0 {
1682
		return b, nil
1683
	}
1684
	b = appendVarint(b, wiretag&^7|WireBytes)
1685
	b = appendVarint(b, uint64(4*len(s)))
1686
	for _, v := range s {
1687
		b = appendFixed32(b, uint32(v))
1688
	}
1689
	return b, nil
1690
}
1691
func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1692
	v := math.Float32bits(*ptr.toFloat32())
1693
	b = appendVarint(b, wiretag)
1694
	b = appendFixed32(b, v)
1695
	return b, nil
1696
}
1697
func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1698
	v := math.Float32bits(*ptr.toFloat32())
1699
	if v == 0 {
1700
		return b, nil
1701
	}
1702
	b = appendVarint(b, wiretag)
1703
	b = appendFixed32(b, v)
1704
	return b, nil
1705
}
1706
func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1707
	p := *ptr.toFloat32Ptr()
1708
	if p == nil {
1709
		return b, nil
1710
	}
1711
	b = appendVarint(b, wiretag)
1712
	b = appendFixed32(b, math.Float32bits(*p))
1713
	return b, nil
1714
}
1715
func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1716
	s := *ptr.toFloat32Slice()
1717
	for _, v := range s {
1718
		b = appendVarint(b, wiretag)
1719
		b = appendFixed32(b, math.Float32bits(v))
1720
	}
1721
	return b, nil
1722
}
1723
func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1724
	s := *ptr.toFloat32Slice()
1725
	if len(s) == 0 {
1726
		return b, nil
1727
	}
1728
	b = appendVarint(b, wiretag&^7|WireBytes)
1729
	b = appendVarint(b, uint64(4*len(s)))
1730
	for _, v := range s {
1731
		b = appendFixed32(b, math.Float32bits(v))
1732
	}
1733
	return b, nil
1734
}
1735
func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1736
	v := *ptr.toUint64()
1737
	b = appendVarint(b, wiretag)
1738
	b = appendFixed64(b, v)
1739
	return b, nil
1740
}
1741
func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1742
	v := *ptr.toUint64()
1743
	if v == 0 {
1744
		return b, nil
1745
	}
1746
	b = appendVarint(b, wiretag)
1747
	b = appendFixed64(b, v)
1748
	return b, nil
1749
}
1750
func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1751
	p := *ptr.toUint64Ptr()
1752
	if p == nil {
1753
		return b, nil
1754
	}
1755
	b = appendVarint(b, wiretag)
1756
	b = appendFixed64(b, *p)
1757
	return b, nil
1758
}
1759
func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1760
	s := *ptr.toUint64Slice()
1761
	for _, v := range s {
1762
		b = appendVarint(b, wiretag)
1763
		b = appendFixed64(b, v)
1764
	}
1765
	return b, nil
1766
}
1767
func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1768
	s := *ptr.toUint64Slice()
1769
	if len(s) == 0 {
1770
		return b, nil
1771
	}
1772
	b = appendVarint(b, wiretag&^7|WireBytes)
1773
	b = appendVarint(b, uint64(8*len(s)))
1774
	for _, v := range s {
1775
		b = appendFixed64(b, v)
1776
	}
1777
	return b, nil
1778
}
1779
func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1780
	v := *ptr.toInt64()
1781
	b = appendVarint(b, wiretag)
1782
	b = appendFixed64(b, uint64(v))
1783
	return b, nil
1784
}
1785
func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1786
	v := *ptr.toInt64()
1787
	if v == 0 {
1788
		return b, nil
1789
	}
1790
	b = appendVarint(b, wiretag)
1791
	b = appendFixed64(b, uint64(v))
1792
	return b, nil
1793
}
1794
func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1795
	p := *ptr.toInt64Ptr()
1796
	if p == nil {
1797
		return b, nil
1798
	}
1799
	b = appendVarint(b, wiretag)
1800
	b = appendFixed64(b, uint64(*p))
1801
	return b, nil
1802
}
1803
func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1804
	s := *ptr.toInt64Slice()
1805
	for _, v := range s {
1806
		b = appendVarint(b, wiretag)
1807
		b = appendFixed64(b, uint64(v))
1808
	}
1809
	return b, nil
1810
}
1811
func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1812
	s := *ptr.toInt64Slice()
1813
	if len(s) == 0 {
1814
		return b, nil
1815
	}
1816
	b = appendVarint(b, wiretag&^7|WireBytes)
1817
	b = appendVarint(b, uint64(8*len(s)))
1818
	for _, v := range s {
1819
		b = appendFixed64(b, uint64(v))
1820
	}
1821
	return b, nil
1822
}
1823
func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1824
	v := math.Float64bits(*ptr.toFloat64())
1825
	b = appendVarint(b, wiretag)
1826
	b = appendFixed64(b, v)
1827
	return b, nil
1828
}
1829
func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1830
	v := math.Float64bits(*ptr.toFloat64())
1831
	if v == 0 {
1832
		return b, nil
1833
	}
1834
	b = appendVarint(b, wiretag)
1835
	b = appendFixed64(b, v)
1836
	return b, nil
1837
}
1838
func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1839
	p := *ptr.toFloat64Ptr()
1840
	if p == nil {
1841
		return b, nil
1842
	}
1843
	b = appendVarint(b, wiretag)
1844
	b = appendFixed64(b, math.Float64bits(*p))
1845
	return b, nil
1846
}
1847
func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1848
	s := *ptr.toFloat64Slice()
1849
	for _, v := range s {
1850
		b = appendVarint(b, wiretag)
1851
		b = appendFixed64(b, math.Float64bits(v))
1852
	}
1853
	return b, nil
1854
}
1855
func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1856
	s := *ptr.toFloat64Slice()
1857
	if len(s) == 0 {
1858
		return b, nil
1859
	}
1860
	b = appendVarint(b, wiretag&^7|WireBytes)
1861
	b = appendVarint(b, uint64(8*len(s)))
1862
	for _, v := range s {
1863
		b = appendFixed64(b, math.Float64bits(v))
1864
	}
1865
	return b, nil
1866
}
1867
func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1868
	v := *ptr.toUint32()
1869
	b = appendVarint(b, wiretag)
1870
	b = appendVarint(b, uint64(v))
1871
	return b, nil
1872
}
1873
func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1874
	v := *ptr.toUint32()
1875
	if v == 0 {
1876
		return b, nil
1877
	}
1878
	b = appendVarint(b, wiretag)
1879
	b = appendVarint(b, uint64(v))
1880
	return b, nil
1881
}
1882
func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1883
	p := *ptr.toUint32Ptr()
1884
	if p == nil {
1885
		return b, nil
1886
	}
1887
	b = appendVarint(b, wiretag)
1888
	b = appendVarint(b, uint64(*p))
1889
	return b, nil
1890
}
1891
func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1892
	s := *ptr.toUint32Slice()
1893
	for _, v := range s {
1894
		b = appendVarint(b, wiretag)
1895
		b = appendVarint(b, uint64(v))
1896
	}
1897
	return b, nil
1898
}
1899
func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1900
	s := *ptr.toUint32Slice()
1901
	if len(s) == 0 {
1902
		return b, nil
1903
	}
1904
	b = appendVarint(b, wiretag&^7|WireBytes)
1905
	// compute size
1906
	n := 0
1907
	for _, v := range s {
1908
		n += SizeVarint(uint64(v))
1909
	}
1910
	b = appendVarint(b, uint64(n))
1911
	for _, v := range s {
1912
		b = appendVarint(b, uint64(v))
1913
	}
1914
	return b, nil
1915
}
1916
func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1917
	v := *ptr.toInt32()
1918
	b = appendVarint(b, wiretag)
1919
	b = appendVarint(b, uint64(v))
1920
	return b, nil
1921
}
1922
func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1923
	v := *ptr.toInt32()
1924
	if v == 0 {
1925
		return b, nil
1926
	}
1927
	b = appendVarint(b, wiretag)
1928
	b = appendVarint(b, uint64(v))
1929
	return b, nil
1930
}
1931
func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1932
	p := ptr.getInt32Ptr()
1933
	if p == nil {
1934
		return b, nil
1935
	}
1936
	b = appendVarint(b, wiretag)
1937
	b = appendVarint(b, uint64(*p))
1938
	return b, nil
1939
}
1940
func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1941
	s := ptr.getInt32Slice()
1942
	for _, v := range s {
1943
		b = appendVarint(b, wiretag)
1944
		b = appendVarint(b, uint64(v))
1945
	}
1946
	return b, nil
1947
}
1948
func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1949
	s := ptr.getInt32Slice()
1950
	if len(s) == 0 {
1951
		return b, nil
1952
	}
1953
	b = appendVarint(b, wiretag&^7|WireBytes)
1954
	// compute size
1955
	n := 0
1956
	for _, v := range s {
1957
		n += SizeVarint(uint64(v))
1958
	}
1959
	b = appendVarint(b, uint64(n))
1960
	for _, v := range s {
1961
		b = appendVarint(b, uint64(v))
1962
	}
1963
	return b, nil
1964
}
1965
func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1966
	v := *ptr.toUint64()
1967
	b = appendVarint(b, wiretag)
1968
	b = appendVarint(b, v)
1969
	return b, nil
1970
}
1971
func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1972
	v := *ptr.toUint64()
1973
	if v == 0 {
1974
		return b, nil
1975
	}
1976
	b = appendVarint(b, wiretag)
1977
	b = appendVarint(b, v)
1978
	return b, nil
1979
}
1980
func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1981
	p := *ptr.toUint64Ptr()
1982
	if p == nil {
1983
		return b, nil
1984
	}
1985
	b = appendVarint(b, wiretag)
1986
	b = appendVarint(b, *p)
1987
	return b, nil
1988
}
1989
func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1990
	s := *ptr.toUint64Slice()
1991
	for _, v := range s {
1992
		b = appendVarint(b, wiretag)
1993
		b = appendVarint(b, v)
1994
	}
1995
	return b, nil
1996
}
1997
func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
1998
	s := *ptr.toUint64Slice()
1999
	if len(s) == 0 {
2000
		return b, nil
2001
	}
2002
	b = appendVarint(b, wiretag&^7|WireBytes)
2003
	// compute size
2004
	n := 0
2005
	for _, v := range s {
2006
		n += SizeVarint(v)
2007
	}
2008
	b = appendVarint(b, uint64(n))
2009
	for _, v := range s {
2010
		b = appendVarint(b, v)
2011
	}
2012
	return b, nil
2013
}
2014
func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2015
	v := *ptr.toInt64()
2016
	b = appendVarint(b, wiretag)
2017
	b = appendVarint(b, uint64(v))
2018
	return b, nil
2019
}
2020
func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2021
	v := *ptr.toInt64()
2022
	if v == 0 {
2023
		return b, nil
2024
	}
2025
	b = appendVarint(b, wiretag)
2026
	b = appendVarint(b, uint64(v))
2027
	return b, nil
2028
}
2029
func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2030
	p := *ptr.toInt64Ptr()
2031
	if p == nil {
2032
		return b, nil
2033
	}
2034
	b = appendVarint(b, wiretag)
2035
	b = appendVarint(b, uint64(*p))
2036
	return b, nil
2037
}
2038
func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2039
	s := *ptr.toInt64Slice()
2040
	for _, v := range s {
2041
		b = appendVarint(b, wiretag)
2042
		b = appendVarint(b, uint64(v))
2043
	}
2044
	return b, nil
2045
}
2046
func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2047
	s := *ptr.toInt64Slice()
2048
	if len(s) == 0 {
2049
		return b, nil
2050
	}
2051
	b = appendVarint(b, wiretag&^7|WireBytes)
2052
	// compute size
2053
	n := 0
2054
	for _, v := range s {
2055
		n += SizeVarint(uint64(v))
2056
	}
2057
	b = appendVarint(b, uint64(n))
2058
	for _, v := range s {
2059
		b = appendVarint(b, uint64(v))
2060
	}
2061
	return b, nil
2062
}
2063
func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2064
	v := *ptr.toInt32()
2065
	b = appendVarint(b, wiretag)
2066
	b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2067
	return b, nil
2068
}
2069
func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2070
	v := *ptr.toInt32()
2071
	if v == 0 {
2072
		return b, nil
2073
	}
2074
	b = appendVarint(b, wiretag)
2075
	b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2076
	return b, nil
2077
}
2078
func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2079
	p := ptr.getInt32Ptr()
2080
	if p == nil {
2081
		return b, nil
2082
	}
2083
	b = appendVarint(b, wiretag)
2084
	v := *p
2085
	b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2086
	return b, nil
2087
}
2088
func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2089
	s := ptr.getInt32Slice()
2090
	for _, v := range s {
2091
		b = appendVarint(b, wiretag)
2092
		b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2093
	}
2094
	return b, nil
2095
}
2096
func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2097
	s := ptr.getInt32Slice()
2098
	if len(s) == 0 {
2099
		return b, nil
2100
	}
2101
	b = appendVarint(b, wiretag&^7|WireBytes)
2102
	// compute size
2103
	n := 0
2104
	for _, v := range s {
2105
		n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31))))
2106
	}
2107
	b = appendVarint(b, uint64(n))
2108
	for _, v := range s {
2109
		b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31))))
2110
	}
2111
	return b, nil
2112
}
2113
func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2114
	v := *ptr.toInt64()
2115
	b = appendVarint(b, wiretag)
2116
	b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2117
	return b, nil
2118
}
2119
func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2120
	v := *ptr.toInt64()
2121
	if v == 0 {
2122
		return b, nil
2123
	}
2124
	b = appendVarint(b, wiretag)
2125
	b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2126
	return b, nil
2127
}
2128
func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2129
	p := *ptr.toInt64Ptr()
2130
	if p == nil {
2131
		return b, nil
2132
	}
2133
	b = appendVarint(b, wiretag)
2134
	v := *p
2135
	b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2136
	return b, nil
2137
}
2138
func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2139
	s := *ptr.toInt64Slice()
2140
	for _, v := range s {
2141
		b = appendVarint(b, wiretag)
2142
		b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2143
	}
2144
	return b, nil
2145
}
2146
func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2147
	s := *ptr.toInt64Slice()
2148
	if len(s) == 0 {
2149
		return b, nil
2150
	}
2151
	b = appendVarint(b, wiretag&^7|WireBytes)
2152
	// compute size
2153
	n := 0
2154
	for _, v := range s {
2155
		n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63)))
2156
	}
2157
	b = appendVarint(b, uint64(n))
2158
	for _, v := range s {
2159
		b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63)))
2160
	}
2161
	return b, nil
2162
}
2163
func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2164
	v := *ptr.toBool()
2165
	b = appendVarint(b, wiretag)
2166
	if v {
2167
		b = append(b, 1)
2168
	} else {
2169
		b = append(b, 0)
2170
	}
2171
	return b, nil
2172
}
2173
func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2174
	v := *ptr.toBool()
2175
	if !v {
2176
		return b, nil
2177
	}
2178
	b = appendVarint(b, wiretag)
2179
	b = append(b, 1)
2180
	return b, nil
2181
}
2182

2183
func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2184
	p := *ptr.toBoolPtr()
2185
	if p == nil {
2186
		return b, nil
2187
	}
2188
	b = appendVarint(b, wiretag)
2189
	if *p {
2190
		b = append(b, 1)
2191
	} else {
2192
		b = append(b, 0)
2193
	}
2194
	return b, nil
2195
}
2196
func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2197
	s := *ptr.toBoolSlice()
2198
	for _, v := range s {
2199
		b = appendVarint(b, wiretag)
2200
		if v {
2201
			b = append(b, 1)
2202
		} else {
2203
			b = append(b, 0)
2204
		}
2205
	}
2206
	return b, nil
2207
}
2208
func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2209
	s := *ptr.toBoolSlice()
2210
	if len(s) == 0 {
2211
		return b, nil
2212
	}
2213
	b = appendVarint(b, wiretag&^7|WireBytes)
2214
	b = appendVarint(b, uint64(len(s)))
2215
	for _, v := range s {
2216
		if v {
2217
			b = append(b, 1)
2218
		} else {
2219
			b = append(b, 0)
2220
		}
2221
	}
2222
	return b, nil
2223
}
2224
func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2225
	v := *ptr.toString()
2226
	b = appendVarint(b, wiretag)
2227
	b = appendVarint(b, uint64(len(v)))
2228
	b = append(b, v...)
2229
	return b, nil
2230
}
2231
func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2232
	v := *ptr.toString()
2233
	if v == "" {
2234
		return b, nil
2235
	}
2236
	b = appendVarint(b, wiretag)
2237
	b = appendVarint(b, uint64(len(v)))
2238
	b = append(b, v...)
2239
	return b, nil
2240
}
2241
func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2242
	p := *ptr.toStringPtr()
2243
	if p == nil {
2244
		return b, nil
2245
	}
2246
	v := *p
2247
	b = appendVarint(b, wiretag)
2248
	b = appendVarint(b, uint64(len(v)))
2249
	b = append(b, v...)
2250
	return b, nil
2251
}
2252
func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2253
	s := *ptr.toStringSlice()
2254
	for _, v := range s {
2255
		b = appendVarint(b, wiretag)
2256
		b = appendVarint(b, uint64(len(v)))
2257
		b = append(b, v...)
2258
	}
2259
	return b, nil
2260
}
2261
func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2262
	var invalidUTF8 bool
2263
	v := *ptr.toString()
2264
	if !utf8.ValidString(v) {
2265
		invalidUTF8 = true
2266
	}
2267
	b = appendVarint(b, wiretag)
2268
	b = appendVarint(b, uint64(len(v)))
2269
	b = append(b, v...)
2270
	if invalidUTF8 {
2271
		return b, errInvalidUTF8
2272
	}
2273
	return b, nil
2274
}
2275
func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2276
	var invalidUTF8 bool
2277
	v := *ptr.toString()
2278
	if v == "" {
2279
		return b, nil
2280
	}
2281
	if !utf8.ValidString(v) {
2282
		invalidUTF8 = true
2283
	}
2284
	b = appendVarint(b, wiretag)
2285
	b = appendVarint(b, uint64(len(v)))
2286
	b = append(b, v...)
2287
	if invalidUTF8 {
2288
		return b, errInvalidUTF8
2289
	}
2290
	return b, nil
2291
}
2292
func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2293
	var invalidUTF8 bool
2294
	p := *ptr.toStringPtr()
2295
	if p == nil {
2296
		return b, nil
2297
	}
2298
	v := *p
2299
	if !utf8.ValidString(v) {
2300
		invalidUTF8 = true
2301
	}
2302
	b = appendVarint(b, wiretag)
2303
	b = appendVarint(b, uint64(len(v)))
2304
	b = append(b, v...)
2305
	if invalidUTF8 {
2306
		return b, errInvalidUTF8
2307
	}
2308
	return b, nil
2309
}
2310
func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2311
	var invalidUTF8 bool
2312
	s := *ptr.toStringSlice()
2313
	for _, v := range s {
2314
		if !utf8.ValidString(v) {
2315
			invalidUTF8 = true
2316
		}
2317
		b = appendVarint(b, wiretag)
2318
		b = appendVarint(b, uint64(len(v)))
2319
		b = append(b, v...)
2320
	}
2321
	if invalidUTF8 {
2322
		return b, errInvalidUTF8
2323
	}
2324
	return b, nil
2325
}
2326
func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2327
	v := *ptr.toBytes()
2328
	if v == nil {
2329
		return b, nil
2330
	}
2331
	b = appendVarint(b, wiretag)
2332
	b = appendVarint(b, uint64(len(v)))
2333
	b = append(b, v...)
2334
	return b, nil
2335
}
2336
func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2337
	v := *ptr.toBytes()
2338
	if len(v) == 0 {
2339
		return b, nil
2340
	}
2341
	b = appendVarint(b, wiretag)
2342
	b = appendVarint(b, uint64(len(v)))
2343
	b = append(b, v...)
2344
	return b, nil
2345
}
2346
func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2347
	v := *ptr.toBytes()
2348
	b = appendVarint(b, wiretag)
2349
	b = appendVarint(b, uint64(len(v)))
2350
	b = append(b, v...)
2351
	return b, nil
2352
}
2353
func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) {
2354
	s := *ptr.toBytesSlice()
2355
	for _, v := range s {
2356
		b = appendVarint(b, wiretag)
2357
		b = appendVarint(b, uint64(len(v)))
2358
		b = append(b, v...)
2359
	}
2360
	return b, nil
2361
}
2362

2363
// makeGroupMarshaler returns the sizer and marshaler for a group.
2364
// u is the marshal info of the underlying message.
2365
func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) {
2366
	return func(ptr pointer, tagsize int) int {
2367
			p := ptr.getPointer()
2368
			if p.isNil() {
2369
				return 0
2370
			}
2371
			return u.size(p) + 2*tagsize
2372
		},
2373
		func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) {
2374
			p := ptr.getPointer()
2375
			if p.isNil() {
2376
				return b, nil
2377
			}
2378
			var err error
2379
			b = appendVarint(b, wiretag) // start group
2380
			b, err = u.marshal(b, p, deterministic)
2381
			b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group
2382
			return b, err
2383
		}
2384
}
2385

2386
// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice.
2387
// u is the marshal info of the underlying message.
2388
func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) {
2389
	return func(ptr pointer, tagsize int) int {
2390
			s := ptr.getPointerSlice()
2391
			n := 0
2392
			for _, v := range s {
2393
				if v.isNil() {
2394
					continue
2395
				}
2396
				n += u.size(v) + 2*tagsize
2397
			}
2398
			return n
2399
		},
2400
		func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) {
2401
			s := ptr.getPointerSlice()
2402
			var err error
2403
			var nerr nonFatal
2404
			for _, v := range s {
2405
				if v.isNil() {
2406
					return b, errRepeatedHasNil
2407
				}
2408
				b = appendVarint(b, wiretag) // start group
2409
				b, err = u.marshal(b, v, deterministic)
2410
				b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group
2411
				if !nerr.Merge(err) {
2412
					if err == ErrNil {
2413
						err = errRepeatedHasNil
2414
					}
2415
					return b, err
2416
				}
2417
			}
2418
			return b, nerr.E
2419
		}
2420
}
2421

2422
// makeMessageMarshaler returns the sizer and marshaler for a message field.
2423
// u is the marshal info of the message.
2424
func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) {
2425
	return func(ptr pointer, tagsize int) int {
2426
			p := ptr.getPointer()
2427
			if p.isNil() {
2428
				return 0
2429
			}
2430
			siz := u.size(p)
2431
			return siz + SizeVarint(uint64(siz)) + tagsize
2432
		},
2433
		func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) {
2434
			p := ptr.getPointer()
2435
			if p.isNil() {
2436
				return b, nil
2437
			}
2438
			b = appendVarint(b, wiretag)
2439
			siz := u.cachedsize(p)
2440
			b = appendVarint(b, uint64(siz))
2441
			return u.marshal(b, p, deterministic)
2442
		}
2443
}
2444

2445
// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice.
2446
// u is the marshal info of the message.
2447
func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) {
2448
	return func(ptr pointer, tagsize int) int {
2449
			s := ptr.getPointerSlice()
2450
			n := 0
2451
			for _, v := range s {
2452
				if v.isNil() {
2453
					continue
2454
				}
2455
				siz := u.size(v)
2456
				n += siz + SizeVarint(uint64(siz)) + tagsize
2457
			}
2458
			return n
2459
		},
2460
		func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) {
2461
			s := ptr.getPointerSlice()
2462
			var err error
2463
			var nerr nonFatal
2464
			for _, v := range s {
2465
				if v.isNil() {
2466
					return b, errRepeatedHasNil
2467
				}
2468
				b = appendVarint(b, wiretag)
2469
				siz := u.cachedsize(v)
2470
				b = appendVarint(b, uint64(siz))
2471
				b, err = u.marshal(b, v, deterministic)
2472

2473
				if !nerr.Merge(err) {
2474
					if err == ErrNil {
2475
						err = errRepeatedHasNil
2476
					}
2477
					return b, err
2478
				}
2479
			}
2480
			return b, nerr.E
2481
		}
2482
}
2483

2484
// makeMapMarshaler returns the sizer and marshaler for a map field.
2485
// f is the pointer to the reflect data structure of the field.
2486
func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) {
2487
	// figure out key and value type
2488
	t := f.Type
2489
	keyType := t.Key()
2490
	valType := t.Elem()
2491
	tags := strings.Split(f.Tag.Get("protobuf"), ",")
2492
	keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",")
2493
	valTags := strings.Split(f.Tag.Get("protobuf_val"), ",")
2494
	stdOptions := false
2495
	for _, t := range tags {
2496
		if strings.HasPrefix(t, "customtype=") {
2497
			valTags = append(valTags, t)
2498
		}
2499
		if t == "stdtime" {
2500
			valTags = append(valTags, t)
2501
			stdOptions = true
2502
		}
2503
		if t == "stdduration" {
2504
			valTags = append(valTags, t)
2505
			stdOptions = true
2506
		}
2507
		if t == "wktptr" {
2508
			valTags = append(valTags, t)
2509
		}
2510
	}
2511
	keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map
2512
	valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map
2513
	keyWireTag := 1<<3 | wiretype(keyTags[0])
2514
	valWireTag := 2<<3 | wiretype(valTags[0])
2515

2516
	// We create an interface to get the addresses of the map key and value.
2517
	// If value is pointer-typed, the interface is a direct interface, the
2518
	// idata itself is the value. Otherwise, the idata is the pointer to the
2519
	// value.
2520
	// Key cannot be pointer-typed.
2521
	valIsPtr := valType.Kind() == reflect.Ptr
2522

2523
	// If value is a message with nested maps, calling
2524
	// valSizer in marshal may be quadratic. We should use
2525
	// cached version in marshal (but not in size).
2526
	// If value is not message type, we don't have size cache,
2527
	// but it cannot be nested either. Just use valSizer.
2528
	valCachedSizer := valSizer
2529
	if valIsPtr && !stdOptions && valType.Elem().Kind() == reflect.Struct {
2530
		u := getMarshalInfo(valType.Elem())
2531
		valCachedSizer = func(ptr pointer, tagsize int) int {
2532
			// Same as message sizer, but use cache.
2533
			p := ptr.getPointer()
2534
			if p.isNil() {
2535
				return 0
2536
			}
2537
			siz := u.cachedsize(p)
2538
			return siz + SizeVarint(uint64(siz)) + tagsize
2539
		}
2540
	}
2541
	return func(ptr pointer, tagsize int) int {
2542
			m := ptr.asPointerTo(t).Elem() // the map
2543
			n := 0
2544
			for _, k := range m.MapKeys() {
2545
				ki := k.Interface()
2546
				vi := m.MapIndex(k).Interface()
2547
				kaddr := toAddrPointer(&ki, false)             // pointer to key
2548
				vaddr := toAddrPointer(&vi, valIsPtr)          // pointer to value
2549
				siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
2550
				n += siz + SizeVarint(uint64(siz)) + tagsize
2551
			}
2552
			return n
2553
		},
2554
		func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) {
2555
			m := ptr.asPointerTo(t).Elem() // the map
2556
			var err error
2557
			keys := m.MapKeys()
2558
			if len(keys) > 1 && deterministic {
2559
				sort.Sort(mapKeys(keys))
2560
			}
2561

2562
			var nerr nonFatal
2563
			for _, k := range keys {
2564
				ki := k.Interface()
2565
				vi := m.MapIndex(k).Interface()
2566
				kaddr := toAddrPointer(&ki, false)    // pointer to key
2567
				vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value
2568
				b = appendVarint(b, tag)
2569
				siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
2570
				b = appendVarint(b, uint64(siz))
2571
				b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic)
2572
				if !nerr.Merge(err) {
2573
					return b, err
2574
				}
2575
				b, err = valMarshaler(b, vaddr, valWireTag, deterministic)
2576
				if err != ErrNil && !nerr.Merge(err) { // allow nil value in map
2577
					return b, err
2578
				}
2579
			}
2580
			return b, nerr.E
2581
		}
2582
}
2583

2584
// makeOneOfMarshaler returns the sizer and marshaler for a oneof field.
2585
// fi is the marshal info of the field.
2586
// f is the pointer to the reflect data structure of the field.
2587
func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) {
2588
	// Oneof field is an interface. We need to get the actual data type on the fly.
2589
	t := f.Type
2590
	return func(ptr pointer, _ int) int {
2591
			p := ptr.getInterfacePointer()
2592
			if p.isNil() {
2593
				return 0
2594
			}
2595
			v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct
2596
			telem := v.Type()
2597
			e := fi.oneofElems[telem]
2598
			return e.sizer(p, e.tagsize)
2599
		},
2600
		func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) {
2601
			p := ptr.getInterfacePointer()
2602
			if p.isNil() {
2603
				return b, nil
2604
			}
2605
			v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct
2606
			telem := v.Type()
2607
			if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() {
2608
				return b, errOneofHasNil
2609
			}
2610
			e := fi.oneofElems[telem]
2611
			return e.marshaler(b, p, e.wiretag, deterministic)
2612
		}
2613
}
2614

2615
// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field.
2616
func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int {
2617
	m, mu := ext.extensionsRead()
2618
	if m == nil {
2619
		return 0
2620
	}
2621
	mu.Lock()
2622

2623
	n := 0
2624
	for _, e := range m {
2625
		if e.value == nil || e.desc == nil {
2626
			// Extension is only in its encoded form.
2627
			n += len(e.enc)
2628
			continue
2629
		}
2630

2631
		// We don't skip extensions that have an encoded form set,
2632
		// because the extension value may have been mutated after
2633
		// the last time this function was called.
2634
		ei := u.getExtElemInfo(e.desc)
2635
		v := e.value
2636
		p := toAddrPointer(&v, ei.isptr)
2637
		n += ei.sizer(p, ei.tagsize)
2638
	}
2639
	mu.Unlock()
2640
	return n
2641
}
2642

2643
// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b.
2644
func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) {
2645
	m, mu := ext.extensionsRead()
2646
	if m == nil {
2647
		return b, nil
2648
	}
2649
	mu.Lock()
2650
	defer mu.Unlock()
2651

2652
	var err error
2653
	var nerr nonFatal
2654

2655
	// Fast-path for common cases: zero or one extensions.
2656
	// Don't bother sorting the keys.
2657
	if len(m) <= 1 {
2658
		for _, e := range m {
2659
			if e.value == nil || e.desc == nil {
2660
				// Extension is only in its encoded form.
2661
				b = append(b, e.enc...)
2662
				continue
2663
			}
2664

2665
			// We don't skip extensions that have an encoded form set,
2666
			// because the extension value may have been mutated after
2667
			// the last time this function was called.
2668

2669
			ei := u.getExtElemInfo(e.desc)
2670
			v := e.value
2671
			p := toAddrPointer(&v, ei.isptr)
2672
			b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
2673
			if !nerr.Merge(err) {
2674
				return b, err
2675
			}
2676
		}
2677
		return b, nerr.E
2678
	}
2679

2680
	// Sort the keys to provide a deterministic encoding.
2681
	// Not sure this is required, but the old code does it.
2682
	keys := make([]int, 0, len(m))
2683
	for k := range m {
2684
		keys = append(keys, int(k))
2685
	}
2686
	sort.Ints(keys)
2687

2688
	for _, k := range keys {
2689
		e := m[int32(k)]
2690
		if e.value == nil || e.desc == nil {
2691
			// Extension is only in its encoded form.
2692
			b = append(b, e.enc...)
2693
			continue
2694
		}
2695

2696
		// We don't skip extensions that have an encoded form set,
2697
		// because the extension value may have been mutated after
2698
		// the last time this function was called.
2699

2700
		ei := u.getExtElemInfo(e.desc)
2701
		v := e.value
2702
		p := toAddrPointer(&v, ei.isptr)
2703
		b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
2704
		if !nerr.Merge(err) {
2705
			return b, err
2706
		}
2707
	}
2708
	return b, nerr.E
2709
}
2710

2711
// message set format is:
2712
//   message MessageSet {
2713
//     repeated group Item = 1 {
2714
//       required int32 type_id = 2;
2715
//       required string message = 3;
2716
//     };
2717
//   }
2718

2719
// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field
2720
// in message set format (above).
2721
func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int {
2722
	m, mu := ext.extensionsRead()
2723
	if m == nil {
2724
		return 0
2725
	}
2726
	mu.Lock()
2727

2728
	n := 0
2729
	for id, e := range m {
2730
		n += 2                          // start group, end group. tag = 1 (size=1)
2731
		n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1)
2732

2733
		if e.value == nil || e.desc == nil {
2734
			// Extension is only in its encoded form.
2735
			msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint
2736
			siz := len(msgWithLen)
2737
			n += siz + 1 // message, tag = 3 (size=1)
2738
			continue
2739
		}
2740

2741
		// We don't skip extensions that have an encoded form set,
2742
		// because the extension value may have been mutated after
2743
		// the last time this function was called.
2744

2745
		ei := u.getExtElemInfo(e.desc)
2746
		v := e.value
2747
		p := toAddrPointer(&v, ei.isptr)
2748
		n += ei.sizer(p, 1) // message, tag = 3 (size=1)
2749
	}
2750
	mu.Unlock()
2751
	return n
2752
}
2753

2754
// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above)
2755
// to the end of byte slice b.
2756
func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) {
2757
	m, mu := ext.extensionsRead()
2758
	if m == nil {
2759
		return b, nil
2760
	}
2761
	mu.Lock()
2762
	defer mu.Unlock()
2763

2764
	var err error
2765
	var nerr nonFatal
2766

2767
	// Fast-path for common cases: zero or one extensions.
2768
	// Don't bother sorting the keys.
2769
	if len(m) <= 1 {
2770
		for id, e := range m {
2771
			b = append(b, 1<<3|WireStartGroup)
2772
			b = append(b, 2<<3|WireVarint)
2773
			b = appendVarint(b, uint64(id))
2774

2775
			if e.value == nil || e.desc == nil {
2776
				// Extension is only in its encoded form.
2777
				msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint
2778
				b = append(b, 3<<3|WireBytes)
2779
				b = append(b, msgWithLen...)
2780
				b = append(b, 1<<3|WireEndGroup)
2781
				continue
2782
			}
2783

2784
			// We don't skip extensions that have an encoded form set,
2785
			// because the extension value may have been mutated after
2786
			// the last time this function was called.
2787

2788
			ei := u.getExtElemInfo(e.desc)
2789
			v := e.value
2790
			p := toAddrPointer(&v, ei.isptr)
2791
			b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
2792
			if !nerr.Merge(err) {
2793
				return b, err
2794
			}
2795
			b = append(b, 1<<3|WireEndGroup)
2796
		}
2797
		return b, nerr.E
2798
	}
2799

2800
	// Sort the keys to provide a deterministic encoding.
2801
	keys := make([]int, 0, len(m))
2802
	for k := range m {
2803
		keys = append(keys, int(k))
2804
	}
2805
	sort.Ints(keys)
2806

2807
	for _, id := range keys {
2808
		e := m[int32(id)]
2809
		b = append(b, 1<<3|WireStartGroup)
2810
		b = append(b, 2<<3|WireVarint)
2811
		b = appendVarint(b, uint64(id))
2812

2813
		if e.value == nil || e.desc == nil {
2814
			// Extension is only in its encoded form.
2815
			msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint
2816
			b = append(b, 3<<3|WireBytes)
2817
			b = append(b, msgWithLen...)
2818
			b = append(b, 1<<3|WireEndGroup)
2819
			continue
2820
		}
2821

2822
		// We don't skip extensions that have an encoded form set,
2823
		// because the extension value may have been mutated after
2824
		// the last time this function was called.
2825

2826
		ei := u.getExtElemInfo(e.desc)
2827
		v := e.value
2828
		p := toAddrPointer(&v, ei.isptr)
2829
		b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
2830
		b = append(b, 1<<3|WireEndGroup)
2831
		if !nerr.Merge(err) {
2832
			return b, err
2833
		}
2834
	}
2835
	return b, nerr.E
2836
}
2837

2838
// sizeV1Extensions computes the size of encoded data for a V1-API extension field.
2839
func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int {
2840
	if m == nil {
2841
		return 0
2842
	}
2843

2844
	n := 0
2845
	for _, e := range m {
2846
		if e.value == nil || e.desc == nil {
2847
			// Extension is only in its encoded form.
2848
			n += len(e.enc)
2849
			continue
2850
		}
2851

2852
		// We don't skip extensions that have an encoded form set,
2853
		// because the extension value may have been mutated after
2854
		// the last time this function was called.
2855

2856
		ei := u.getExtElemInfo(e.desc)
2857
		v := e.value
2858
		p := toAddrPointer(&v, ei.isptr)
2859
		n += ei.sizer(p, ei.tagsize)
2860
	}
2861
	return n
2862
}
2863

2864
// appendV1Extensions marshals a V1-API extension field to the end of byte slice b.
2865
func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) {
2866
	if m == nil {
2867
		return b, nil
2868
	}
2869

2870
	// Sort the keys to provide a deterministic encoding.
2871
	keys := make([]int, 0, len(m))
2872
	for k := range m {
2873
		keys = append(keys, int(k))
2874
	}
2875
	sort.Ints(keys)
2876

2877
	var err error
2878
	var nerr nonFatal
2879
	for _, k := range keys {
2880
		e := m[int32(k)]
2881
		if e.value == nil || e.desc == nil {
2882
			// Extension is only in its encoded form.
2883
			b = append(b, e.enc...)
2884
			continue
2885
		}
2886

2887
		// We don't skip extensions that have an encoded form set,
2888
		// because the extension value may have been mutated after
2889
		// the last time this function was called.
2890

2891
		ei := u.getExtElemInfo(e.desc)
2892
		v := e.value
2893
		p := toAddrPointer(&v, ei.isptr)
2894
		b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
2895
		if !nerr.Merge(err) {
2896
			return b, err
2897
		}
2898
	}
2899
	return b, nerr.E
2900
}
2901

2902
// newMarshaler is the interface representing objects that can marshal themselves.
2903
//
2904
// This exists to support protoc-gen-go generated messages.
2905
// The proto package will stop type-asserting to this interface in the future.
2906
//
2907
// DO NOT DEPEND ON THIS.
2908
type newMarshaler interface {
2909
	XXX_Size() int
2910
	XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
2911
}
2912

2913
// Size returns the encoded size of a protocol buffer message.
2914
// This is the main entry point.
2915
func Size(pb Message) int {
2916
	if m, ok := pb.(newMarshaler); ok {
2917
		return m.XXX_Size()
2918
	}
2919
	if m, ok := pb.(Marshaler); ok {
2920
		// If the message can marshal itself, let it do it, for compatibility.
2921
		// NOTE: This is not efficient.
2922
		b, _ := m.Marshal()
2923
		return len(b)
2924
	}
2925
	// in case somehow we didn't generate the wrapper
2926
	if pb == nil {
2927
		return 0
2928
	}
2929
	var info InternalMessageInfo
2930
	return info.Size(pb)
2931
}
2932

2933
// Marshal takes a protocol buffer message
2934
// and encodes it into the wire format, returning the data.
2935
// This is the main entry point.
2936
func Marshal(pb Message) ([]byte, error) {
2937
	if m, ok := pb.(newMarshaler); ok {
2938
		siz := m.XXX_Size()
2939
		b := make([]byte, 0, siz)
2940
		return m.XXX_Marshal(b, false)
2941
	}
2942
	if m, ok := pb.(Marshaler); ok {
2943
		// If the message can marshal itself, let it do it, for compatibility.
2944
		// NOTE: This is not efficient.
2945
		return m.Marshal()
2946
	}
2947
	// in case somehow we didn't generate the wrapper
2948
	if pb == nil {
2949
		return nil, ErrNil
2950
	}
2951
	var info InternalMessageInfo
2952
	siz := info.Size(pb)
2953
	b := make([]byte, 0, siz)
2954
	return info.Marshal(b, pb, false)
2955
}
2956

2957
// Marshal takes a protocol buffer message
2958
// and encodes it into the wire format, writing the result to the
2959
// Buffer.
2960
// This is an alternative entry point. It is not necessary to use
2961
// a Buffer for most applications.
2962
func (p *Buffer) Marshal(pb Message) error {
2963
	var err error
2964
	if p.deterministic {
2965
		if _, ok := pb.(Marshaler); ok {
2966
			return fmt.Errorf("proto: deterministic not supported by the Marshal method of %T", pb)
2967
		}
2968
	}
2969
	if m, ok := pb.(newMarshaler); ok {
2970
		siz := m.XXX_Size()
2971
		p.grow(siz) // make sure buf has enough capacity
2972
		pp := p.buf[len(p.buf) : len(p.buf) : len(p.buf)+siz]
2973
		pp, err = m.XXX_Marshal(pp, p.deterministic)
2974
		p.buf = append(p.buf, pp...)
2975
		return err
2976
	}
2977
	if m, ok := pb.(Marshaler); ok {
2978
		// If the message can marshal itself, let it do it, for compatibility.
2979
		// NOTE: This is not efficient.
2980
		var b []byte
2981
		b, err = m.Marshal()
2982
		p.buf = append(p.buf, b...)
2983
		return err
2984
	}
2985
	// in case somehow we didn't generate the wrapper
2986
	if pb == nil {
2987
		return ErrNil
2988
	}
2989
	var info InternalMessageInfo
2990
	siz := info.Size(pb)
2991
	p.grow(siz) // make sure buf has enough capacity
2992
	p.buf, err = info.Marshal(p.buf, pb, p.deterministic)
2993
	return err
2994
}
2995

2996
// grow grows the buffer's capacity, if necessary, to guarantee space for
2997
// another n bytes. After grow(n), at least n bytes can be written to the
2998
// buffer without another allocation.
2999
func (p *Buffer) grow(n int) {
3000
	need := len(p.buf) + n
3001
	if need <= cap(p.buf) {
3002
		return
3003
	}
3004
	newCap := len(p.buf) * 2
3005
	if newCap < need {
3006
		newCap = need
3007
	}
3008
	p.buf = append(make([]byte, 0, newCap), p.buf...)
3009
}
3010

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

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

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

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