const itabInitSize … var itabLock … var itabTable … var itabTableInit … type itabTableType … func itabHashFunc(inter *interfacetype, typ *_type) uintptr { … } // getitab should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/bytedance/sonic // // Do not remove or change the type signature. // See go.dev/issue/67401. // //go:linkname getitab func getitab(inter *interfacetype, typ *_type, canfail bool) *itab { … } // find finds the given interface/type pair in t. // Returns nil if the given interface/type pair isn't present. func (t *itabTableType) find(inter *interfacetype, typ *_type) *itab { … } // itabAdd adds the given itab to the itab hash table. // itabLock must be held. func itabAdd(m *itab) { … } // add adds the given itab to itab table t. // itabLock must be held. func (t *itabTableType) add(m *itab) { … } // itabInit fills in the m.Fun array with all the code pointers for // the m.Inter/m.Type pair. If the type does not implement the interface, // it sets m.Fun[0] to 0 and returns the name of an interface function that is missing. // If !firstTime, itabInit will not write anything to m.Fun (see issue 65962). // It is ok to call this multiple times on the same m, even concurrently // (although it will only be called once with firstTime==true). func itabInit(m *itab, firstTime bool) string { … } func itabsinit() { … } // panicdottypeE is called when doing an e.(T) conversion and the conversion fails. // have = the dynamic type we have. // want = the static type we're trying to convert to. // iface = the static type we're converting from. func panicdottypeE(have, want, iface *_type) { … } // panicdottypeI is called when doing an i.(T) conversion and the conversion fails. // Same args as panicdottypeE, but "have" is the dynamic itab we have. func panicdottypeI(have *itab, want, iface *_type) { … } // panicnildottype is called when doing an i.(T) conversion and the interface i is nil. // want = the static type we're trying to convert to. func panicnildottype(want *_type) { … } type uint16InterfacePtr … type uint32InterfacePtr … type uint64InterfacePtr … type stringInterfacePtr … type sliceInterfacePtr … var uint16Eface … var uint32Eface … var uint64Eface … var stringEface … var sliceEface … var uint16Type … var uint32Type … var uint64Type … var stringType … var sliceType … // convT converts a value of type t, which is pointed to by v, to a pointer that can // be used as the second word of an interface value. func convT(t *_type, v unsafe.Pointer) unsafe.Pointer { … } func convTnoptr(t *_type, v unsafe.Pointer) unsafe.Pointer { … } func convT16(val uint16) (x unsafe.Pointer) { … } func convT32(val uint32) (x unsafe.Pointer) { … } // convT64 should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/bytedance/sonic // // Do not remove or change the type signature. // See go.dev/issue/67401. // //go:linkname convT64 func convT64(val uint64) (x unsafe.Pointer) { … } // convTstring should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/bytedance/sonic // // Do not remove or change the type signature. // See go.dev/issue/67401. // //go:linkname convTstring func convTstring(val string) (x unsafe.Pointer) { … } // convTslice should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/bytedance/sonic // // Do not remove or change the type signature. // See go.dev/issue/67401. // //go:linkname convTslice func convTslice(val []byte) (x unsafe.Pointer) { … } func assertE2I(inter *interfacetype, t *_type) *itab { … } func assertE2I2(inter *interfacetype, t *_type) *itab { … } // typeAssert builds an itab for the concrete type t and the // interface type s.Inter. If the conversion is not possible it // panics if s.CanFail is false and returns nil if s.CanFail is true. func typeAssert(s *abi.TypeAssert, t *_type) *itab { … } func buildTypeAssertCache(oldC *abi.TypeAssertCache, typ *_type, tab *itab) *abi.TypeAssertCache { … } var emptyTypeAssertCache … // interfaceSwitch compares t against the list of cases in s. // If t matches case i, interfaceSwitch returns the case index i and // an itab for the pair <t, s.Cases[i]>. // If there is no match, return N,nil, where N is the number // of cases. func interfaceSwitch(s *abi.InterfaceSwitch, t *_type) (int, *itab) { … } // buildInterfaceSwitchCache constructs an interface switch cache // containing all the entries from oldC plus the new entry // (typ,case_,tab). func buildInterfaceSwitchCache(oldC *abi.InterfaceSwitchCache, typ *_type, case_ int, tab *itab) *abi.InterfaceSwitchCache { … } var emptyInterfaceSwitchCache … // reflect_ifaceE2I is for package reflect, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - gitee.com/quant1x/gox // - github.com/modern-go/reflect2 // - github.com/v2pro/plz // // Do not remove or change the type signature. // //go:linkname reflect_ifaceE2I reflect.ifaceE2I func reflect_ifaceE2I(inter *interfacetype, e eface, dst *iface) { … } //go:linkname reflectlite_ifaceE2I internal/reflectlite.ifaceE2I func reflectlite_ifaceE2I(inter *interfacetype, e eface, dst *iface) { … } func iterate_itabs(fn func(*itab)) { … } var staticuint64s … // getStaticuint64s is called by the reflect package to get a pointer // to the read-only array. // //go:linkname getStaticuint64s func getStaticuint64s() *[256]uint64 { … } // The linker redirects a reference of a method that it determined // unreachable to a reference to this function, so it will throw if // ever called. func unreachableMethod() { … }