Source file src/encoding/gob/dec_helpers.go

     1  // Code generated by go run decgen.go -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  

View as plain text