reflect: remove unecessary heap allocations
Этот коммит содержится в:
родитель
ad32d26511
коммит
dd4e9e86e7
1 изменённых файлов: 22 добавлений и 10 удалений
|
@ -601,6 +601,18 @@ func (t *rawType) Kind() Kind {
|
||||||
return Kind(t.meta & kindMask)
|
return Kind(t.meta & kindMask)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
errTypeElem = &TypeError{"Elem"}
|
||||||
|
errTypeKey = &TypeError{"Key"}
|
||||||
|
errTypeField = &TypeError{"Field"}
|
||||||
|
errTypeBits = &TypeError{"Bits"}
|
||||||
|
errTypeLen = &TypeError{"Len"}
|
||||||
|
errTypeNumField = &TypeError{"NumField"}
|
||||||
|
errTypeChanDir = &TypeError{"ChanDir"}
|
||||||
|
errTypeFieldByName = &TypeError{"FieldByName"}
|
||||||
|
errTypeFieldByIndex = &TypeError{"FieldByIndex"}
|
||||||
|
)
|
||||||
|
|
||||||
// Elem returns the element type for channel, slice and array types, the
|
// Elem returns the element type for channel, slice and array types, the
|
||||||
// pointed-to value for pointer types, and the key type for map types.
|
// pointed-to value for pointer types, and the key type for map types.
|
||||||
func (t *rawType) Elem() Type {
|
func (t *rawType) Elem() Type {
|
||||||
|
@ -619,14 +631,14 @@ func (t *rawType) elem() *rawType {
|
||||||
case Chan, Slice, Array, Map:
|
case Chan, Slice, Array, Map:
|
||||||
return (*elemType)(unsafe.Pointer(underlying)).elem
|
return (*elemType)(unsafe.Pointer(underlying)).elem
|
||||||
default:
|
default:
|
||||||
panic(&TypeError{"Elem"})
|
panic(errTypeElem)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *rawType) key() *rawType {
|
func (t *rawType) key() *rawType {
|
||||||
underlying := t.underlying()
|
underlying := t.underlying()
|
||||||
if underlying.Kind() != Map {
|
if underlying.Kind() != Map {
|
||||||
panic(&TypeError{"Key"})
|
panic(errTypeKey)
|
||||||
}
|
}
|
||||||
return (*mapType)(unsafe.Pointer(underlying)).key
|
return (*mapType)(unsafe.Pointer(underlying)).key
|
||||||
}
|
}
|
||||||
|
@ -683,7 +695,7 @@ func rawStructFieldFromPointer(descriptor *structType, fieldType *rawType, data
|
||||||
// For internal use only.
|
// For internal use only.
|
||||||
func (t *rawType) rawField(n int) rawStructField {
|
func (t *rawType) rawField(n int) rawStructField {
|
||||||
if t.Kind() != Struct {
|
if t.Kind() != Struct {
|
||||||
panic(&TypeError{"Field"})
|
panic(errTypeField)
|
||||||
}
|
}
|
||||||
descriptor := (*structType)(unsafe.Pointer(t.underlying()))
|
descriptor := (*structType)(unsafe.Pointer(t.underlying()))
|
||||||
if uint(n) >= uint(descriptor.numField) {
|
if uint(n) >= uint(descriptor.numField) {
|
||||||
|
@ -716,7 +728,7 @@ func (t *rawType) rawField(n int) rawStructField {
|
||||||
// For internal use only.
|
// For internal use only.
|
||||||
func (t *rawType) rawFieldByName(n string) (rawStructField, []int, bool) {
|
func (t *rawType) rawFieldByName(n string) (rawStructField, []int, bool) {
|
||||||
if t.Kind() != Struct {
|
if t.Kind() != Struct {
|
||||||
panic(&TypeError{"Field"})
|
panic(errTypeField)
|
||||||
}
|
}
|
||||||
|
|
||||||
type fieldWalker struct {
|
type fieldWalker struct {
|
||||||
|
@ -812,14 +824,14 @@ func (t *rawType) Bits() int {
|
||||||
if kind >= Int && kind <= Complex128 {
|
if kind >= Int && kind <= Complex128 {
|
||||||
return int(t.Size()) * 8
|
return int(t.Size()) * 8
|
||||||
}
|
}
|
||||||
panic(TypeError{"Bits"})
|
panic(errTypeBits)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Len returns the number of elements in this array. It panics of the type kind
|
// Len returns the number of elements in this array. It panics of the type kind
|
||||||
// is not Array.
|
// is not Array.
|
||||||
func (t *rawType) Len() int {
|
func (t *rawType) Len() int {
|
||||||
if t.Kind() != Array {
|
if t.Kind() != Array {
|
||||||
panic(TypeError{"Len"})
|
panic(errTypeLen)
|
||||||
}
|
}
|
||||||
|
|
||||||
return int((*arrayType)(unsafe.Pointer(t.underlying())).arrayLen)
|
return int((*arrayType)(unsafe.Pointer(t.underlying())).arrayLen)
|
||||||
|
@ -829,7 +841,7 @@ func (t *rawType) Len() int {
|
||||||
// type kinds.
|
// type kinds.
|
||||||
func (t *rawType) NumField() int {
|
func (t *rawType) NumField() int {
|
||||||
if t.Kind() != Struct {
|
if t.Kind() != Struct {
|
||||||
panic(&TypeError{"NumField"})
|
panic(errTypeNumField)
|
||||||
}
|
}
|
||||||
return int((*structType)(unsafe.Pointer(t.underlying())).numField)
|
return int((*structType)(unsafe.Pointer(t.underlying())).numField)
|
||||||
}
|
}
|
||||||
|
@ -973,7 +985,7 @@ func (t *rawType) isBinary() bool {
|
||||||
|
|
||||||
func (t *rawType) ChanDir() ChanDir {
|
func (t *rawType) ChanDir() ChanDir {
|
||||||
if t.Kind() != Chan {
|
if t.Kind() != Chan {
|
||||||
panic(TypeError{"ChanDir"})
|
panic(errTypeChanDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
dir := int((*elemType)(unsafe.Pointer(t)).numMethod)
|
dir := int((*elemType)(unsafe.Pointer(t)).numMethod)
|
||||||
|
@ -1084,7 +1096,7 @@ func (t *rawType) PkgPath() string {
|
||||||
|
|
||||||
func (t *rawType) FieldByName(name string) (StructField, bool) {
|
func (t *rawType) FieldByName(name string) (StructField, bool) {
|
||||||
if t.Kind() != Struct {
|
if t.Kind() != Struct {
|
||||||
panic(TypeError{"FieldByName"})
|
panic(errTypeFieldByName)
|
||||||
}
|
}
|
||||||
|
|
||||||
field, index, ok := t.rawFieldByName(name)
|
field, index, ok := t.rawFieldByName(name)
|
||||||
|
@ -1110,7 +1122,7 @@ func (t *rawType) FieldByIndex(index []int) StructField {
|
||||||
for _, n := range index {
|
for _, n := range index {
|
||||||
structOrPtrToStruct := ftype.Kind() == Struct || (ftype.Kind() == Pointer && ftype.elem().Kind() == Struct)
|
structOrPtrToStruct := ftype.Kind() == Struct || (ftype.Kind() == Pointer && ftype.elem().Kind() == Struct)
|
||||||
if !structOrPtrToStruct {
|
if !structOrPtrToStruct {
|
||||||
panic(&TypeError{"FieldByIndex:" + ftype.Kind().String()})
|
panic(errTypeFieldByIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ftype.Kind() == Pointer {
|
if ftype.Kind() == Pointer {
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче