| // Copyright 2009 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. | |
| /* | |
| * Runtime type representation. | |
| * | |
| * The following files know the exact layout of these | |
| * data structures and must be kept in sync with this file: | |
| * | |
| * ../../cmd/gc/reflect.c | |
| * ../reflect/type.go | |
| * type.h | |
| */ | |
| package runtime | |
| import "unsafe" | |
| // The compiler can only construct empty interface values at | |
| // compile time; non-empty interface values get created | |
| // during initialization. Type is an empty interface | |
| // so that the compiler can lay out references as data. | |
| type Type interface{} | |
| // All types begin with a few common fields needed for | |
| // the interface runtime. | |
| type commonType struct { | |
| size uintptr // size in bytes | |
| hash uint32 // hash of type; avoids computation in hash tables | |
| alg uint8 // algorithm for copy+hash+cmp (../runtime/runtime.h:/AMEM) | |
| align uint8 // alignment of variable with this type | |
| fieldAlign uint8 // alignment of struct field with this type | |
| kind uint8 // enumeration for C | |
| string *string // string form; unnecessary but undeniably useful | |
| *uncommonType // (relatively) uncommon fields | |
| } | |
| // Values for commonType.kind. | |
| const ( | |
| kindBool = 1 + iota | |
| kindInt | |
| kindInt8 | |
| kindInt16 | |
| kindInt32 | |
| kindInt64 | |
| kindUint | |
| kindUint8 | |
| kindUint16 | |
| kindUint32 | |
| kindUint64 | |
| kindUintptr | |
| kindFloat | |
| kindFloat32 | |
| kindFloat64 | |
| kindArray | |
| kindChan | |
| kindFunc | |
| kindInterface | |
| kindMap | |
| kindPtr | |
| kindSlice | |
| kindString | |
| kindStruct | |
| kindUnsafePointer | |
| kindNoPointers = 1 << 7 // OR'ed into kind | |
| ) | |
| // Method on non-interface type | |
| type method struct { | |
| name *string // name of method | |
| pkgPath *string // nil for exported Names; otherwise import path | |
| mtyp *Type // method type (without receiver) | |
| typ *Type // .(*FuncType) underneath (with receiver) | |
| ifn unsafe.Pointer // fn used in interface call (one-word receiver) | |
| tfn unsafe.Pointer // fn used for normal method call | |
| } | |
| // uncommonType is present only for types with names or methods | |
| // (if T is a named type, the uncommonTypes for T and *T have methods). | |
| // Using a pointer to this struct reduces the overall size required | |
| // to describe an unnamed type with no methods. | |
| type uncommonType struct { | |
| name *string // name of type | |
| pkgPath *string // import path; nil for built-in types like int, string | |
| methods []method // methods associated with type | |
| } | |
| // BoolType represents a boolean type. | |
| type BoolType commonType | |
| // Float32Type represents a float32 type. | |
| type Float32Type commonType | |
| // Float64Type represents a float64 type. | |
| type Float64Type commonType | |
| // FloatType represents a float type. | |
| type FloatType commonType | |
| // Complex64Type represents a complex64 type. | |
| type Complex64Type commonType | |
| // Complex128Type represents a complex128 type. | |
| type Complex128Type commonType | |
| // ComplexType represents a complex type. | |
| type ComplexType commonType | |
| // Int16Type represents an int16 type. | |
| type Int16Type commonType | |
| // Int32Type represents an int32 type. | |
| type Int32Type commonType | |
| // Int64Type represents an int64 type. | |
| type Int64Type commonType | |
| // Int8Type represents an int8 type. | |
| type Int8Type commonType | |
| // IntType represents an int type. | |
| type IntType commonType | |
| // Uint16Type represents a uint16 type. | |
| type Uint16Type commonType | |
| // Uint32Type represents a uint32 type. | |
| type Uint32Type commonType | |
| // Uint64Type represents a uint64 type. | |
| type Uint64Type commonType | |
| // Uint8Type represents a uint8 type. | |
| type Uint8Type commonType | |
| // UintType represents a uint type. | |
| type UintType commonType | |
| // StringType represents a string type. | |
| type StringType commonType | |
| // UintptrType represents a uintptr type. | |
| type UintptrType commonType | |
| // UnsafePointerType represents an unsafe.Pointer type. | |
| type UnsafePointerType commonType | |
| // ArrayType represents a fixed array type. | |
| type ArrayType struct { | |
| commonType | |
| elem *Type // array element type | |
| len uintptr | |
| } | |
| // SliceType represents a slice type. | |
| type SliceType struct { | |
| commonType | |
| elem *Type // slice element type | |
| } | |
| // ChanDir represents a channel type's direction. | |
| type ChanDir int | |
| const ( | |
| RecvDir ChanDir = 1 << iota // <-chan | |
| SendDir // chan<- | |
| BothDir = RecvDir | SendDir // chan | |
| ) | |
| // ChanType represents a channel type. | |
| type ChanType struct { | |
| commonType | |
| elem *Type // channel element type | |
| dir uintptr // channel direction (ChanDir) | |
| } | |
| // FuncType represents a function type. | |
| type FuncType struct { | |
| commonType | |
| dotdotdot bool // last input parameter is ... | |
| in []*Type // input parameter types | |
| out []*Type // output parameter types | |
| } | |
| // Method on interface type | |
| type imethod struct { | |
| name *string // name of method | |
| pkgPath *string // nil for exported Names; otherwise import path | |
| typ *Type // .(*FuncType) underneath | |
| } | |
| // InterfaceType represents an interface type. | |
| type InterfaceType struct { | |
| commonType | |
| methods []imethod // sorted by hash | |
| } | |
| // MapType represents a map type. | |
| type MapType struct { | |
| commonType | |
| key *Type // map key type | |
| elem *Type // map element (value) type | |
| } | |
| // PtrType represents a pointer type. | |
| type PtrType struct { | |
| commonType | |
| elem *Type // pointer element (pointed at) type | |
| } | |
| // Struct field | |
| type structField struct { | |
| name *string // nil for embedded fields | |
| pkgPath *string // nil for exported Names; otherwise import path | |
| typ *Type // type of field | |
| tag *string // nil if no tag | |
| offset uintptr // byte offset of field within struct | |
| } | |
| // StructType represents a struct type. | |
| type StructType struct { | |
| commonType | |
| fields []structField // sorted by offset | |
| } | |
| /* | |
| * Must match iface.c:/Itab and compilers. | |
| */ | |
| type Itable struct { | |
| Itype *Type // (*tab.inter).(*InterfaceType) is the interface type | |
| Type *Type | |
| link *Itable | |
| bad int32 | |
| unused int32 | |
| Fn [100000]uintptr // bigger than we'll ever see | |
| } |