package maps
import (
)
func ( *Map) ( *abi.MapType, string) unsafe.Pointer {
:= groupReference{
data: .dirPtr,
}
:= *.ctrls()
:= .key(, 0)
var uintptr
if goexperiment.MapSplitGroup {
= 2 * goarch.PtrSize
} else {
= .KeyStride
}
if len() > 64 {
:= abi.MapGroupSlots
for := range abi.MapGroupSlots {
if &(1<<7) == 0 && longStringQuickEqualityTest(, *(*string)()) {
if < abi.MapGroupSlots {
goto
}
=
}
= unsafe.Pointer(uintptr() + )
>>= 8
}
if == abi.MapGroupSlots {
return nil
}
= .key(, uintptr())
if == *(*string)() {
if goexperiment.MapSplitGroup {
return .elem(, uintptr())
} else {
return unsafe.Pointer(uintptr() + 2*goarch.PtrSize)
}
}
return nil
}
:
var uintptr
if memHashAESImplemented && UseAeshash {
= memHashAES(unsafe.Pointer(unsafe.StringData()), .seed, uintptr(len()))
} else {
= memHashFallback(unsafe.Pointer(unsafe.StringData()), .seed, uintptr(len()))
}
:= uint8(h2())
= *.ctrls()
= .key(, 0)
for := range uintptr(abi.MapGroupSlots) {
if uint8() == && == *(*string)() {
if goexperiment.MapSplitGroup {
return .elem(, )
} else {
return unsafe.Pointer(uintptr() + 2*goarch.PtrSize)
}
}
= unsafe.Pointer(uintptr() + )
>>= 8
}
return nil
}
func (, string) bool {
if len() != len() {
return false
}
, := unsafe.Pointer(unsafe.StringData()), unsafe.Pointer(unsafe.StringData())
if *(*[8]byte)() != *(*[8]byte)() {
return false
}
= add(, uintptr(len()-8))
= add(, uintptr(len()-8))
if *(*[8]byte)() != *(*[8]byte)() {
return false
}
return true
}
func ( *abi.MapType, *Map, string) unsafe.Pointer {
, := runtime_mapaccess2_faststr(, , )
return
}
func ( *abi.MapType, *Map, string) (unsafe.Pointer, bool) {
if race.Enabled && != nil {
:= sys.GetCallerPC()
:= abi.FuncPCABIInternal()
race.ReadPC(unsafe.Pointer(), , )
}
if == nil || .Used() == 0 {
return unsafe.Pointer(&zeroVal[0]), false
}
if .writing != 0 {
fatal("concurrent map read and map write")
return nil, false
}
if .dirLen <= 0 {
:= .getWithoutKeySmallFastStr(, )
if == nil {
return unsafe.Pointer(&zeroVal[0]), false
}
return , true
}
var uintptr
if memHashAESImplemented && UseAeshash {
= memHashAES(unsafe.Pointer(unsafe.StringData()), .seed, uintptr(len()))
} else {
= memHashFallback(unsafe.Pointer(unsafe.StringData()), .seed, uintptr(len()))
}
:= .directoryIndex()
:= .directoryAt()
:= makeProbeSeq(h1(), .groups.lengthMask)
:= h2()
for ; ; = .next() {
:= .groups.group(, .offset)
:= .ctrls().matchH2()
for != 0 {
:= .first()
:= .key(, )
if == *(*string)() {
if goexperiment.MapSplitGroup {
return .elem(, ), true
} else {
return unsafe.Pointer(uintptr() + 2*goarch.PtrSize), true
}
}
= .removeFirst()
}
= .ctrls().matchEmpty()
if != 0 {
return unsafe.Pointer(&zeroVal[0]), false
}
}
}
func ( *Map) ( *abi.MapType, uintptr, string) unsafe.Pointer {
:= groupReference{
data: .dirPtr,
}
:= .ctrls().matchH2(h2())
for != 0 {
:= .first()
:= .key(, )
if == *(*string)() {
*(*string)() =
:= .elem(, )
return
}
= .removeFirst()
}
= .ctrls().matchEmptyOrDeleted()
if == 0 {
return nil
}
:= .first()
:= .key(, )
*(*string)() =
:= .elem(, )
.ctrls().set(, ctrl(h2()))
.used++
return
}
func ( *table) ( *abi.MapType, uintptr, string) unsafe.Pointer {
if .growthLeft == 0 {
panic("invariant failed: growthLeft is unexpectedly 0")
}
:= makeProbeSeq(h1(), .groups.lengthMask)
for ; ; = .next() {
:= .groups.group(, .offset)
:= .ctrls().matchEmptyOrDeleted()
if != 0 {
:= .first()
:= .key(, )
*(*string)() =
:= .elem(, )
.growthLeft--
.used++
.ctrls().set(, ctrl(h2()))
return
}
}
}
func ( *abi.MapType, *Map, string) unsafe.Pointer {
if == nil {
panic(errNilAssign)
}
if race.Enabled {
:= sys.GetCallerPC()
:= abi.FuncPCABIInternal()
race.WritePC(unsafe.Pointer(), , )
}
if .writing != 0 {
fatal("concurrent map writes")
}
var uintptr
if memHashAESImplemented && UseAeshash {
= memHashAES(unsafe.Pointer(unsafe.StringData()), .seed, uintptr(len()))
} else {
= memHashFallback(unsafe.Pointer(unsafe.StringData()), .seed, uintptr(len()))
}
.writing ^= 1
if .dirPtr == nil {
.growToSmall()
}
if .dirLen == 0 {
:= .putSlotSmallFastStr(, , )
if == nil {
:= .growToTable()
= .uncheckedPutSlotForAssignFastStr(, , )
.used++
.checkInvariants(, )
}
if .writing == 0 {
fatal("concurrent map writes")
}
.writing ^= 1
return
}
var unsafe.Pointer
:
for {
:= .directoryIndex()
:= .directoryAt()
:= makeProbeSeq(h1(), .groups.lengthMask)
var groupReference
var uintptr
:= h2()
for ; ; = .next() {
:= .groups.group(, .offset)
:= .ctrls().matchH2()
for != 0 {
:= .first()
:= .key(, )
if == *(*string)() {
*(*string)() =
= .elem(, )
.checkInvariants(, )
break
}
= .removeFirst()
}
= .ctrls().matchEmptyOrDeleted()
if == 0 {
continue
}
:= .first()
if .ctrls().get() == ctrlDeleted {
if .data == nil {
=
=
}
continue
}
if .data != nil {
=
=
.growthLeft++
}
if .growthLeft == 0 {
.pruneTombstones(, )
}
if .growthLeft > 0 {
:= .key(, )
*(*string)() =
= .elem(, )
.ctrls().set(, ctrl())
.growthLeft--
.used++
.used++
.checkInvariants(, )
break
}
.rehash(, )
continue
}
}
if .writing == 0 {
fatal("concurrent map writes")
}
.writing ^= 1
return
}
func ( *abi.MapType, *Map, string) {
if race.Enabled {
:= sys.GetCallerPC()
:= abi.FuncPCABIInternal()
race.WritePC(unsafe.Pointer(), , )
}
if == nil || .Used() == 0 {
return
}
.Delete(, abi.NoEscape(unsafe.Pointer(&)))
}