Source File
map_swiss.go
Belonging Package
runtime
// Copyright 2014 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.//go:build goexperiment.swissmappackage runtimeimport ()const (// TODO: remove? These are used by tests but not the actual maploadFactorNum = 7loadFactorDen = 8)type maptype = abi.SwissMapType//go:linkname maps_errNilAssign internal/runtime/maps.errNilAssignvar maps_errNilAssign error = plainError("assignment to entry in nil map")func makemap64( *abi.SwissMapType, int64, *maps.Map) *maps.Map {if int64(int()) != {= 0}return makemap(, int(), )}// makemap_small implements Go map creation for make(map[k]v) and// make(map[k]v, hint) when hint is known to be at most abi.SwissMapGroupSlots// at compile time and the map needs to be allocated on the heap.//// makemap_small 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 makemap_smallfunc makemap_small() *maps.Map {return maps.NewEmptyMap()}// makemap implements Go map creation for make(map[k]v, hint).// If the compiler has determined that the map or the first group// can be created on the stack, m and optionally m.dirPtr may be non-nil.// If m != nil, the map can be created directly in m.// If m.dirPtr != nil, it points to a group usable for a small map.//// makemap should be an internal detail,// but widely used packages access it using linkname.// Notable members of the hall of shame include:// - github.com/ugorji/go/codec//// Do not remove or change the type signature.// See go.dev/issue/67401.////go:linkname makemapfunc makemap( *abi.SwissMapType, int, *maps.Map) *maps.Map {if < 0 {= 0}return maps.NewMap(, uintptr(), , maxAlloc)}// mapaccess1 returns a pointer to h[key]. Never returns nil, instead// it will return a reference to the zero object for the elem type if// the key is not in the map.// NOTE: The returned pointer may keep the whole map live, so don't// hold onto it for very long.//// mapaccess1 is pushed from internal/runtime/maps. We could just call it, but// we want to avoid one layer of call.////go:linkname mapaccess1func mapaccess1( *abi.SwissMapType, *maps.Map, unsafe.Pointer) unsafe.Pointer// mapaccess2 should be an internal detail,// but widely used packages access it using linkname.// Notable members of the hall of shame include:// - github.com/ugorji/go/codec//// Do not remove or change the type signature.// See go.dev/issue/67401.////go:linkname mapaccess2func mapaccess2( *abi.SwissMapType, *maps.Map, unsafe.Pointer) (unsafe.Pointer, bool)func mapaccess1_fat( *abi.SwissMapType, *maps.Map, , unsafe.Pointer) unsafe.Pointer {:= mapaccess1(, , )if == unsafe.Pointer(&zeroVal[0]) {return}return}func mapaccess2_fat( *abi.SwissMapType, *maps.Map, , unsafe.Pointer) (unsafe.Pointer, bool) {:= mapaccess1(, , )if == unsafe.Pointer(&zeroVal[0]) {return , false}return , true}// mapassign is pushed from internal/runtime/maps. We could just call it, but// we want to avoid one layer of call.//// mapassign 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// - github.com/RomiChan/protobuf// - github.com/segmentio/encoding// - github.com/ugorji/go/codec//// Do not remove or change the type signature.// See go.dev/issue/67401.////go:linkname mapassignfunc mapassign( *abi.SwissMapType, *maps.Map, unsafe.Pointer) unsafe.Pointer// mapdelete should be an internal detail,// but widely used packages access it using linkname.// Notable members of the hall of shame include:// - github.com/ugorji/go/codec//// Do not remove or change the type signature.// See go.dev/issue/67401.////go:linkname mapdeletefunc mapdelete( *abi.SwissMapType, *maps.Map, unsafe.Pointer) {if raceenabled && != nil {:= sys.GetCallerPC():= abi.FuncPCABIInternal()racewritepc(unsafe.Pointer(), , )raceReadObjectPC(.Key, , , )}if msanenabled && != nil {msanread(, .Key.Size_)}if asanenabled && != nil {asanread(, .Key.Size_)}.Delete(, )}// mapIterStart initializes the Iter struct used for ranging over maps and// performs the first step of iteration. The Iter struct pointed to by 'it' is// allocated on the stack by the compilers order pass or on the heap by// reflect. Both need to have zeroed it since the struct contains pointers.func mapIterStart( *abi.SwissMapType, *maps.Map, *maps.Iter) {if raceenabled && != nil {:= sys.GetCallerPC()racereadpc(unsafe.Pointer(), , abi.FuncPCABIInternal())}.Init(, ).Next()}// mapIterNext performs the next step of iteration. Afterwards, the next// key/elem are in it.Key()/it.Elem().func mapIterNext( *maps.Iter) {if raceenabled {:= sys.GetCallerPC()racereadpc(unsafe.Pointer(.Map()), , abi.FuncPCABIInternal())}.Next()}// mapclear deletes all keys from a map.func mapclear( *abi.SwissMapType, *maps.Map) {if raceenabled && != nil {:= sys.GetCallerPC():= abi.FuncPCABIInternal()racewritepc(unsafe.Pointer(), , )}.Clear()}// Reflect stubs. Called from ../reflect/asm_*.s// reflect_makemap 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/goccy/go-json// - github.com/RomiChan/protobuf// - github.com/segmentio/encoding// - github.com/v2pro/plz//// Do not remove or change the type signature.// See go.dev/issue/67401.////go:linkname reflect_makemap reflect.makemapfunc reflect_makemap( *abi.SwissMapType, int) *maps.Map {// Check invariants and reflects math.if .Key.Equal == nil {throw("runtime.reflect_makemap: unsupported map key type")}// TODO: other checksreturn makemap(, , nil)}// reflect_mapaccess 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.// See go.dev/issue/67401.////go:linkname reflect_mapaccess reflect.mapaccessfunc reflect_mapaccess( *abi.SwissMapType, *maps.Map, unsafe.Pointer) unsafe.Pointer {, := mapaccess2(, , )if ! {// reflect wants nil for a missing element= nil}return}//go:linkname reflect_mapaccess_faststr reflect.mapaccess_faststrfunc reflect_mapaccess_faststr( *abi.SwissMapType, *maps.Map, string) unsafe.Pointer {, := mapaccess2_faststr(, , )if ! {// reflect wants nil for a missing element= nil}return}// reflect_mapassign 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/v2pro/plz//// Do not remove or change the type signature.////go:linkname reflect_mapassign reflect.mapassign0func reflect_mapassign( *abi.SwissMapType, *maps.Map, unsafe.Pointer, unsafe.Pointer) {:= mapassign(, , )typedmemmove(.Elem, , )}//go:linkname reflect_mapassign_faststr reflect.mapassign_faststr0func reflect_mapassign_faststr( *abi.SwissMapType, *maps.Map, string, unsafe.Pointer) {:= mapassign_faststr(, , )typedmemmove(.Elem, , )}//go:linkname reflect_mapdelete reflect.mapdeletefunc reflect_mapdelete( *abi.SwissMapType, *maps.Map, unsafe.Pointer) {mapdelete(, , )}//go:linkname reflect_mapdelete_faststr reflect.mapdelete_faststrfunc reflect_mapdelete_faststr( *abi.SwissMapType, *maps.Map, string) {mapdelete_faststr(, , )}// reflect_maplen is for package reflect,// but widely used packages access it using linkname.// Notable members of the hall of shame include:// - github.com/goccy/go-json// - github.com/wI2L/jettison//// Do not remove or change the type signature.// See go.dev/issue/67401.////go:linkname reflect_maplen reflect.maplenfunc reflect_maplen( *maps.Map) int {if == nil {return 0}if raceenabled {:= sys.GetCallerPC()racereadpc(unsafe.Pointer(), , abi.FuncPCABIInternal())}return int(.Used())}//go:linkname reflect_mapclear reflect.mapclearfunc reflect_mapclear( *abi.SwissMapType, *maps.Map) {mapclear(, )}//go:linkname reflectlite_maplen internal/reflectlite.maplenfunc reflectlite_maplen( *maps.Map) int {if == nil {return 0}if raceenabled {:= sys.GetCallerPC()racereadpc(unsafe.Pointer(), , abi.FuncPCABIInternal(reflect_maplen))}return int(.Used())}// mapinitnoop is a no-op function known the Go linker; if a given global// map (of the right size) is determined to be dead, the linker will// rewrite the relocation (from the package init func) from the outlined// map init function to this symbol. Defined in assembly so as to avoid// complications with instrumentation (coverage, etc).func mapinitnoop()// mapclone for implementing maps.Clone////go:linkname mapclone maps.clonefunc mapclone( any) any {:= efaceOf(&):= (*abi.SwissMapType)(unsafe.Pointer(._type)):= (*maps.Map)(.data)= .Clone().data = (unsafe.Pointer)()return}// keys for implementing maps.keys////go:linkname keys maps.keysfunc keys( any, unsafe.Pointer) {// Currently unused in the maps package.panic("unimplemented")}// values for implementing maps.values////go:linkname values maps.valuesfunc values( any, unsafe.Pointer) {// Currently unused in the maps package.panic("unimplemented")}
![]() |
The pages are generated with Golds v0.7.9-preview. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |