| | |
| | |
| | |
| |
|
| | package reflect |
| |
|
| | import ( |
| | "internal/abi" |
| | "internal/goarch" |
| | "sync" |
| | "unsafe" |
| | ) |
| |
|
| | |
| | func MakeRO(v Value) Value { |
| | v.flag |= flagStickyRO |
| | return v |
| | } |
| |
|
| | |
| | func IsRO(v Value) bool { |
| | return v.flag&flagStickyRO != 0 |
| | } |
| |
|
| | var CallGC = &callGC |
| |
|
| | |
| | |
| | |
| | |
| | |
| | func FuncLayout(t Type, rcvr Type) (frametype Type, argSize, retOffset uintptr, stack, gc, inReg, outReg []byte, ptrs bool) { |
| | var ft *abi.Type |
| | var abid abiDesc |
| | if rcvr != nil { |
| | ft, _, abid = funcLayout((*funcType)(unsafe.Pointer(t.common())), rcvr.common()) |
| | } else { |
| | ft, _, abid = funcLayout((*funcType)(unsafe.Pointer(t.(*rtype))), nil) |
| | } |
| | |
| | argSize = abid.stackCallArgsSize |
| | retOffset = abid.retOffset |
| | frametype = toType(ft) |
| |
|
| | |
| | for i := uint32(0); i < abid.stackPtrs.n; i++ { |
| | stack = append(stack, abid.stackPtrs.data[i/8]>>(i%8)&1) |
| | } |
| |
|
| | |
| | bool2byte := func(b bool) byte { |
| | if b { |
| | return 1 |
| | } |
| | return 0 |
| | } |
| | for i := 0; i < intArgRegs; i++ { |
| | inReg = append(inReg, bool2byte(abid.inRegPtrs.Get(i))) |
| | outReg = append(outReg, bool2byte(abid.outRegPtrs.Get(i))) |
| | } |
| |
|
| | |
| | ptrs = ft.Pointers() |
| | if ptrs { |
| | nptrs := ft.PtrBytes / goarch.PtrSize |
| | gcdata := ft.GcSlice(0, (nptrs+7)/8) |
| | for i := uintptr(0); i < nptrs; i++ { |
| | gc = append(gc, gcdata[i/8]>>(i%8)&1) |
| | } |
| | } |
| | 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(rodata, off)) |
| | r = append(r, typ.String()) |
| | } |
| | } |
| | return r |
| | } |
| |
|
| | var GCBits = gcbits |
| |
|
| | func gcbits(any) []byte |
| |
|
| | 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.DataChecked(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.t.Str) |
| | return n.IsExported() |
| | } |
| |
|
| | func ResolveReflectName(s string) { |
| | resolveReflectName(newName(s, "", false, false)) |
| | } |
| |
|
| | type Buffer struct { |
| | buf []byte |
| | } |
| |
|
| | func clearLayoutCache() { |
| | layoutCache = sync.Map{} |
| | } |
| |
|
| | func SetArgRegs(ints, floats int, floatSize uintptr) (oldInts, oldFloats int, oldFloatSize uintptr) { |
| | oldInts = intArgRegs |
| | oldFloats = floatArgRegs |
| | oldFloatSize = floatRegSize |
| | intArgRegs = ints |
| | floatArgRegs = floats |
| | floatRegSize = floatSize |
| | clearLayoutCache() |
| | return |
| | } |
| |
|
| | var MethodValueCallCodePtr = methodValueCallCodePtr |
| |
|
| | var InternalIsZero = isZero |
| |
|
| | var IsRegularMemory = isRegularMemory |
| |
|
| | func MapGroupOf(x, y Type) Type { |
| | grp, _ := groupAndSlotOf(x, y) |
| | return grp |
| | } |
| |
|