f8d9fa9e80
This upgrades all of libgo other than the runtime package to the Go 1.4 release. In Go 1.4 much of the runtime was rewritten into Go. Merging that code will take more time and will not change the API, so I'm putting it off for now. There are a few runtime changes anyhow, to accomodate other packages that rely on minor modifications to the runtime support. The compiler changes slightly to add a one-bit flag to each type descriptor kind that is stored directly in an interface, which for gccgo is currently only pointer types. Another one-bit flag (gcprog) is reserved because it is used by the gc compiler, but gccgo does not currently use it. There is another error check in the compiler since I ran across it during testing. gotools/: * Makefile.am (go_cmd_go_files): Sort entries. Add generate.go. * Makefile.in: Rebuild. From-SVN: r219627
415 lines
9.9 KiB
Go
415 lines
9.9 KiB
Go
// Created by encgen --output enc_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 (
|
|
"reflect"
|
|
)
|
|
|
|
var encArrayHelper = map[reflect.Kind]encHelper{
|
|
reflect.Bool: encBoolArray,
|
|
reflect.Complex64: encComplex64Array,
|
|
reflect.Complex128: encComplex128Array,
|
|
reflect.Float32: encFloat32Array,
|
|
reflect.Float64: encFloat64Array,
|
|
reflect.Int: encIntArray,
|
|
reflect.Int16: encInt16Array,
|
|
reflect.Int32: encInt32Array,
|
|
reflect.Int64: encInt64Array,
|
|
reflect.Int8: encInt8Array,
|
|
reflect.String: encStringArray,
|
|
reflect.Uint: encUintArray,
|
|
reflect.Uint16: encUint16Array,
|
|
reflect.Uint32: encUint32Array,
|
|
reflect.Uint64: encUint64Array,
|
|
reflect.Uintptr: encUintptrArray,
|
|
}
|
|
|
|
var encSliceHelper = map[reflect.Kind]encHelper{
|
|
reflect.Bool: encBoolSlice,
|
|
reflect.Complex64: encComplex64Slice,
|
|
reflect.Complex128: encComplex128Slice,
|
|
reflect.Float32: encFloat32Slice,
|
|
reflect.Float64: encFloat64Slice,
|
|
reflect.Int: encIntSlice,
|
|
reflect.Int16: encInt16Slice,
|
|
reflect.Int32: encInt32Slice,
|
|
reflect.Int64: encInt64Slice,
|
|
reflect.Int8: encInt8Slice,
|
|
reflect.String: encStringSlice,
|
|
reflect.Uint: encUintSlice,
|
|
reflect.Uint16: encUint16Slice,
|
|
reflect.Uint32: encUint32Slice,
|
|
reflect.Uint64: encUint64Slice,
|
|
reflect.Uintptr: encUintptrSlice,
|
|
}
|
|
|
|
func encBoolArray(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encBoolSlice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encBoolSlice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != false || state.sendZero {
|
|
if x {
|
|
state.encodeUint(1)
|
|
} else {
|
|
state.encodeUint(0)
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encComplex64Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encComplex64Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encComplex64Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0+0i || state.sendZero {
|
|
rpart := floatBits(float64(real(x)))
|
|
ipart := floatBits(float64(imag(x)))
|
|
state.encodeUint(rpart)
|
|
state.encodeUint(ipart)
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encComplex128Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encComplex128Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encComplex128Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0+0i || state.sendZero {
|
|
rpart := floatBits(real(x))
|
|
ipart := floatBits(imag(x))
|
|
state.encodeUint(rpart)
|
|
state.encodeUint(ipart)
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encFloat32Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encFloat32Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encFloat32Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
bits := floatBits(float64(x))
|
|
state.encodeUint(bits)
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encFloat64Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encFloat64Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encFloat64Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
bits := floatBits(x)
|
|
state.encodeUint(bits)
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encIntArray(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encIntSlice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encIntSlice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeInt(int64(x))
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encInt16Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encInt16Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encInt16Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeInt(int64(x))
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encInt32Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encInt32Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encInt32Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeInt(int64(x))
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encInt64Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encInt64Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encInt64Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeInt(x)
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encInt8Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encInt8Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encInt8Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeInt(int64(x))
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encStringArray(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encStringSlice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encStringSlice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != "" || state.sendZero {
|
|
state.encodeUint(uint64(len(x)))
|
|
state.b.WriteString(x)
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encUintArray(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encUintSlice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encUintSlice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeUint(uint64(x))
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encUint16Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encUint16Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encUint16Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeUint(uint64(x))
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encUint32Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encUint32Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encUint32Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeUint(uint64(x))
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encUint64Array(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encUint64Slice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encUint64Slice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeUint(x)
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func encUintptrArray(state *encoderState, v reflect.Value) bool {
|
|
// Can only slice if it is addressable.
|
|
if !v.CanAddr() {
|
|
return false
|
|
}
|
|
return encUintptrSlice(state, v.Slice(0, v.Len()))
|
|
}
|
|
|
|
func encUintptrSlice(state *encoderState, v reflect.Value) 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 _, x := range slice {
|
|
if x != 0 || state.sendZero {
|
|
state.encodeUint(uint64(x))
|
|
}
|
|
}
|
|
return true
|
|
}
|