github.com/gogo/protobuf@v1.3.2/proto/table_marshal.go (about) 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 }