diff options
Diffstat (limited to 'libgo/go/runtime/type.go')
-rw-r--r-- | libgo/go/runtime/type.go | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/libgo/go/runtime/type.go b/libgo/go/runtime/type.go new file mode 100644 index 0000000000..cfee35a6fe --- /dev/null +++ b/libgo/go/runtime/type.go @@ -0,0 +1,125 @@ +// 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" + +type _type struct { + kind uint8 + align int8 + fieldAlign uint8 + _ uint8 + size uintptr + hash uint32 + + hashfn func(unsafe.Pointer, uintptr) uintptr + equalfn func(unsafe.Pointer, unsafe.Pointer) bool + + gc unsafe.Pointer + string *string + *uncommontype + ptrToThis *_type +} + +// Return whether two type descriptors are equal. +// This is gccgo-specific, as gccgo, unlike gc, permits multiple +// independent descriptors for a single type. +func eqtype(t1, t2 *_type) bool { + switch { + case t1 == t2: + return true + case t1 == nil || t2 == nil: + return false + case t1.kind != t2.kind || t1.hash != t2.hash: + return false + default: + return *t1.string == *t2.string + } +} + +type method struct { + name *string + pkgPath *string + mtyp *_type + typ *_type + tfn unsafe.Pointer +} + +type uncommontype struct { + name *string + pkgPath *string + methods []method +} + +type imethod struct { + name *string + pkgPath *string + typ *_type +} + +type interfacetype struct { + typ _type + methods []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 + needkeyupdate bool // true if we need to update key on an overwrite +} + +type arraytype struct { + typ _type + elem *_type + slice *_type + len uintptr +} + +type chantype struct { + typ _type + elem *_type + dir uintptr +} + +type slicetype struct { + typ _type + elem *_type +} + +type functype struct { + typ _type + dotdotdot bool + in []*_type + out []*_type +} + +type ptrtype struct { + typ _type + elem *_type +} + +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 +} + +type structtype struct { + typ _type + fields []structfield +} |