liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Copyright 2012 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.
 
package reflect
 
import "unsafe"
 
// MakeRO returns a copy of v with the read-only flag set.
func MakeRO(v Value) Value {
   v.flag |= flagStickyRO
   return v
}
 
// IsRO reports whether v's read-only flag is set.
func IsRO(v Value) bool {
   return v.flag&flagStickyRO != 0
}
 
var CallGC = &callGC
 
const PtrSize = ptrSize
 
func FuncLayout(t Type, rcvr Type) (frametype Type, argSize, retOffset uintptr, stack []byte, gc []byte, ptrs bool) {
   var ft *rtype
   var s *bitVector
   if rcvr != nil {
       ft, argSize, retOffset, s, _ = funcLayout((*funcType)(unsafe.Pointer(t.(*rtype))), rcvr.(*rtype))
   } else {
       ft, argSize, retOffset, s, _ = funcLayout((*funcType)(unsafe.Pointer(t.(*rtype))), nil)
   }
   frametype = ft
   for i := uint32(0); i < s.n; i++ {
       stack = append(stack, s.data[i/8]>>(i%8)&1)
   }
   if ft.kind&kindGCProg != 0 {
       panic("can't handle gc programs")
   }
   gcdata := (*[1000]byte)(unsafe.Pointer(ft.gcdata))
   for i := uintptr(0); i < ft.ptrdata/ptrSize; i++ {
       gc = append(gc, gcdata[i/8]>>(i%8)&1)
   }
   ptrs = ft.kind&kindNoPointers == 0
   return
}
 
func TypeLinks() []string {
   var r []string
   sections, offset := typelinks()
   for i, offs := range offset {
       rodata := sections[i]
       for _, off := range offs {
           typ := (*rtype)(resolveTypeOff(unsafe.Pointer(rodata), off))
           r = append(r, typ.String())
       }
   }
   return r
}
 
var GCBits = gcbits
 
func gcbits(interface{}) []byte // provided by runtime
 
func MapBucketOf(x, y Type) Type {
   return bucketOf(x.(*rtype), y.(*rtype))
}
 
func CachedBucketOf(m Type) Type {
   t := m.(*rtype)
   if Kind(t.kind&kindMask) != Map {
       panic("not map")
   }
   tt := (*mapType)(unsafe.Pointer(t))
   return tt.bucket
}
 
type EmbedWithUnexpMeth struct{}
 
func (EmbedWithUnexpMeth) f() {}
 
type pinUnexpMeth interface {
   f()
}
 
var pinUnexpMethI = pinUnexpMeth(EmbedWithUnexpMeth{})
 
func FirstMethodNameBytes(t Type) *byte {
   _ = pinUnexpMethI
 
   ut := t.uncommon()
   if ut == nil {
       panic("type has no methods")
   }
   m := ut.methods()[0]
   mname := t.(*rtype).nameOff(m.name)
   if *mname.data(0, "name flag field")&(1<<2) == 0 {
       panic("method name does not have pkgPath *string")
   }
   return mname.bytes
}
 
type OtherPkgFields struct {
   OtherExported   int
   otherUnexported int
}
 
func IsExported(t Type) bool {
   typ := t.(*rtype)
   n := typ.nameOff(typ.str)
   return n.isExported()
}
 
func ResolveReflectName(s string) {
   resolveReflectName(newName(s, "", false))
}
 
type Buffer struct {
   buf []byte
}