1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package reflect 6 7 import "unsafe" 8 9 // MakeRO returns a copy of v with the read-only flag set. 10 func MakeRO(v Value) Value { 11 v.flag |= flagRO 12 return v 13 } 14 15 // IsRO reports whether v's read-only flag is set. 16 func IsRO(v Value) bool { 17 return v.flag&flagRO != 0 18 } 19 20 var CallGC = &callGC 21 22 const PtrSize = ptrSize 23 24 func FuncLayout(t Type, rcvr Type) (frametype Type, argSize, retOffset uintptr, stack []byte, gc []byte, ptrs bool) { 25 var ft *rtype 26 var s *bitVector 27 if rcvr != nil { 28 ft, argSize, retOffset, s, _ = funcLayout(t.(*rtype), rcvr.(*rtype)) 29 } else { 30 ft, argSize, retOffset, s, _ = funcLayout(t.(*rtype), nil) 31 } 32 frametype = ft 33 for i := uint32(0); i < s.n; i++ { 34 stack = append(stack, s.data[i/8]>>(i%8)&1) 35 } 36 if ft.kind&kindGCProg != 0 { 37 panic("can't handle gc programs") 38 } 39 gcdata := (*[1000]byte)(unsafe.Pointer(ft.gcdata)) 40 for i := uintptr(0); i < ft.ptrdata/ptrSize; i++ { 41 gc = append(gc, gcdata[i/8]>>(i%8)&1) 42 } 43 ptrs = ft.kind&kindNoPointers == 0 44 return 45 } 46 47 func TypeLinks() []string { 48 var r []string 49 for _, m := range typelinks() { 50 for _, t := range m { 51 r = append(r, *t.string) 52 } 53 } 54 return r 55 } 56 57 var GCBits = gcbits 58 59 func gcbits(interface{}) []byte // provided by runtime 60 61 func MapBucketOf(x, y Type) Type { 62 return bucketOf(x.(*rtype), y.(*rtype)) 63 } 64 65 func CachedBucketOf(m Type) Type { 66 t := m.(*rtype) 67 if Kind(t.kind&kindMask) != Map { 68 panic("not map") 69 } 70 tt := (*mapType)(unsafe.Pointer(t)) 71 return tt.bucket 72 } 73