Home | History | Annotate | Download | only in gob
      1 // Created by decgen --output dec_helpers.go; DO NOT EDIT
      2 
      3 // Copyright 2014 The Go Authors. All rights reserved.
      4 // Use of this source code is governed by a BSD-style
      5 // license that can be found in the LICENSE file.
      6 
      7 package gob
      8 
      9 import (
     10 	"math"
     11 	"reflect"
     12 )
     13 
     14 var decArrayHelper = map[reflect.Kind]decHelper{
     15 	reflect.Bool:       decBoolArray,
     16 	reflect.Complex64:  decComplex64Array,
     17 	reflect.Complex128: decComplex128Array,
     18 	reflect.Float32:    decFloat32Array,
     19 	reflect.Float64:    decFloat64Array,
     20 	reflect.Int:        decIntArray,
     21 	reflect.Int16:      decInt16Array,
     22 	reflect.Int32:      decInt32Array,
     23 	reflect.Int64:      decInt64Array,
     24 	reflect.Int8:       decInt8Array,
     25 	reflect.String:     decStringArray,
     26 	reflect.Uint:       decUintArray,
     27 	reflect.Uint16:     decUint16Array,
     28 	reflect.Uint32:     decUint32Array,
     29 	reflect.Uint64:     decUint64Array,
     30 	reflect.Uintptr:    decUintptrArray,
     31 }
     32 
     33 var decSliceHelper = map[reflect.Kind]decHelper{
     34 	reflect.Bool:       decBoolSlice,
     35 	reflect.Complex64:  decComplex64Slice,
     36 	reflect.Complex128: decComplex128Slice,
     37 	reflect.Float32:    decFloat32Slice,
     38 	reflect.Float64:    decFloat64Slice,
     39 	reflect.Int:        decIntSlice,
     40 	reflect.Int16:      decInt16Slice,
     41 	reflect.Int32:      decInt32Slice,
     42 	reflect.Int64:      decInt64Slice,
     43 	reflect.Int8:       decInt8Slice,
     44 	reflect.String:     decStringSlice,
     45 	reflect.Uint:       decUintSlice,
     46 	reflect.Uint16:     decUint16Slice,
     47 	reflect.Uint32:     decUint32Slice,
     48 	reflect.Uint64:     decUint64Slice,
     49 	reflect.Uintptr:    decUintptrSlice,
     50 }
     51 
     52 func decBoolArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
     53 	// Can only slice if it is addressable.
     54 	if !v.CanAddr() {
     55 		return false
     56 	}
     57 	return decBoolSlice(state, v.Slice(0, v.Len()), length, ovfl)
     58 }
     59 
     60 func decBoolSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
     61 	slice, ok := v.Interface().([]bool)
     62 	if !ok {
     63 		// It is kind bool but not type bool. TODO: We can handle this unsafely.
     64 		return false
     65 	}
     66 	for i := 0; i < length; i++ {
     67 		if state.b.Len() == 0 {
     68 			errorf("decoding bool array or slice: length exceeds input size (%d elements)", length)
     69 		}
     70 		slice[i] = state.decodeUint() != 0
     71 	}
     72 	return true
     73 }
     74 
     75 func decComplex64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
     76 	// Can only slice if it is addressable.
     77 	if !v.CanAddr() {
     78 		return false
     79 	}
     80 	return decComplex64Slice(state, v.Slice(0, v.Len()), length, ovfl)
     81 }
     82 
     83 func decComplex64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
     84 	slice, ok := v.Interface().([]complex64)
     85 	if !ok {
     86 		// It is kind complex64 but not type complex64. TODO: We can handle this unsafely.
     87 		return false
     88 	}
     89 	for i := 0; i < length; i++ {
     90 		if state.b.Len() == 0 {
     91 			errorf("decoding complex64 array or slice: length exceeds input size (%d elements)", length)
     92 		}
     93 		real := float32FromBits(state.decodeUint(), ovfl)
     94 		imag := float32FromBits(state.decodeUint(), ovfl)
     95 		slice[i] = complex(float32(real), float32(imag))
     96 	}
     97 	return true
     98 }
     99 
    100 func decComplex128Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    101 	// Can only slice if it is addressable.
    102 	if !v.CanAddr() {
    103 		return false
    104 	}
    105 	return decComplex128Slice(state, v.Slice(0, v.Len()), length, ovfl)
    106 }
    107 
    108 func decComplex128Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    109 	slice, ok := v.Interface().([]complex128)
    110 	if !ok {
    111 		// It is kind complex128 but not type complex128. TODO: We can handle this unsafely.
    112 		return false
    113 	}
    114 	for i := 0; i < length; i++ {
    115 		if state.b.Len() == 0 {
    116 			errorf("decoding complex128 array or slice: length exceeds input size (%d elements)", length)
    117 		}
    118 		real := float64FromBits(state.decodeUint())
    119 		imag := float64FromBits(state.decodeUint())
    120 		slice[i] = complex(real, imag)
    121 	}
    122 	return true
    123 }
    124 
    125 func decFloat32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    126 	// Can only slice if it is addressable.
    127 	if !v.CanAddr() {
    128 		return false
    129 	}
    130 	return decFloat32Slice(state, v.Slice(0, v.Len()), length, ovfl)
    131 }
    132 
    133 func decFloat32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    134 	slice, ok := v.Interface().([]float32)
    135 	if !ok {
    136 		// It is kind float32 but not type float32. TODO: We can handle this unsafely.
    137 		return false
    138 	}
    139 	for i := 0; i < length; i++ {
    140 		if state.b.Len() == 0 {
    141 			errorf("decoding float32 array or slice: length exceeds input size (%d elements)", length)
    142 		}
    143 		slice[i] = float32(float32FromBits(state.decodeUint(), ovfl))
    144 	}
    145 	return true
    146 }
    147 
    148 func decFloat64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    149 	// Can only slice if it is addressable.
    150 	if !v.CanAddr() {
    151 		return false
    152 	}
    153 	return decFloat64Slice(state, v.Slice(0, v.Len()), length, ovfl)
    154 }
    155 
    156 func decFloat64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    157 	slice, ok := v.Interface().([]float64)
    158 	if !ok {
    159 		// It is kind float64 but not type float64. TODO: We can handle this unsafely.
    160 		return false
    161 	}
    162 	for i := 0; i < length; i++ {
    163 		if state.b.Len() == 0 {
    164 			errorf("decoding float64 array or slice: length exceeds input size (%d elements)", length)
    165 		}
    166 		slice[i] = float64FromBits(state.decodeUint())
    167 	}
    168 	return true
    169 }
    170 
    171 func decIntArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    172 	// Can only slice if it is addressable.
    173 	if !v.CanAddr() {
    174 		return false
    175 	}
    176 	return decIntSlice(state, v.Slice(0, v.Len()), length, ovfl)
    177 }
    178 
    179 func decIntSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    180 	slice, ok := v.Interface().([]int)
    181 	if !ok {
    182 		// It is kind int but not type int. TODO: We can handle this unsafely.
    183 		return false
    184 	}
    185 	for i := 0; i < length; i++ {
    186 		if state.b.Len() == 0 {
    187 			errorf("decoding int array or slice: length exceeds input size (%d elements)", length)
    188 		}
    189 		x := state.decodeInt()
    190 		// MinInt and MaxInt
    191 		if x < ^int64(^uint(0)>>1) || int64(^uint(0)>>1) < x {
    192 			error_(ovfl)
    193 		}
    194 		slice[i] = int(x)
    195 	}
    196 	return true
    197 }
    198 
    199 func decInt16Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    200 	// Can only slice if it is addressable.
    201 	if !v.CanAddr() {
    202 		return false
    203 	}
    204 	return decInt16Slice(state, v.Slice(0, v.Len()), length, ovfl)
    205 }
    206 
    207 func decInt16Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    208 	slice, ok := v.Interface().([]int16)
    209 	if !ok {
    210 		// It is kind int16 but not type int16. TODO: We can handle this unsafely.
    211 		return false
    212 	}
    213 	for i := 0; i < length; i++ {
    214 		if state.b.Len() == 0 {
    215 			errorf("decoding int16 array or slice: length exceeds input size (%d elements)", length)
    216 		}
    217 		x := state.decodeInt()
    218 		if x < math.MinInt16 || math.MaxInt16 < x {
    219 			error_(ovfl)
    220 		}
    221 		slice[i] = int16(x)
    222 	}
    223 	return true
    224 }
    225 
    226 func decInt32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    227 	// Can only slice if it is addressable.
    228 	if !v.CanAddr() {
    229 		return false
    230 	}
    231 	return decInt32Slice(state, v.Slice(0, v.Len()), length, ovfl)
    232 }
    233 
    234 func decInt32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    235 	slice, ok := v.Interface().([]int32)
    236 	if !ok {
    237 		// It is kind int32 but not type int32. TODO: We can handle this unsafely.
    238 		return false
    239 	}
    240 	for i := 0; i < length; i++ {
    241 		if state.b.Len() == 0 {
    242 			errorf("decoding int32 array or slice: length exceeds input size (%d elements)", length)
    243 		}
    244 		x := state.decodeInt()
    245 		if x < math.MinInt32 || math.MaxInt32 < x {
    246 			error_(ovfl)
    247 		}
    248 		slice[i] = int32(x)
    249 	}
    250 	return true
    251 }
    252 
    253 func decInt64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    254 	// Can only slice if it is addressable.
    255 	if !v.CanAddr() {
    256 		return false
    257 	}
    258 	return decInt64Slice(state, v.Slice(0, v.Len()), length, ovfl)
    259 }
    260 
    261 func decInt64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    262 	slice, ok := v.Interface().([]int64)
    263 	if !ok {
    264 		// It is kind int64 but not type int64. TODO: We can handle this unsafely.
    265 		return false
    266 	}
    267 	for i := 0; i < length; i++ {
    268 		if state.b.Len() == 0 {
    269 			errorf("decoding int64 array or slice: length exceeds input size (%d elements)", length)
    270 		}
    271 		slice[i] = state.decodeInt()
    272 	}
    273 	return true
    274 }
    275 
    276 func decInt8Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    277 	// Can only slice if it is addressable.
    278 	if !v.CanAddr() {
    279 		return false
    280 	}
    281 	return decInt8Slice(state, v.Slice(0, v.Len()), length, ovfl)
    282 }
    283 
    284 func decInt8Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    285 	slice, ok := v.Interface().([]int8)
    286 	if !ok {
    287 		// It is kind int8 but not type int8. TODO: We can handle this unsafely.
    288 		return false
    289 	}
    290 	for i := 0; i < length; i++ {
    291 		if state.b.Len() == 0 {
    292 			errorf("decoding int8 array or slice: length exceeds input size (%d elements)", length)
    293 		}
    294 		x := state.decodeInt()
    295 		if x < math.MinInt8 || math.MaxInt8 < x {
    296 			error_(ovfl)
    297 		}
    298 		slice[i] = int8(x)
    299 	}
    300 	return true
    301 }
    302 
    303 func decStringArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    304 	// Can only slice if it is addressable.
    305 	if !v.CanAddr() {
    306 		return false
    307 	}
    308 	return decStringSlice(state, v.Slice(0, v.Len()), length, ovfl)
    309 }
    310 
    311 func decStringSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    312 	slice, ok := v.Interface().([]string)
    313 	if !ok {
    314 		// It is kind string but not type string. TODO: We can handle this unsafely.
    315 		return false
    316 	}
    317 	for i := 0; i < length; i++ {
    318 		if state.b.Len() == 0 {
    319 			errorf("decoding string array or slice: length exceeds input size (%d elements)", length)
    320 		}
    321 		u := state.decodeUint()
    322 		n := int(u)
    323 		if n < 0 || uint64(n) != u || n > state.b.Len() {
    324 			errorf("length of string exceeds input size (%d bytes)", u)
    325 		}
    326 		if n > state.b.Len() {
    327 			errorf("string data too long for buffer: %d", n)
    328 		}
    329 		// Read the data.
    330 		data := make([]byte, n)
    331 		if _, err := state.b.Read(data); err != nil {
    332 			errorf("error decoding string: %s", err)
    333 		}
    334 		slice[i] = string(data)
    335 	}
    336 	return true
    337 }
    338 
    339 func decUintArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    340 	// Can only slice if it is addressable.
    341 	if !v.CanAddr() {
    342 		return false
    343 	}
    344 	return decUintSlice(state, v.Slice(0, v.Len()), length, ovfl)
    345 }
    346 
    347 func decUintSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    348 	slice, ok := v.Interface().([]uint)
    349 	if !ok {
    350 		// It is kind uint but not type uint. TODO: We can handle this unsafely.
    351 		return false
    352 	}
    353 	for i := 0; i < length; i++ {
    354 		if state.b.Len() == 0 {
    355 			errorf("decoding uint array or slice: length exceeds input size (%d elements)", length)
    356 		}
    357 		x := state.decodeUint()
    358 		/*TODO if math.MaxUint32 < x {
    359 			error_(ovfl)
    360 		}*/
    361 		slice[i] = uint(x)
    362 	}
    363 	return true
    364 }
    365 
    366 func decUint16Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    367 	// Can only slice if it is addressable.
    368 	if !v.CanAddr() {
    369 		return false
    370 	}
    371 	return decUint16Slice(state, v.Slice(0, v.Len()), length, ovfl)
    372 }
    373 
    374 func decUint16Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    375 	slice, ok := v.Interface().([]uint16)
    376 	if !ok {
    377 		// It is kind uint16 but not type uint16. TODO: We can handle this unsafely.
    378 		return false
    379 	}
    380 	for i := 0; i < length; i++ {
    381 		if state.b.Len() == 0 {
    382 			errorf("decoding uint16 array or slice: length exceeds input size (%d elements)", length)
    383 		}
    384 		x := state.decodeUint()
    385 		if math.MaxUint16 < x {
    386 			error_(ovfl)
    387 		}
    388 		slice[i] = uint16(x)
    389 	}
    390 	return true
    391 }
    392 
    393 func decUint32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    394 	// Can only slice if it is addressable.
    395 	if !v.CanAddr() {
    396 		return false
    397 	}
    398 	return decUint32Slice(state, v.Slice(0, v.Len()), length, ovfl)
    399 }
    400 
    401 func decUint32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    402 	slice, ok := v.Interface().([]uint32)
    403 	if !ok {
    404 		// It is kind uint32 but not type uint32. TODO: We can handle this unsafely.
    405 		return false
    406 	}
    407 	for i := 0; i < length; i++ {
    408 		if state.b.Len() == 0 {
    409 			errorf("decoding uint32 array or slice: length exceeds input size (%d elements)", length)
    410 		}
    411 		x := state.decodeUint()
    412 		if math.MaxUint32 < x {
    413 			error_(ovfl)
    414 		}
    415 		slice[i] = uint32(x)
    416 	}
    417 	return true
    418 }
    419 
    420 func decUint64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    421 	// Can only slice if it is addressable.
    422 	if !v.CanAddr() {
    423 		return false
    424 	}
    425 	return decUint64Slice(state, v.Slice(0, v.Len()), length, ovfl)
    426 }
    427 
    428 func decUint64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    429 	slice, ok := v.Interface().([]uint64)
    430 	if !ok {
    431 		// It is kind uint64 but not type uint64. TODO: We can handle this unsafely.
    432 		return false
    433 	}
    434 	for i := 0; i < length; i++ {
    435 		if state.b.Len() == 0 {
    436 			errorf("decoding uint64 array or slice: length exceeds input size (%d elements)", length)
    437 		}
    438 		slice[i] = state.decodeUint()
    439 	}
    440 	return true
    441 }
    442 
    443 func decUintptrArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    444 	// Can only slice if it is addressable.
    445 	if !v.CanAddr() {
    446 		return false
    447 	}
    448 	return decUintptrSlice(state, v.Slice(0, v.Len()), length, ovfl)
    449 }
    450 
    451 func decUintptrSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
    452 	slice, ok := v.Interface().([]uintptr)
    453 	if !ok {
    454 		// It is kind uintptr but not type uintptr. TODO: We can handle this unsafely.
    455 		return false
    456 	}
    457 	for i := 0; i < length; i++ {
    458 		if state.b.Len() == 0 {
    459 			errorf("decoding uintptr array or slice: length exceeds input size (%d elements)", length)
    460 		}
    461 		x := state.decodeUint()
    462 		if uint64(^uintptr(0)) < x {
    463 			error_(ovfl)
    464 		}
    465 		slice[i] = uintptr(x)
    466 	}
    467 	return true
    468 }
    469