|
@@ -4,16 +4,10 @@ package reflect2
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"reflect"
|
|
"reflect"
|
|
|
- "runtime"
|
|
|
|
|
- "strings"
|
|
|
|
|
"sync"
|
|
"sync"
|
|
|
"unsafe"
|
|
"unsafe"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-// typelinks1 for 1.5 ~ 1.6
|
|
|
|
|
-//go:linkname typelinks1 reflect.typelinks
|
|
|
|
|
-func typelinks1() [][]unsafe.Pointer
|
|
|
|
|
-
|
|
|
|
|
// typelinks2 for 1.7 ~
|
|
// typelinks2 for 1.7 ~
|
|
|
//go:linkname typelinks2 reflect.typelinks
|
|
//go:linkname typelinks2 reflect.typelinks
|
|
|
func typelinks2() (sections []unsafe.Pointer, offset [][]int32)
|
|
func typelinks2() (sections []unsafe.Pointer, offset [][]int32)
|
|
@@ -29,49 +23,10 @@ func discoverTypes() {
|
|
|
types = make(map[string]reflect.Type)
|
|
types = make(map[string]reflect.Type)
|
|
|
packages = make(map[string]map[string]reflect.Type)
|
|
packages = make(map[string]map[string]reflect.Type)
|
|
|
|
|
|
|
|
- ver := runtime.Version()
|
|
|
|
|
- if ver == "go1.5" || strings.HasPrefix(ver, "go1.5.") {
|
|
|
|
|
- loadGo15Types()
|
|
|
|
|
- } else if ver == "go1.6" || strings.HasPrefix(ver, "go1.6.") {
|
|
|
|
|
- loadGo15Types()
|
|
|
|
|
- } else {
|
|
|
|
|
- loadGo17Types()
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func loadGo15Types() {
|
|
|
|
|
- var obj interface{} = reflect.TypeOf(0)
|
|
|
|
|
- typePtrss := typelinks1()
|
|
|
|
|
- for _, typePtrs := range typePtrss {
|
|
|
|
|
- for _, typePtr := range typePtrs {
|
|
|
|
|
- (*emptyInterface)(unsafe.Pointer(&obj)).word = typePtr
|
|
|
|
|
- typ := obj.(reflect.Type)
|
|
|
|
|
- if typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Struct {
|
|
|
|
|
- loadedType := typ.Elem()
|
|
|
|
|
- pkgTypes := packages[loadedType.PkgPath()]
|
|
|
|
|
- if pkgTypes == nil {
|
|
|
|
|
- pkgTypes = map[string]reflect.Type{}
|
|
|
|
|
- packages[loadedType.PkgPath()] = pkgTypes
|
|
|
|
|
- }
|
|
|
|
|
- types[loadedType.String()] = loadedType
|
|
|
|
|
- pkgTypes[loadedType.Name()] = loadedType
|
|
|
|
|
- }
|
|
|
|
|
- if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Ptr &&
|
|
|
|
|
- typ.Elem().Elem().Kind() == reflect.Struct {
|
|
|
|
|
- loadedType := typ.Elem().Elem()
|
|
|
|
|
- pkgTypes := packages[loadedType.PkgPath()]
|
|
|
|
|
- if pkgTypes == nil {
|
|
|
|
|
- pkgTypes = map[string]reflect.Type{}
|
|
|
|
|
- packages[loadedType.PkgPath()] = pkgTypes
|
|
|
|
|
- }
|
|
|
|
|
- types[loadedType.String()] = loadedType
|
|
|
|
|
- pkgTypes[loadedType.Name()] = loadedType
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ loadGoTypes()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func loadGo17Types() {
|
|
|
|
|
|
|
+func loadGoTypes() {
|
|
|
var obj interface{} = reflect.TypeOf(0)
|
|
var obj interface{} = reflect.TypeOf(0)
|
|
|
sections, offset := typelinks2()
|
|
sections, offset := typelinks2()
|
|
|
for i, offs := range offset {
|
|
for i, offs := range offset {
|