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 := state.b.Bytes() 331 if len(data) < n { 332 errorf("invalid string length %d: exceeds input size %d", n, len(data)) 333 } 334 slice[i] = string(data[:n]) 335 state.b.Drop(n) 336 } 337 return true 338 } 339 340 func decUintArray(state *decoderState, v reflect.Value, length int, ovfl error) bool { 341 // Can only slice if it is addressable. 342 if !v.CanAddr() { 343 return false 344 } 345 return decUintSlice(state, v.Slice(0, v.Len()), length, ovfl) 346 } 347 348 func decUintSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool { 349 slice, ok := v.Interface().([]uint) 350 if !ok { 351 // It is kind uint but not type uint. TODO: We can handle this unsafely. 352 return false 353 } 354 for i := 0; i < length; i++ { 355 if state.b.Len() == 0 { 356 errorf("decoding uint array or slice: length exceeds input size (%d elements)", length) 357 } 358 x := state.decodeUint() 359 /*TODO if math.MaxUint32 < x { 360 error_(ovfl) 361 }*/ 362 slice[i] = uint(x) 363 } 364 return true 365 } 366 367 func decUint16Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { 368 // Can only slice if it is addressable. 369 if !v.CanAddr() { 370 return false 371 } 372 return decUint16Slice(state, v.Slice(0, v.Len()), length, ovfl) 373 } 374 375 func decUint16Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { 376 slice, ok := v.Interface().([]uint16) 377 if !ok { 378 // It is kind uint16 but not type uint16. TODO: We can handle this unsafely. 379 return false 380 } 381 for i := 0; i < length; i++ { 382 if state.b.Len() == 0 { 383 errorf("decoding uint16 array or slice: length exceeds input size (%d elements)", length) 384 } 385 x := state.decodeUint() 386 if math.MaxUint16 < x { 387 error_(ovfl) 388 } 389 slice[i] = uint16(x) 390 } 391 return true 392 } 393 394 func decUint32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { 395 // Can only slice if it is addressable. 396 if !v.CanAddr() { 397 return false 398 } 399 return decUint32Slice(state, v.Slice(0, v.Len()), length, ovfl) 400 } 401 402 func decUint32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { 403 slice, ok := v.Interface().([]uint32) 404 if !ok { 405 // It is kind uint32 but not type uint32. TODO: We can handle this unsafely. 406 return false 407 } 408 for i := 0; i < length; i++ { 409 if state.b.Len() == 0 { 410 errorf("decoding uint32 array or slice: length exceeds input size (%d elements)", length) 411 } 412 x := state.decodeUint() 413 if math.MaxUint32 < x { 414 error_(ovfl) 415 } 416 slice[i] = uint32(x) 417 } 418 return true 419 } 420 421 func decUint64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool { 422 // Can only slice if it is addressable. 423 if !v.CanAddr() { 424 return false 425 } 426 return decUint64Slice(state, v.Slice(0, v.Len()), length, ovfl) 427 } 428 429 func decUint64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool { 430 slice, ok := v.Interface().([]uint64) 431 if !ok { 432 // It is kind uint64 but not type uint64. TODO: We can handle this unsafely. 433 return false 434 } 435 for i := 0; i < length; i++ { 436 if state.b.Len() == 0 { 437 errorf("decoding uint64 array or slice: length exceeds input size (%d elements)", length) 438 } 439 slice[i] = state.decodeUint() 440 } 441 return true 442 } 443 444 func decUintptrArray(state *decoderState, v reflect.Value, length int, ovfl error) bool { 445 // Can only slice if it is addressable. 446 if !v.CanAddr() { 447 return false 448 } 449 return decUintptrSlice(state, v.Slice(0, v.Len()), length, ovfl) 450 } 451 452 func decUintptrSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool { 453 slice, ok := v.Interface().([]uintptr) 454 if !ok { 455 // It is kind uintptr but not type uintptr. TODO: We can handle this unsafely. 456 return false 457 } 458 for i := 0; i < length; i++ { 459 if state.b.Len() == 0 { 460 errorf("decoding uintptr array or slice: length exceeds input size (%d elements)", length) 461 } 462 x := state.decodeUint() 463 if uint64(^uintptr(0)) < x { 464 error_(ovfl) 465 } 466 slice[i] = uintptr(x) 467 } 468 return true 469 } 470