summaryrefslogtreecommitdiff
path: root/libgo/go/runtime/type.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/runtime/type.go')
-rw-r--r--libgo/go/runtime/type.go125
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
+}