package gob
import (
)
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 ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decBoolSlice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]bool)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding bool array or slice: length exceeds input size (%d elements)", )
}
[] = .decodeUint() != 0
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decComplex64Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]complex64)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding complex64 array or slice: length exceeds input size (%d elements)", )
}
:= float32FromBits(.decodeUint(), )
:= float32FromBits(.decodeUint(), )
[] = complex(float32(), float32())
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decComplex128Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]complex128)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding complex128 array or slice: length exceeds input size (%d elements)", )
}
:= float64FromBits(.decodeUint())
:= float64FromBits(.decodeUint())
[] = complex(, )
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decFloat32Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]float32)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding float32 array or slice: length exceeds input size (%d elements)", )
}
[] = float32(float32FromBits(.decodeUint(), ))
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decFloat64Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]float64)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding float64 array or slice: length exceeds input size (%d elements)", )
}
[] = float64FromBits(.decodeUint())
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decIntSlice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]int)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding int array or slice: length exceeds input size (%d elements)", )
}
:= .decodeInt()
if < ^int64(^uint(0)>>1) || int64(^uint(0)>>1) < {
error_()
}
[] = int()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decInt16Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]int16)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding int16 array or slice: length exceeds input size (%d elements)", )
}
:= .decodeInt()
if < math.MinInt16 || math.MaxInt16 < {
error_()
}
[] = int16()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decInt32Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]int32)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding int32 array or slice: length exceeds input size (%d elements)", )
}
:= .decodeInt()
if < math.MinInt32 || math.MaxInt32 < {
error_()
}
[] = int32()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decInt64Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]int64)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding int64 array or slice: length exceeds input size (%d elements)", )
}
[] = .decodeInt()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decInt8Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]int8)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding int8 array or slice: length exceeds input size (%d elements)", )
}
:= .decodeInt()
if < math.MinInt8 || math.MaxInt8 < {
error_()
}
[] = int8()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decStringSlice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]string)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding string array or slice: length exceeds input size (%d elements)", )
}
:= .decodeUint()
:= int()
if < 0 || uint64() != || > .b.Len() {
errorf("length of string exceeds input size (%d bytes)", )
}
if > .b.Len() {
errorf("string data too long for buffer: %d", )
}
:= .b.Bytes()
if len() < {
errorf("invalid string length %d: exceeds input size %d", , len())
}
[] = string([:])
.b.Drop()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decUintSlice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]uint)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding uint array or slice: length exceeds input size (%d elements)", )
}
:= .decodeUint()
[] = uint()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decUint16Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]uint16)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding uint16 array or slice: length exceeds input size (%d elements)", )
}
:= .decodeUint()
if math.MaxUint16 < {
error_()
}
[] = uint16()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decUint32Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]uint32)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding uint32 array or slice: length exceeds input size (%d elements)", )
}
:= .decodeUint()
if math.MaxUint32 < {
error_()
}
[] = uint32()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decUint64Slice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]uint64)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding uint64 array or slice: length exceeds input size (%d elements)", )
}
[] = .decodeUint()
}
return true
}
func ( *decoderState, reflect.Value, int, error) bool {
if !.CanAddr() {
return false
}
return decUintptrSlice(, .Slice(0, .Len()), , )
}
func ( *decoderState, reflect.Value, int, error) bool {
, := .Interface().([]uintptr)
if ! {
return false
}
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding uintptr array or slice: length exceeds input size (%d elements)", )
}
:= .decodeUint()
if uint64(^uintptr(0)) < {
error_()
}
[] = uintptr()
}
return true
}