github.com/wfusion/gofusion@v1.1.14/common/utils/inspect/init_go116.go (about)

     1  //go:build go1.16 && !go1.18
     2  // +build go1.16,!go1.18
     3  
     4  package inspect
     5  
     6  import (
     7  	"reflect"
     8  	"runtime"
     9  	"unsafe"
    10  )
    11  
    12  func enumerateTypes(cb func(reflect.Type) bool) {
    13  	t0 := reflect.TypeOf(struct{}{})
    14  	sections, typeLinks := typelinks()
    15  	for i, typeLink := range typeLinks {
    16  		for _, link := range typeLink {
    17  			(*eface)(unsafe.Pointer(&t0)).data = resolveTypeOff(sections[i], link)
    18  			if t0.Kind() != reflect.Ptr || !supportTypes[t0.Elem().Kind()] {
    19  				continue
    20  			}
    21  			typ := t0.Elem()
    22  			if typ.PkgPath() == "" || typ.Name() == "" {
    23  				continue
    24  			}
    25  			if !cb(typ) {
    26  				return
    27  			}
    28  		}
    29  	}
    30  }
    31  
    32  func enumerateFuncs(cb func(*runtime.Func, uintptr) bool) {
    33  	for _, md := range activeModules() {
    34  		for _, tab := range md.ftab {
    35  			f := tab // should not take from &tab.entry because go syntax
    36  			if fn := runtime.FuncForPC(uintptr(f.entry)); fn != nil {
    37  				if !cb(fn, uintptr(f.entry)) {
    38  					return
    39  				}
    40  			}
    41  		}
    42  	}
    43  }