| // Code generated by go run decgen.go -output dec_helpers.go; DO NOT EDIT. |
| |
| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package gob |
| |
| import ( |
| "math" |
| "reflect" |
| ) |
| |
| var decArrayHelper = map[reflect.Kind]decHelper{ |
| reflect.Bool: decBoolArray, |
| reflect.Complex64: decComplex64Array, |
| reflect.Complex128: decComplex128Array, |
| reflect.Float32: decFloat32Array, |
| reflect.Float64: decFloat64Array, |
| reflect.Int: decIntArray, |
| reflect.Int16: decInt16Array, |
| reflect.Int32: decInt32Array, |
| reflect.Int64: decInt64Array, |
| reflect.Int8: decInt8Array, |
| reflect.String: decStringArray, |
| reflect.Uint: decUintArray, |
| reflect.Uint16: decUint16Array, |
| reflect.Uint32: decUint32Array, |
| reflect.Uint64: decUint64Array, |
| reflect.Uintptr: decUintptrArray, |
| } |
| |
| var decSliceHelper = map[reflect.Kind]decHelper{ |
| reflect.Bool: decBoolSlice, |
| reflect.Complex64: decComplex64Slice, |
| reflect.Complex128: decComplex128Slice, |
| reflect.Float32: decFloat32Slice, |
| reflect.Float64: decFloat64Slice, |
| reflect.Int: decIntSlice, |
| reflect.Int16: decInt16Slice, |
| reflect.Int32: decInt32Slice, |
| reflect.Int64: decInt64Slice, |
| reflect.Int8: decInt8Slice, |
| reflect.String: decStringSlice, |
| reflect.Uint: decUintSlice, |
| reflect.Uint16: decUint16Slice, |
| reflect.Uint32: decUint32Slice, |
| reflect.Uint64: decUint64Slice, |
| reflect.Uintptr: decUintptrSlice, |
| } |
| |
| func decBoolArray(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decBoolSlice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decBoolSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]bool) |
| if !ok { |
| // It is kind bool but not type bool. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding bool array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| slice[i] = state.decodeUint() != 0 |
| } |
| return true |
| } |
| |
| func decComplex64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decComplex64Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decComplex64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]complex64) |
| if !ok { |
| // It is kind complex64 but not type complex64. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding complex64 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| real := float32FromBits(state.decodeUint(), ovfl) |
| imag := float32FromBits(state.decodeUint(), ovfl) |
| slice[i] = complex(float32(real), float32(imag)) |
| } |
| return true |
| } |
| |
| func decComplex128Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decComplex128Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decComplex128Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]complex128) |
| if !ok { |
| // It is kind complex128 but not type complex128. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding complex128 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| real := float64FromBits(state.decodeUint()) |
| imag := float64FromBits(state.decodeUint()) |
| slice[i] = complex(real, imag) |
| } |
| return true |
| } |
| |
| func decFloat32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decFloat32Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decFloat32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]float32) |
| if !ok { |
| // It is kind float32 but not type float32. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding float32 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| slice[i] = float32(float32FromBits(state.decodeUint(), ovfl)) |
| } |
| return true |
| } |
| |
| func decFloat64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decFloat64Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decFloat64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]float64) |
| if !ok { |
| // It is kind float64 but not type float64. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding float64 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| slice[i] = float64FromBits(state.decodeUint()) |
| } |
| return true |
| } |
| |
| func decIntArray(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decIntSlice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decIntSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]int) |
| if !ok { |
| // It is kind int but not type int. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding int array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| x := state.decodeInt() |
| // MinInt and MaxInt |
| if x < ^int64(^uint(0)>>1) || int64(^uint(0)>>1) < x { |
| error_(ovfl) |
| } |
| slice[i] = int(x) |
| } |
| return true |
| } |
| |
| func decInt16Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decInt16Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decInt16Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]int16) |
| if !ok { |
| // It is kind int16 but not type int16. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding int16 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| x := state.decodeInt() |
| if x < math.MinInt16 || math.MaxInt16 < x { |
| error_(ovfl) |
| } |
| slice[i] = int16(x) |
| } |
| return true |
| } |
| |
| func decInt32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decInt32Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decInt32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]int32) |
| if !ok { |
| // It is kind int32 but not type int32. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding int32 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| x := state.decodeInt() |
| if x < math.MinInt32 || math.MaxInt32 < x { |
| error_(ovfl) |
| } |
| slice[i] = int32(x) |
| } |
| return true |
| } |
| |
| func decInt64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decInt64Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decInt64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]int64) |
| if !ok { |
| // It is kind int64 but not type int64. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding int64 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| slice[i] = state.decodeInt() |
| } |
| return true |
| } |
| |
| func decInt8Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decInt8Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decInt8Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]int8) |
| if !ok { |
| // It is kind int8 but not type int8. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding int8 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| x := state.decodeInt() |
| if x < math.MinInt8 || math.MaxInt8 < x { |
| error_(ovfl) |
| } |
| slice[i] = int8(x) |
| } |
| return true |
| } |
| |
| func decStringArray(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decStringSlice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decStringSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]string) |
| if !ok { |
| // It is kind string but not type string. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding string array or slice: length exceeds input size (%d elements)", length) |
| } |
| u := state.decodeUint() |
| n := int(u) |
| if n < 0 || uint64(n) != u || n > state.b.Len() { |
| errorf("length of string exceeds input size (%d bytes)", u) |
| } |
| if n > state.b.Len() { |
| errorf("string data too long for buffer: %d", n) |
| } |
| // Read the data. |
| data := state.b.Bytes() |
| if len(data) < n { |
| errorf("invalid string length %d: exceeds input size %d", n, len(data)) |
| } |
| slice[i] = string(data[:n]) |
| state.b.Drop(n) |
| } |
| return true |
| } |
| |
| func decUintArray(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decUintSlice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decUintSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]uint) |
| if !ok { |
| // It is kind uint but not type uint. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding uint array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| x := state.decodeUint() |
| /*TODO if math.MaxUint32 < x { |
| error_(ovfl) |
| }*/ |
| slice[i] = uint(x) |
| } |
| return true |
| } |
| |
| func decUint16Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decUint16Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decUint16Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]uint16) |
| if !ok { |
| // It is kind uint16 but not type uint16. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding uint16 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| x := state.decodeUint() |
| if math.MaxUint16 < x { |
| error_(ovfl) |
| } |
| slice[i] = uint16(x) |
| } |
| return true |
| } |
| |
| func decUint32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decUint32Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decUint32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]uint32) |
| if !ok { |
| // It is kind uint32 but not type uint32. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding uint32 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| x := state.decodeUint() |
| if math.MaxUint32 < x { |
| error_(ovfl) |
| } |
| slice[i] = uint32(x) |
| } |
| return true |
| } |
| |
| func decUint64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decUint64Slice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decUint64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]uint64) |
| if !ok { |
| // It is kind uint64 but not type uint64. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding uint64 array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| slice[i] = state.decodeUint() |
| } |
| return true |
| } |
| |
| func decUintptrArray(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| // Can only slice if it is addressable. |
| if !v.CanAddr() { |
| return false |
| } |
| return decUintptrSlice(state, v.Slice(0, v.Len()), length, ovfl) |
| } |
| |
| func decUintptrSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool { |
| slice, ok := v.Interface().([]uintptr) |
| if !ok { |
| // It is kind uintptr but not type uintptr. TODO: We can handle this unsafely. |
| return false |
| } |
| for i := 0; i < length; i++ { |
| if state.b.Len() == 0 { |
| errorf("decoding uintptr array or slice: length exceeds input size (%d elements)", length) |
| } |
| if i >= len(slice) { |
| // This is a slice that we only partially allocated. |
| growSlice(v, &slice, length) |
| } |
| x := state.decodeUint() |
| if uint64(^uintptr(0)) < x { |
| error_(ovfl) |
| } |
| slice[i] = uintptr(x) |
| } |
| return true |
| } |
| |
| // growSlice is called for a slice that we only partially allocated, |
| // to grow it up to length. |
| func growSlice[E any](v reflect.Value, ps *[]E, length int) { |
| var zero E |
| s := *ps |
| s = append(s, zero) |
| cp := cap(s) |
| if cp > length { |
| cp = length |
| } |
| s = s[:cp] |
| v.Set(reflect.ValueOf(s)) |
| *ps = s |
| } |