// 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. package runtime import "unsafe" // Needs to be in sync with ../../cmd/internal/ld/decodesym.go:/^commonsize and pkg/reflect/type.go:/type. type _type struct { size uintptr hash uint32 _unused uint8 align uint8 fieldalign uint8 kind uint8 alg *typeAlg // gc stores type info required for garbage collector. // If (kind&KindGCProg)==0, then gc[0] points at sparse GC bitmap // (no indirection), 4 bits per word. // If (kind&KindGCProg)!=0, then gc[1] points to a compiler-generated // read-only GC program; and gc[0] points to BSS space for sparse GC bitmap. // For huge types (>maxGCMask), runtime unrolls the program directly into // GC bitmap and gc[0] is not used. For moderately-sized types, runtime // unrolls the program into gc[0] space on first use. The first byte of gc[0] // (gc[0][0]) contains 'unroll' flag saying whether the program is already // unrolled into gc[0] or not. gc [2]uintptr _string *string x *uncommontype ptrto *_type zero *byte // ptr to the zero value for this type } type method struct { name *string pkgpath *string mtyp *_type typ *_type ifn unsafe.Pointer tfn unsafe.Pointer } type uncommontype struct { name *string pkgpath *string mhdr []method } type imethod struct { name *string pkgpath *string _type *_type } type interfacetype struct { typ _type mhdr []imethod } type maptype struct { typ _type key *_type elem *_type bucket *_type // internal type representing a hash bucket hmap *_type // internal type representing a hmap keysize uint8 // size of key slot indirectkey bool // store ptr to key instead of key itself valuesize uint8 // size of value slot indirectvalue bool // store ptr to value instead of value itself bucketsize uint16 // size of bucket reflexivekey bool // true if k==k for all keys } type chantype struct { typ _type elem *_type dir uintptr } type slicetype struct { typ _type elem *_type } type functype struct { typ _type dotdotdot bool in slice out slice } type ptrtype struct { typ _type elem *_type }