1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:generate go run decgen.go -output dec_helpers.go 6 7 package gob 8 9 import ( 10 "encoding" 11 "errors" 12 "io" 13 "math" 14 "math/bits" 15 "reflect" 16 ) 17 18 var ( 19 errBadUint = errors.New("gob: encoded unsigned integer out of range") 20 errBadType = errors.New("gob: unknown type id or corrupted data") 21 errRange = errors.New("gob: bad data: field numbers out of bounds") 22 ) 23 24 type decHelper func(state *decoderState, v reflect.Value, length int, ovfl error) bool 25 26 // decoderState is the execution state of an instance of the decoder. A new state 27 // is created for nested objects. 28 type decoderState struct { 29 dec *Decoder 30 // The buffer is stored with an extra indirection because it may be replaced 31 // if we load a type during decode (when reading an interface value). 32 b *decBuffer 33 fieldnum int // the last field number read. 34 next *decoderState // for free list 35 } 36 37 // decBuffer is an extremely simple, fast implementation of a read-only byte buffer. 38 // It is initialized by calling Size and then copying the data into the slice returned by Bytes(). 39 type decBuffer struct { 40 data []byte 41 offset int // Read offset. 42 } 43 44 func (d *decBuffer) Read(p []byte) (int, error) { 45 n := copy(p, d.data[d.offset:]) 46 if n == 0 && len(p) != 0 { 47 return 0, io.EOF 48 } 49 d.offset += n 50 return n, nil 51 } 52 53 func (d *decBuffer) Drop(n int) { 54 if n > d.Len() { 55 panic("drop") 56 } 57 d.offset += n 58 } 59 60 // Size grows the buffer to exactly n bytes, so d.Bytes() will 61 // return a slice of length n. Existing data is first discarded. 62 func (d *decBuffer) Size(n int) { 63 d.Reset() 64 if cap(d.data) < n { 65 d.data = make([]byte, n) 66 } else { 67 d.data = d.data[0:n] 68 } 69 } 70 71 func (d *decBuffer) ReadByte() (byte, error) { 72 if d.offset >= len(d.data) { 73 return 0, io.EOF 74 } 75 c := d.data[d.offset] 76 d.offset++ 77 return c, nil 78 } 79 80 func (d *decBuffer) Len() int { 81 return len(d.data) - d.offset 82 } 83 84 func (d *decBuffer) Bytes() []byte { 85 return d.data[d.offset:] 86 } 87 88 func (d *decBuffer) Reset() { 89 d.data = d.data[0:0] 90 d.offset = 0 91 } 92 93 // We pass the bytes.Buffer separately for easier testing of the infrastructure 94 // without requiring a full Decoder. 95 func (dec *Decoder) newDecoderState(buf *decBuffer) *decoderState { 96 d := dec.freeList 97 if d == nil { 98 d = new(decoderState) 99 d.dec = dec 100 } else { 101 dec.freeList = d.next 102 } 103 d.b = buf 104 return d 105 } 106 107 func (dec *Decoder) freeDecoderState(d *decoderState) { 108 d.next = dec.freeList 109 dec.freeList = d 110 } 111 112 func overflow(name string) error { 113 return errors.New(`value for "` + name + `" out of range`) 114 } 115 116 // decodeUintReader reads an encoded unsigned integer from an io.Reader. 117 // Used only by the Decoder to read the message length. 118 func decodeUintReader(r io.Reader, buf []byte) (x uint64, width int, err error) { 119 width = 1 120 n, err := io.ReadFull(r, buf[0:width]) 121 if n == 0 { 122 return 123 } 124 b := buf[0] 125 if b <= 0x7f { 126 return uint64(b), width, nil 127 } 128 n = -int(int8(b)) 129 if n > uint64Size { 130 err = errBadUint 131 return 132 } 133 width, err = io.ReadFull(r, buf[0:n]) 134 if err != nil { 135 if err == io.EOF { 136 err = io.ErrUnexpectedEOF 137 } 138 return 139 } 140 // Could check that the high byte is zero but it's not worth it. 141 for _, b := range buf[0:width] { 142 x = x<<8 | uint64(b) 143 } 144 width++ // +1 for length byte 145 return 146 } 147 148 // decodeUint reads an encoded unsigned integer from state.r. 149 // Does not check for overflow. 150 func (state *decoderState) decodeUint() (x uint64) { 151 b, err := state.b.ReadByte() 152 if err != nil { 153 error_(err) 154 } 155 if b <= 0x7f { 156 return uint64(b) 157 } 158 n := -int(int8(b)) 159 if n > uint64Size { 160 error_(errBadUint) 161 } 162 buf := state.b.Bytes() 163 if len(buf) < n { 164 errorf("invalid uint data length %d: exceeds input size %d", n, len(buf)) 165 } 166 // Don't need to check error; it's safe to loop regardless. 167 // Could check that the high byte is zero but it's not worth it. 168 for _, b := range buf[0:n] { 169 x = x<<8 | uint64(b) 170 } 171 state.b.Drop(n) 172 return x 173 } 174 175 // decodeInt reads an encoded signed integer from state.r. 176 // Does not check for overflow. 177 func (state *decoderState) decodeInt() int64 { 178 x := state.decodeUint() 179 if x&1 != 0 { 180 return ^int64(x >> 1) 181 } 182 return int64(x >> 1) 183 } 184 185 // getLength decodes the next uint and makes sure it is a possible 186 // size for a data item that follows, which means it must fit in a 187 // non-negative int and fit in the buffer. 188 func (state *decoderState) getLength() (int, bool) { 189 n := int(state.decodeUint()) 190 if n < 0 || state.b.Len() < n || tooBig <= n { 191 return 0, false 192 } 193 return n, true 194 } 195 196 // decOp is the signature of a decoding operator for a given type. 197 type decOp func(i *decInstr, state *decoderState, v reflect.Value) 198 199 // The 'instructions' of the decoding machine 200 type decInstr struct { 201 op decOp 202 field int // field number of the wire type 203 index []int // field access indices for destination type 204 ovfl error // error message for overflow/underflow (for arrays, of the elements) 205 } 206 207 // ignoreUint discards a uint value with no destination. 208 func ignoreUint(i *decInstr, state *decoderState, v reflect.Value) { 209 state.decodeUint() 210 } 211 212 // ignoreTwoUints discards a uint value with no destination. It's used to skip 213 // complex values. 214 func ignoreTwoUints(i *decInstr, state *decoderState, v reflect.Value) { 215 state.decodeUint() 216 state.decodeUint() 217 } 218 219 // Since the encoder writes no zeros, if we arrive at a decoder we have 220 // a value to extract and store. The field number has already been read 221 // (it's how we knew to call this decoder). 222 // Each decoder is responsible for handling any indirections associated 223 // with the data structure. If any pointer so reached is nil, allocation must 224 // be done. 225 226 // decAlloc takes a value and returns a settable value that can 227 // be assigned to. If the value is a pointer, decAlloc guarantees it points to storage. 228 // The callers to the individual decoders are expected to have used decAlloc. 229 // The individual decoders don't need to it. 230 func decAlloc(v reflect.Value) reflect.Value { 231 for v.Kind() == reflect.Ptr { 232 if v.IsNil() { 233 v.Set(reflect.New(v.Type().Elem())) 234 } 235 v = v.Elem() 236 } 237 return v 238 } 239 240 // decBool decodes a uint and stores it as a boolean in value. 241 func decBool(i *decInstr, state *decoderState, value reflect.Value) { 242 value.SetBool(state.decodeUint() != 0) 243 } 244 245 // decInt8 decodes an integer and stores it as an int8 in value. 246 func decInt8(i *decInstr, state *decoderState, value reflect.Value) { 247 v := state.decodeInt() 248 if v < math.MinInt8 || math.MaxInt8 < v { 249 error_(i.ovfl) 250 } 251 value.SetInt(v) 252 } 253 254 // decUint8 decodes an unsigned integer and stores it as a uint8 in value. 255 func decUint8(i *decInstr, state *decoderState, value reflect.Value) { 256 v := state.decodeUint() 257 if math.MaxUint8 < v { 258 error_(i.ovfl) 259 } 260 value.SetUint(v) 261 } 262 263 // decInt16 decodes an integer and stores it as an int16 in value. 264 func decInt16(i *decInstr, state *decoderState, value reflect.Value) { 265 v := state.decodeInt() 266 if v < math.MinInt16 || math.MaxInt16 < v { 267 error_(i.ovfl) 268 } 269 value.SetInt(v) 270 } 271 272 // decUint16 decodes an unsigned integer and stores it as a uint16 in value. 273 func decUint16(i *decInstr, state *decoderState, value reflect.Value) { 274 v := state.decodeUint() 275 if math.MaxUint16 < v { 276 error_(i.ovfl) 277 } 278 value.SetUint(v) 279 } 280 281 // decInt32 decodes an integer and stores it as an int32 in value. 282 func decInt32(i *decInstr, state *decoderState, value reflect.Value) { 283 v := state.decodeInt() 284 if v < math.MinInt32 || math.MaxInt32 < v { 285 error_(i.ovfl) 286 } 287 value.SetInt(v) 288 } 289 290 // decUint32 decodes an unsigned integer and stores it as a uint32 in value. 291 func decUint32(i *decInstr, state *decoderState, value reflect.Value) { 292 v := state.decodeUint() 293 if math.MaxUint32 < v { 294 error_(i.ovfl) 295 } 296 value.SetUint(v) 297 } 298 299 // decInt64 decodes an integer and stores it as an int64 in value. 300 func decInt64(i *decInstr, state *decoderState, value reflect.Value) { 301 v := state.decodeInt() 302 value.SetInt(v) 303 } 304 305 // decUint64 decodes an unsigned integer and stores it as a uint64 in value. 306 func decUint64(i *decInstr, state *decoderState, value reflect.Value) { 307 v := state.decodeUint() 308 value.SetUint(v) 309 } 310 311 // Floating-point numbers are transmitted as uint64s holding the bits 312 // of the underlying representation. They are sent byte-reversed, with 313 // the exponent end coming out first, so integer floating point numbers 314 // (for example) transmit more compactly. This routine does the 315 // unswizzling. 316 func float64FromBits(u uint64) float64 { 317 v := bits.ReverseBytes64(u) 318 return math.Float64frombits(v) 319 } 320 321 // float32FromBits decodes an unsigned integer, treats it as a 32-bit floating-point 322 // number, and returns it. It's a helper function for float32 and complex64. 323 // It returns a float64 because that's what reflection needs, but its return 324 // value is known to be accurately representable in a float32. 325 func float32FromBits(u uint64, ovfl error) float64 { 326 v := float64FromBits(u) 327 av := v 328 if av < 0 { 329 av = -av 330 } 331 // +Inf is OK in both 32- and 64-bit floats. Underflow is always OK. 332 if math.MaxFloat32 < av && av <= math.MaxFloat64 { 333 error_(ovfl) 334 } 335 return v 336 } 337 338 // decFloat32 decodes an unsigned integer, treats it as a 32-bit floating-point 339 // number, and stores it in value. 340 func decFloat32(i *decInstr, state *decoderState, value reflect.Value) { 341 value.SetFloat(float32FromBits(state.decodeUint(), i.ovfl)) 342 } 343 344 // decFloat64 decodes an unsigned integer, treats it as a 64-bit floating-point 345 // number, and stores it in value. 346 func decFloat64(i *decInstr, state *decoderState, value reflect.Value) { 347 value.SetFloat(float64FromBits(state.decodeUint())) 348 } 349 350 // decComplex64 decodes a pair of unsigned integers, treats them as a 351 // pair of floating point numbers, and stores them as a complex64 in value. 352 // The real part comes first. 353 func decComplex64(i *decInstr, state *decoderState, value reflect.Value) { 354 real := float32FromBits(state.decodeUint(), i.ovfl) 355 imag := float32FromBits(state.decodeUint(), i.ovfl) 356 value.SetComplex(complex(real, imag)) 357 } 358 359 // decComplex128 decodes a pair of unsigned integers, treats them as a 360 // pair of floating point numbers, and stores them as a complex128 in value. 361 // The real part comes first. 362 func decComplex128(i *decInstr, state *decoderState, value reflect.Value) { 363 real := float64FromBits(state.decodeUint()) 364 imag := float64FromBits(state.decodeUint()) 365 value.SetComplex(complex(real, imag)) 366 } 367 368 // decUint8Slice decodes a byte slice and stores in value a slice header 369 // describing the data. 370 // uint8 slices are encoded as an unsigned count followed by the raw bytes. 371 func decUint8Slice(i *decInstr, state *decoderState, value reflect.Value) { 372 n, ok := state.getLength() 373 if !ok { 374 errorf("bad %s slice length: %d", value.Type(), n) 375 } 376 if value.Cap() < n { 377 value.Set(reflect.MakeSlice(value.Type(), n, n)) 378 } else { 379 value.Set(value.Slice(0, n)) 380 } 381 if _, err := state.b.Read(value.Bytes()); err != nil { 382 errorf("error decoding []byte: %s", err) 383 } 384 } 385 386 // decString decodes byte array and stores in value a string header 387 // describing the data. 388 // Strings are encoded as an unsigned count followed by the raw bytes. 389 func decString(i *decInstr, state *decoderState, value reflect.Value) { 390 n, ok := state.getLength() 391 if !ok { 392 errorf("bad %s slice length: %d", value.Type(), n) 393 } 394 // Read the data. 395 data := state.b.Bytes() 396 if len(data) < n { 397 errorf("invalid string length %d: exceeds input size %d", n, len(data)) 398 } 399 s := string(data[:n]) 400 state.b.Drop(n) 401 value.SetString(s) 402 } 403 404 // ignoreUint8Array skips over the data for a byte slice value with no destination. 405 func ignoreUint8Array(i *decInstr, state *decoderState, value reflect.Value) { 406 n, ok := state.getLength() 407 if !ok { 408 errorf("slice length too large") 409 } 410 bn := state.b.Len() 411 if bn < n { 412 errorf("invalid slice length %d: exceeds input size %d", n, bn) 413 } 414 state.b.Drop(n) 415 } 416 417 // Execution engine 418 419 // The encoder engine is an array of instructions indexed by field number of the incoming 420 // decoder. It is executed with random access according to field number. 421 type decEngine struct { 422 instr []decInstr 423 numInstr int // the number of active instructions 424 } 425 426 // decodeSingle decodes a top-level value that is not a struct and stores it in value. 427 // Such values are preceded by a zero, making them have the memory layout of a 428 // struct field (although with an illegal field number). 429 func (dec *Decoder) decodeSingle(engine *decEngine, value reflect.Value) { 430 state := dec.newDecoderState(&dec.buf) 431 defer dec.freeDecoderState(state) 432 state.fieldnum = singletonField 433 if state.decodeUint() != 0 { 434 errorf("decode: corrupted data: non-zero delta for singleton") 435 } 436 instr := &engine.instr[singletonField] 437 instr.op(instr, state, value) 438 } 439 440 // decodeStruct decodes a top-level struct and stores it in value. 441 // Indir is for the value, not the type. At the time of the call it may 442 // differ from ut.indir, which was computed when the engine was built. 443 // This state cannot arise for decodeSingle, which is called directly 444 // from the user's value, not from the innards of an engine. 445 func (dec *Decoder) decodeStruct(engine *decEngine, value reflect.Value) { 446 state := dec.newDecoderState(&dec.buf) 447 defer dec.freeDecoderState(state) 448 state.fieldnum = -1 449 for state.b.Len() > 0 { 450 delta := int(state.decodeUint()) 451 if delta < 0 { 452 errorf("decode: corrupted data: negative delta") 453 } 454 if delta == 0 { // struct terminator is zero delta fieldnum 455 break 456 } 457 fieldnum := state.fieldnum + delta 458 if fieldnum >= len(engine.instr) { 459 error_(errRange) 460 break 461 } 462 instr := &engine.instr[fieldnum] 463 var field reflect.Value 464 if instr.index != nil { 465 // Otherwise the field is unknown to us and instr.op is an ignore op. 466 field = value.FieldByIndex(instr.index) 467 if field.Kind() == reflect.Ptr { 468 field = decAlloc(field) 469 } 470 } 471 instr.op(instr, state, field) 472 state.fieldnum = fieldnum 473 } 474 } 475 476 var noValue reflect.Value 477 478 // ignoreStruct discards the data for a struct with no destination. 479 func (dec *Decoder) ignoreStruct(engine *decEngine) { 480 state := dec.newDecoderState(&dec.buf) 481 defer dec.freeDecoderState(state) 482 state.fieldnum = -1 483 for state.b.Len() > 0 { 484 delta := int(state.decodeUint()) 485 if delta < 0 { 486 errorf("ignore decode: corrupted data: negative delta") 487 } 488 if delta == 0 { // struct terminator is zero delta fieldnum 489 break 490 } 491 fieldnum := state.fieldnum + delta 492 if fieldnum >= len(engine.instr) { 493 error_(errRange) 494 } 495 instr := &engine.instr[fieldnum] 496 instr.op(instr, state, noValue) 497 state.fieldnum = fieldnum 498 } 499 } 500 501 // ignoreSingle discards the data for a top-level non-struct value with no 502 // destination. It's used when calling Decode with a nil value. 503 func (dec *Decoder) ignoreSingle(engine *decEngine) { 504 state := dec.newDecoderState(&dec.buf) 505 defer dec.freeDecoderState(state) 506 state.fieldnum = singletonField 507 delta := int(state.decodeUint()) 508 if delta != 0 { 509 errorf("decode: corrupted data: non-zero delta for singleton") 510 } 511 instr := &engine.instr[singletonField] 512 instr.op(instr, state, noValue) 513 } 514 515 // decodeArrayHelper does the work for decoding arrays and slices. 516 func (dec *Decoder) decodeArrayHelper(state *decoderState, value reflect.Value, elemOp decOp, length int, ovfl error, helper decHelper) { 517 if helper != nil && helper(state, value, length, ovfl) { 518 return 519 } 520 instr := &decInstr{elemOp, 0, nil, ovfl} 521 isPtr := value.Type().Elem().Kind() == reflect.Ptr 522 for i := 0; i < length; i++ { 523 if state.b.Len() == 0 { 524 errorf("decoding array or slice: length exceeds input size (%d elements)", length) 525 } 526 v := value.Index(i) 527 if isPtr { 528 v = decAlloc(v) 529 } 530 elemOp(instr, state, v) 531 } 532 } 533 534 // decodeArray decodes an array and stores it in value. 535 // The length is an unsigned integer preceding the elements. Even though the length is redundant 536 // (it's part of the type), it's a useful check and is included in the encoding. 537 func (dec *Decoder) decodeArray(state *decoderState, value reflect.Value, elemOp decOp, length int, ovfl error, helper decHelper) { 538 if n := state.decodeUint(); n != uint64(length) { 539 errorf("length mismatch in decodeArray") 540 } 541 dec.decodeArrayHelper(state, value, elemOp, length, ovfl, helper) 542 } 543 544 // decodeIntoValue is a helper for map decoding. 545 func decodeIntoValue(state *decoderState, op decOp, isPtr bool, value reflect.Value, instr *decInstr) reflect.Value { 546 v := value 547 if isPtr { 548 v = decAlloc(value) 549 } 550 551 op(instr, state, v) 552 return value 553 } 554 555 // decodeMap decodes a map and stores it in value. 556 // Maps are encoded as a length followed by key:value pairs. 557 // Because the internals of maps are not visible to us, we must 558 // use reflection rather than pointer magic. 559 func (dec *Decoder) decodeMap(mtyp reflect.Type, state *decoderState, value reflect.Value, keyOp, elemOp decOp, ovfl error) { 560 n := int(state.decodeUint()) 561 if value.IsNil() { 562 value.Set(reflect.MakeMapWithSize(mtyp, n)) 563 } 564 keyIsPtr := mtyp.Key().Kind() == reflect.Ptr 565 elemIsPtr := mtyp.Elem().Kind() == reflect.Ptr 566 keyInstr := &decInstr{keyOp, 0, nil, ovfl} 567 elemInstr := &decInstr{elemOp, 0, nil, ovfl} 568 keyP := reflect.New(mtyp.Key()) 569 keyZ := reflect.Zero(mtyp.Key()) 570 elemP := reflect.New(mtyp.Elem()) 571 elemZ := reflect.Zero(mtyp.Elem()) 572 for i := 0; i < n; i++ { 573 key := decodeIntoValue(state, keyOp, keyIsPtr, keyP.Elem(), keyInstr) 574 elem := decodeIntoValue(state, elemOp, elemIsPtr, elemP.Elem(), elemInstr) 575 value.SetMapIndex(key, elem) 576 keyP.Elem().Set(keyZ) 577 elemP.Elem().Set(elemZ) 578 } 579 } 580 581 // ignoreArrayHelper does the work for discarding arrays and slices. 582 func (dec *Decoder) ignoreArrayHelper(state *decoderState, elemOp decOp, length int) { 583 instr := &decInstr{elemOp, 0, nil, errors.New("no error")} 584 for i := 0; i < length; i++ { 585 if state.b.Len() == 0 { 586 errorf("decoding array or slice: length exceeds input size (%d elements)", length) 587 } 588 elemOp(instr, state, noValue) 589 } 590 } 591 592 // ignoreArray discards the data for an array value with no destination. 593 func (dec *Decoder) ignoreArray(state *decoderState, elemOp decOp, length int) { 594 if n := state.decodeUint(); n != uint64(length) { 595 errorf("length mismatch in ignoreArray") 596 } 597 dec.ignoreArrayHelper(state, elemOp, length) 598 } 599 600 // ignoreMap discards the data for a map value with no destination. 601 func (dec *Decoder) ignoreMap(state *decoderState, keyOp, elemOp decOp) { 602 n := int(state.decodeUint()) 603 keyInstr := &decInstr{keyOp, 0, nil, errors.New("no error")} 604 elemInstr := &decInstr{elemOp, 0, nil, errors.New("no error")} 605 for i := 0; i < n; i++ { 606 keyOp(keyInstr, state, noValue) 607 elemOp(elemInstr, state, noValue) 608 } 609 } 610 611 // decodeSlice decodes a slice and stores it in value. 612 // Slices are encoded as an unsigned length followed by the elements. 613 func (dec *Decoder) decodeSlice(state *decoderState, value reflect.Value, elemOp decOp, ovfl error, helper decHelper) { 614 u := state.decodeUint() 615 typ := value.Type() 616 size := uint64(typ.Elem().Size()) 617 nBytes := u * size 618 n := int(u) 619 // Take care with overflow in this calculation. 620 if n < 0 || uint64(n) != u || nBytes > tooBig || (size > 0 && nBytes/size != u) { 621 // We don't check n against buffer length here because if it's a slice 622 // of interfaces, there will be buffer reloads. 623 errorf("%s slice too big: %d elements of %d bytes", typ.Elem(), u, size) 624 } 625 if value.Cap() < n { 626 value.Set(reflect.MakeSlice(typ, n, n)) 627 } else { 628 value.Set(value.Slice(0, n)) 629 } 630 dec.decodeArrayHelper(state, value, elemOp, n, ovfl, helper) 631 } 632 633 // ignoreSlice skips over the data for a slice value with no destination. 634 func (dec *Decoder) ignoreSlice(state *decoderState, elemOp decOp) { 635 dec.ignoreArrayHelper(state, elemOp, int(state.decodeUint())) 636 } 637 638 // decodeInterface decodes an interface value and stores it in value. 639 // Interfaces are encoded as the name of a concrete type followed by a value. 640 // If the name is empty, the value is nil and no value is sent. 641 func (dec *Decoder) decodeInterface(ityp reflect.Type, state *decoderState, value reflect.Value) { 642 // Read the name of the concrete type. 643 nr := state.decodeUint() 644 if nr > 1<<31 { // zero is permissible for anonymous types 645 errorf("invalid type name length %d", nr) 646 } 647 if nr > uint64(state.b.Len()) { 648 errorf("invalid type name length %d: exceeds input size", nr) 649 } 650 n := int(nr) 651 name := state.b.Bytes()[:n] 652 state.b.Drop(n) 653 // Allocate the destination interface value. 654 if len(name) == 0 { 655 // Copy the nil interface value to the target. 656 value.Set(reflect.Zero(value.Type())) 657 return 658 } 659 if len(name) > 1024 { 660 errorf("name too long (%d bytes): %.20q...", len(name), name) 661 } 662 // The concrete type must be registered. 663 typi, ok := nameToConcreteType.Load(string(name)) 664 if !ok { 665 errorf("name not registered for interface: %q", name) 666 } 667 typ := typi.(reflect.Type) 668 669 // Read the type id of the concrete value. 670 concreteId := dec.decodeTypeSequence(true) 671 if concreteId < 0 { 672 error_(dec.err) 673 } 674 // Byte count of value is next; we don't care what it is (it's there 675 // in case we want to ignore the value by skipping it completely). 676 state.decodeUint() 677 // Read the concrete value. 678 v := allocValue(typ) 679 dec.decodeValue(concreteId, v) 680 if dec.err != nil { 681 error_(dec.err) 682 } 683 // Assign the concrete value to the interface. 684 // Tread carefully; it might not satisfy the interface. 685 if !typ.AssignableTo(ityp) { 686 errorf("%s is not assignable to type %s", typ, ityp) 687 } 688 // Copy the interface value to the target. 689 value.Set(v) 690 } 691 692 // ignoreInterface discards the data for an interface value with no destination. 693 func (dec *Decoder) ignoreInterface(state *decoderState) { 694 // Read the name of the concrete type. 695 n, ok := state.getLength() 696 if !ok { 697 errorf("bad interface encoding: name too large for buffer") 698 } 699 bn := state.b.Len() 700 if bn < n { 701 errorf("invalid interface value length %d: exceeds input size %d", n, bn) 702 } 703 state.b.Drop(n) 704 id := dec.decodeTypeSequence(true) 705 if id < 0 { 706 error_(dec.err) 707 } 708 // At this point, the decoder buffer contains a delimited value. Just toss it. 709 n, ok = state.getLength() 710 if !ok { 711 errorf("bad interface encoding: data length too large for buffer") 712 } 713 state.b.Drop(n) 714 } 715 716 // decodeGobDecoder decodes something implementing the GobDecoder interface. 717 // The data is encoded as a byte slice. 718 func (dec *Decoder) decodeGobDecoder(ut *userTypeInfo, state *decoderState, value reflect.Value) { 719 // Read the bytes for the value. 720 n, ok := state.getLength() 721 if !ok { 722 errorf("GobDecoder: length too large for buffer") 723 } 724 b := state.b.Bytes() 725 if len(b) < n { 726 errorf("GobDecoder: invalid data length %d: exceeds input size %d", n, len(b)) 727 } 728 b = b[:n] 729 state.b.Drop(n) 730 var err error 731 // We know it's one of these. 732 switch ut.externalDec { 733 case xGob: 734 err = value.Interface().(GobDecoder).GobDecode(b) 735 case xBinary: 736 err = value.Interface().(encoding.BinaryUnmarshaler).UnmarshalBinary(b) 737 case xText: 738 err = value.Interface().(encoding.TextUnmarshaler).UnmarshalText(b) 739 } 740 if err != nil { 741 error_(err) 742 } 743 } 744 745 // ignoreGobDecoder discards the data for a GobDecoder value with no destination. 746 func (dec *Decoder) ignoreGobDecoder(state *decoderState) { 747 // Read the bytes for the value. 748 n, ok := state.getLength() 749 if !ok { 750 errorf("GobDecoder: length too large for buffer") 751 } 752 bn := state.b.Len() 753 if bn < n { 754 errorf("GobDecoder: invalid data length %d: exceeds input size %d", n, bn) 755 } 756 state.b.Drop(n) 757 } 758 759 // Index by Go types. 760 var decOpTable = [...]decOp{ 761 reflect.Bool: decBool, 762 reflect.Int8: decInt8, 763 reflect.Int16: decInt16, 764 reflect.Int32: decInt32, 765 reflect.Int64: decInt64, 766 reflect.Uint8: decUint8, 767 reflect.Uint16: decUint16, 768 reflect.Uint32: decUint32, 769 reflect.Uint64: decUint64, 770 reflect.Float32: decFloat32, 771 reflect.Float64: decFloat64, 772 reflect.Complex64: decComplex64, 773 reflect.Complex128: decComplex128, 774 reflect.String: decString, 775 } 776 777 // Indexed by gob types. tComplex will be added during type.init(). 778 var decIgnoreOpMap = map[typeId]decOp{ 779 tBool: ignoreUint, 780 tInt: ignoreUint, 781 tUint: ignoreUint, 782 tFloat: ignoreUint, 783 tBytes: ignoreUint8Array, 784 tString: ignoreUint8Array, 785 tComplex: ignoreTwoUints, 786 } 787 788 // decOpFor returns the decoding op for the base type under rt and 789 // the indirection count to reach it. 790 func (dec *Decoder) decOpFor(wireId typeId, rt reflect.Type, name string, inProgress map[reflect.Type]*decOp) *decOp { 791 ut := userType(rt) 792 // If the type implements GobEncoder, we handle it without further processing. 793 if ut.externalDec != 0 { 794 return dec.gobDecodeOpFor(ut) 795 } 796 797 // If this type is already in progress, it's a recursive type (e.g. map[string]*T). 798 // Return the pointer to the op we're already building. 799 if opPtr := inProgress[rt]; opPtr != nil { 800 return opPtr 801 } 802 typ := ut.base 803 var op decOp 804 k := typ.Kind() 805 if int(k) < len(decOpTable) { 806 op = decOpTable[k] 807 } 808 if op == nil { 809 inProgress[rt] = &op 810 // Special cases 811 switch t := typ; t.Kind() { 812 case reflect.Array: 813 name = "element of " + name 814 elemId := dec.wireType[wireId].ArrayT.Elem 815 elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress) 816 ovfl := overflow(name) 817 helper := decArrayHelper[t.Elem().Kind()] 818 op = func(i *decInstr, state *decoderState, value reflect.Value) { 819 state.dec.decodeArray(state, value, *elemOp, t.Len(), ovfl, helper) 820 } 821 822 case reflect.Map: 823 keyId := dec.wireType[wireId].MapT.Key 824 elemId := dec.wireType[wireId].MapT.Elem 825 keyOp := dec.decOpFor(keyId, t.Key(), "key of "+name, inProgress) 826 elemOp := dec.decOpFor(elemId, t.Elem(), "element of "+name, inProgress) 827 ovfl := overflow(name) 828 op = func(i *decInstr, state *decoderState, value reflect.Value) { 829 state.dec.decodeMap(t, state, value, *keyOp, *elemOp, ovfl) 830 } 831 832 case reflect.Slice: 833 name = "element of " + name 834 if t.Elem().Kind() == reflect.Uint8 { 835 op = decUint8Slice 836 break 837 } 838 var elemId typeId 839 if tt, ok := builtinIdToType[wireId]; ok { 840 elemId = tt.(*sliceType).Elem 841 } else { 842 elemId = dec.wireType[wireId].SliceT.Elem 843 } 844 elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress) 845 ovfl := overflow(name) 846 helper := decSliceHelper[t.Elem().Kind()] 847 op = func(i *decInstr, state *decoderState, value reflect.Value) { 848 state.dec.decodeSlice(state, value, *elemOp, ovfl, helper) 849 } 850 851 case reflect.Struct: 852 // Generate a closure that calls out to the engine for the nested type. 853 ut := userType(typ) 854 enginePtr, err := dec.getDecEnginePtr(wireId, ut) 855 if err != nil { 856 error_(err) 857 } 858 op = func(i *decInstr, state *decoderState, value reflect.Value) { 859 // indirect through enginePtr to delay evaluation for recursive structs. 860 dec.decodeStruct(*enginePtr, value) 861 } 862 case reflect.Interface: 863 op = func(i *decInstr, state *decoderState, value reflect.Value) { 864 state.dec.decodeInterface(t, state, value) 865 } 866 } 867 } 868 if op == nil { 869 errorf("decode can't handle type %s", rt) 870 } 871 return &op 872 } 873 874 // decIgnoreOpFor returns the decoding op for a field that has no destination. 875 func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp) *decOp { 876 // If this type is already in progress, it's a recursive type (e.g. map[string]*T). 877 // Return the pointer to the op we're already building. 878 if opPtr := inProgress[wireId]; opPtr != nil { 879 return opPtr 880 } 881 op, ok := decIgnoreOpMap[wireId] 882 if !ok { 883 inProgress[wireId] = &op 884 if wireId == tInterface { 885 // Special case because it's a method: the ignored item might 886 // define types and we need to record their state in the decoder. 887 op = func(i *decInstr, state *decoderState, value reflect.Value) { 888 state.dec.ignoreInterface(state) 889 } 890 return &op 891 } 892 // Special cases 893 wire := dec.wireType[wireId] 894 switch { 895 case wire == nil: 896 errorf("bad data: undefined type %s", wireId.string()) 897 case wire.ArrayT != nil: 898 elemId := wire.ArrayT.Elem 899 elemOp := dec.decIgnoreOpFor(elemId, inProgress) 900 op = func(i *decInstr, state *decoderState, value reflect.Value) { 901 state.dec.ignoreArray(state, *elemOp, wire.ArrayT.Len) 902 } 903 904 case wire.MapT != nil: 905 keyId := dec.wireType[wireId].MapT.Key 906 elemId := dec.wireType[wireId].MapT.Elem 907 keyOp := dec.decIgnoreOpFor(keyId, inProgress) 908 elemOp := dec.decIgnoreOpFor(elemId, inProgress) 909 op = func(i *decInstr, state *decoderState, value reflect.Value) { 910 state.dec.ignoreMap(state, *keyOp, *elemOp) 911 } 912 913 case wire.SliceT != nil: 914 elemId := wire.SliceT.Elem 915 elemOp := dec.decIgnoreOpFor(elemId, inProgress) 916 op = func(i *decInstr, state *decoderState, value reflect.Value) { 917 state.dec.ignoreSlice(state, *elemOp) 918 } 919 920 case wire.StructT != nil: 921 // Generate a closure that calls out to the engine for the nested type. 922 enginePtr, err := dec.getIgnoreEnginePtr(wireId) 923 if err != nil { 924 error_(err) 925 } 926 op = func(i *decInstr, state *decoderState, value reflect.Value) { 927 // indirect through enginePtr to delay evaluation for recursive structs 928 state.dec.ignoreStruct(*enginePtr) 929 } 930 931 case wire.GobEncoderT != nil, wire.BinaryMarshalerT != nil, wire.TextMarshalerT != nil: 932 op = func(i *decInstr, state *decoderState, value reflect.Value) { 933 state.dec.ignoreGobDecoder(state) 934 } 935 } 936 } 937 if op == nil { 938 errorf("bad data: ignore can't handle type %s", wireId.string()) 939 } 940 return &op 941 } 942 943 // gobDecodeOpFor returns the op for a type that is known to implement 944 // GobDecoder. 945 func (dec *Decoder) gobDecodeOpFor(ut *userTypeInfo) *decOp { 946 rcvrType := ut.user 947 if ut.decIndir == -1 { 948 rcvrType = reflect.PtrTo(rcvrType) 949 } else if ut.decIndir > 0 { 950 for i := int8(0); i < ut.decIndir; i++ { 951 rcvrType = rcvrType.Elem() 952 } 953 } 954 var op decOp 955 op = func(i *decInstr, state *decoderState, value reflect.Value) { 956 // We now have the base type. We need its address if the receiver is a pointer. 957 if value.Kind() != reflect.Ptr && rcvrType.Kind() == reflect.Ptr { 958 value = value.Addr() 959 } 960 state.dec.decodeGobDecoder(ut, state, value) 961 } 962 return &op 963 } 964 965 // compatibleType asks: Are these two gob Types compatible? 966 // Answers the question for basic types, arrays, maps and slices, plus 967 // GobEncoder/Decoder pairs. 968 // Structs are considered ok; fields will be checked later. 969 func (dec *Decoder) compatibleType(fr reflect.Type, fw typeId, inProgress map[reflect.Type]typeId) bool { 970 if rhs, ok := inProgress[fr]; ok { 971 return rhs == fw 972 } 973 inProgress[fr] = fw 974 ut := userType(fr) 975 wire, ok := dec.wireType[fw] 976 // If wire was encoded with an encoding method, fr must have that method. 977 // And if not, it must not. 978 // At most one of the booleans in ut is set. 979 // We could possibly relax this constraint in the future in order to 980 // choose the decoding method using the data in the wireType. 981 // The parentheses look odd but are correct. 982 if (ut.externalDec == xGob) != (ok && wire.GobEncoderT != nil) || 983 (ut.externalDec == xBinary) != (ok && wire.BinaryMarshalerT != nil) || 984 (ut.externalDec == xText) != (ok && wire.TextMarshalerT != nil) { 985 return false 986 } 987 if ut.externalDec != 0 { // This test trumps all others. 988 return true 989 } 990 switch t := ut.base; t.Kind() { 991 default: 992 // chan, etc: cannot handle. 993 return false 994 case reflect.Bool: 995 return fw == tBool 996 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 997 return fw == tInt 998 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 999 return fw == tUint 1000 case reflect.Float32, reflect.Float64: 1001 return fw == tFloat 1002 case reflect.Complex64, reflect.Complex128: 1003 return fw == tComplex 1004 case reflect.String: 1005 return fw == tString 1006 case reflect.Interface: 1007 return fw == tInterface 1008 case reflect.Array: 1009 if !ok || wire.ArrayT == nil { 1010 return false 1011 } 1012 array := wire.ArrayT 1013 return t.Len() == array.Len && dec.compatibleType(t.Elem(), array.Elem, inProgress) 1014 case reflect.Map: 1015 if !ok || wire.MapT == nil { 1016 return false 1017 } 1018 MapType := wire.MapT 1019 return dec.compatibleType(t.Key(), MapType.Key, inProgress) && dec.compatibleType(t.Elem(), MapType.Elem, inProgress) 1020 case reflect.Slice: 1021 // Is it an array of bytes? 1022 if t.Elem().Kind() == reflect.Uint8 { 1023 return fw == tBytes 1024 } 1025 // Extract and compare element types. 1026 var sw *sliceType 1027 if tt, ok := builtinIdToType[fw]; ok { 1028 sw, _ = tt.(*sliceType) 1029 } else if wire != nil { 1030 sw = wire.SliceT 1031 } 1032 elem := userType(t.Elem()).base 1033 return sw != nil && dec.compatibleType(elem, sw.Elem, inProgress) 1034 case reflect.Struct: 1035 return true 1036 } 1037 } 1038 1039 // typeString returns a human-readable description of the type identified by remoteId. 1040 func (dec *Decoder) typeString(remoteId typeId) string { 1041 typeLock.Lock() 1042 defer typeLock.Unlock() 1043 if t := idToType[remoteId]; t != nil { 1044 // globally known type. 1045 return t.string() 1046 } 1047 return dec.wireType[remoteId].string() 1048 } 1049 1050 // compileSingle compiles the decoder engine for a non-struct top-level value, including 1051 // GobDecoders. 1052 func (dec *Decoder) compileSingle(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) { 1053 rt := ut.user 1054 engine = new(decEngine) 1055 engine.instr = make([]decInstr, 1) // one item 1056 name := rt.String() // best we can do 1057 if !dec.compatibleType(rt, remoteId, make(map[reflect.Type]typeId)) { 1058 remoteType := dec.typeString(remoteId) 1059 // Common confusing case: local interface type, remote concrete type. 1060 if ut.base.Kind() == reflect.Interface && remoteId != tInterface { 1061 return nil, errors.New("gob: local interface type " + name + " can only be decoded from remote interface type; received concrete type " + remoteType) 1062 } 1063 return nil, errors.New("gob: decoding into local type " + name + ", received remote type " + remoteType) 1064 } 1065 op := dec.decOpFor(remoteId, rt, name, make(map[reflect.Type]*decOp)) 1066 ovfl := errors.New(`value for "` + name + `" out of range`) 1067 engine.instr[singletonField] = decInstr{*op, singletonField, nil, ovfl} 1068 engine.numInstr = 1 1069 return 1070 } 1071 1072 // compileIgnoreSingle compiles the decoder engine for a non-struct top-level value that will be discarded. 1073 func (dec *Decoder) compileIgnoreSingle(remoteId typeId) (engine *decEngine, err error) { 1074 engine = new(decEngine) 1075 engine.instr = make([]decInstr, 1) // one item 1076 op := dec.decIgnoreOpFor(remoteId, make(map[typeId]*decOp)) 1077 ovfl := overflow(dec.typeString(remoteId)) 1078 engine.instr[0] = decInstr{*op, 0, nil, ovfl} 1079 engine.numInstr = 1 1080 return 1081 } 1082 1083 // compileDec compiles the decoder engine for a value. If the value is not a struct, 1084 // it calls out to compileSingle. 1085 func (dec *Decoder) compileDec(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) { 1086 defer catchError(&err) 1087 rt := ut.base 1088 srt := rt 1089 if srt.Kind() != reflect.Struct || ut.externalDec != 0 { 1090 return dec.compileSingle(remoteId, ut) 1091 } 1092 var wireStruct *structType 1093 // Builtin types can come from global pool; the rest must be defined by the decoder. 1094 // Also we know we're decoding a struct now, so the client must have sent one. 1095 if t, ok := builtinIdToType[remoteId]; ok { 1096 wireStruct, _ = t.(*structType) 1097 } else { 1098 wire := dec.wireType[remoteId] 1099 if wire == nil { 1100 error_(errBadType) 1101 } 1102 wireStruct = wire.StructT 1103 } 1104 if wireStruct == nil { 1105 errorf("type mismatch in decoder: want struct type %s; got non-struct", rt) 1106 } 1107 engine = new(decEngine) 1108 engine.instr = make([]decInstr, len(wireStruct.Field)) 1109 seen := make(map[reflect.Type]*decOp) 1110 // Loop over the fields of the wire type. 1111 for fieldnum := 0; fieldnum < len(wireStruct.Field); fieldnum++ { 1112 wireField := wireStruct.Field[fieldnum] 1113 if wireField.Name == "" { 1114 errorf("empty name for remote field of type %s", wireStruct.Name) 1115 } 1116 ovfl := overflow(wireField.Name) 1117 // Find the field of the local type with the same name. 1118 localField, present := srt.FieldByName(wireField.Name) 1119 // TODO(r): anonymous names 1120 if !present || !isExported(wireField.Name) { 1121 op := dec.decIgnoreOpFor(wireField.Id, make(map[typeId]*decOp)) 1122 engine.instr[fieldnum] = decInstr{*op, fieldnum, nil, ovfl} 1123 continue 1124 } 1125 if !dec.compatibleType(localField.Type, wireField.Id, make(map[reflect.Type]typeId)) { 1126 errorf("wrong type (%s) for received field %s.%s", localField.Type, wireStruct.Name, wireField.Name) 1127 } 1128 op := dec.decOpFor(wireField.Id, localField.Type, localField.Name, seen) 1129 engine.instr[fieldnum] = decInstr{*op, fieldnum, localField.Index, ovfl} 1130 engine.numInstr++ 1131 } 1132 return 1133 } 1134 1135 // getDecEnginePtr returns the engine for the specified type. 1136 func (dec *Decoder) getDecEnginePtr(remoteId typeId, ut *userTypeInfo) (enginePtr **decEngine, err error) { 1137 rt := ut.user 1138 decoderMap, ok := dec.decoderCache[rt] 1139 if !ok { 1140 decoderMap = make(map[typeId]**decEngine) 1141 dec.decoderCache[rt] = decoderMap 1142 } 1143 if enginePtr, ok = decoderMap[remoteId]; !ok { 1144 // To handle recursive types, mark this engine as underway before compiling. 1145 enginePtr = new(*decEngine) 1146 decoderMap[remoteId] = enginePtr 1147 *enginePtr, err = dec.compileDec(remoteId, ut) 1148 if err != nil { 1149 delete(decoderMap, remoteId) 1150 } 1151 } 1152 return 1153 } 1154 1155 // emptyStruct is the type we compile into when ignoring a struct value. 1156 type emptyStruct struct{} 1157 1158 var emptyStructType = reflect.TypeOf(emptyStruct{}) 1159 1160 // getIgnoreEnginePtr returns the engine for the specified type when the value is to be discarded. 1161 func (dec *Decoder) getIgnoreEnginePtr(wireId typeId) (enginePtr **decEngine, err error) { 1162 var ok bool 1163 if enginePtr, ok = dec.ignorerCache[wireId]; !ok { 1164 // To handle recursive types, mark this engine as underway before compiling. 1165 enginePtr = new(*decEngine) 1166 dec.ignorerCache[wireId] = enginePtr 1167 wire := dec.wireType[wireId] 1168 if wire != nil && wire.StructT != nil { 1169 *enginePtr, err = dec.compileDec(wireId, userType(emptyStructType)) 1170 } else { 1171 *enginePtr, err = dec.compileIgnoreSingle(wireId) 1172 } 1173 if err != nil { 1174 delete(dec.ignorerCache, wireId) 1175 } 1176 } 1177 return 1178 } 1179 1180 // decodeValue decodes the data stream representing a value and stores it in value. 1181 func (dec *Decoder) decodeValue(wireId typeId, value reflect.Value) { 1182 defer catchError(&dec.err) 1183 // If the value is nil, it means we should just ignore this item. 1184 if !value.IsValid() { 1185 dec.decodeIgnoredValue(wireId) 1186 return 1187 } 1188 // Dereference down to the underlying type. 1189 ut := userType(value.Type()) 1190 base := ut.base 1191 var enginePtr **decEngine 1192 enginePtr, dec.err = dec.getDecEnginePtr(wireId, ut) 1193 if dec.err != nil { 1194 return 1195 } 1196 value = decAlloc(value) 1197 engine := *enginePtr 1198 if st := base; st.Kind() == reflect.Struct && ut.externalDec == 0 { 1199 wt := dec.wireType[wireId] 1200 if engine.numInstr == 0 && st.NumField() > 0 && 1201 wt != nil && len(wt.StructT.Field) > 0 { 1202 name := base.Name() 1203 errorf("type mismatch: no fields matched compiling decoder for %s", name) 1204 } 1205 dec.decodeStruct(engine, value) 1206 } else { 1207 dec.decodeSingle(engine, value) 1208 } 1209 } 1210 1211 // decodeIgnoredValue decodes the data stream representing a value of the specified type and discards it. 1212 func (dec *Decoder) decodeIgnoredValue(wireId typeId) { 1213 var enginePtr **decEngine 1214 enginePtr, dec.err = dec.getIgnoreEnginePtr(wireId) 1215 if dec.err != nil { 1216 return 1217 } 1218 wire := dec.wireType[wireId] 1219 if wire != nil && wire.StructT != nil { 1220 dec.ignoreStruct(*enginePtr) 1221 } else { 1222 dec.ignoreSingle(*enginePtr) 1223 } 1224 } 1225 1226 func init() { 1227 var iop, uop decOp 1228 switch reflect.TypeOf(int(0)).Bits() { 1229 case 32: 1230 iop = decInt32 1231 uop = decUint32 1232 case 64: 1233 iop = decInt64 1234 uop = decUint64 1235 default: 1236 panic("gob: unknown size of int/uint") 1237 } 1238 decOpTable[reflect.Int] = iop 1239 decOpTable[reflect.Uint] = uop 1240 1241 // Finally uintptr 1242 switch reflect.TypeOf(uintptr(0)).Bits() { 1243 case 32: 1244 uop = decUint32 1245 case 64: 1246 uop = decUint64 1247 default: 1248 panic("gob: unknown size of uintptr") 1249 } 1250 decOpTable[reflect.Uintptr] = uop 1251 } 1252 1253 // Gob depends on being able to take the address 1254 // of zeroed Values it creates, so use this wrapper instead 1255 // of the standard reflect.Zero. 1256 // Each call allocates once. 1257 func allocValue(t reflect.Type) reflect.Value { 1258 return reflect.New(t).Elem() 1259 } 1260