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