ssa: support runtime.map
This commit is contained in:
83
internal/runtime/alg.go
Normal file
83
internal/runtime/alg.go
Normal file
@@ -0,0 +1,83 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func ptrequal(p, q unsafe.Pointer) bool {
|
||||
return p == q
|
||||
}
|
||||
func memequal0(p, q unsafe.Pointer) bool {
|
||||
return true
|
||||
}
|
||||
func memequal8(p, q unsafe.Pointer) bool {
|
||||
return *(*int8)(p) == *(*int8)(q)
|
||||
}
|
||||
func memequal16(p, q unsafe.Pointer) bool {
|
||||
return *(*int16)(p) == *(*int16)(q)
|
||||
}
|
||||
func memequal32(p, q unsafe.Pointer) bool {
|
||||
return *(*int32)(p) == *(*int32)(q)
|
||||
}
|
||||
func memequal64(p, q unsafe.Pointer) bool {
|
||||
return *(*int64)(p) == *(*int64)(q)
|
||||
}
|
||||
func memequal128(p, q unsafe.Pointer) bool {
|
||||
return *(*[2]int64)(p) == *(*[2]int64)(q)
|
||||
}
|
||||
func f32equal(p, q unsafe.Pointer) bool {
|
||||
return *(*float32)(p) == *(*float32)(q)
|
||||
}
|
||||
func f64equal(p, q unsafe.Pointer) bool {
|
||||
return *(*float64)(p) == *(*float64)(q)
|
||||
}
|
||||
func c64equal(p, q unsafe.Pointer) bool {
|
||||
return *(*complex64)(p) == *(*complex64)(q)
|
||||
}
|
||||
func c128equal(p, q unsafe.Pointer) bool {
|
||||
return *(*complex128)(p) == *(*complex128)(q)
|
||||
}
|
||||
func strequal(p, q unsafe.Pointer) bool {
|
||||
return *(*string)(p) == *(*string)(q)
|
||||
}
|
||||
func interequal(p, q unsafe.Pointer) bool {
|
||||
x := *(*iface)(p)
|
||||
y := *(*iface)(q)
|
||||
return x.tab == y.tab && ifaceeq(x.tab, x.data, y.data)
|
||||
}
|
||||
func nilinterequal(p, q unsafe.Pointer) bool {
|
||||
x := *(*eface)(p)
|
||||
y := *(*eface)(q)
|
||||
return x._type == y._type && efaceeq(x._type, x.data, y.data)
|
||||
}
|
||||
func efaceeq(t *_type, x, y unsafe.Pointer) bool {
|
||||
if t == nil {
|
||||
return true
|
||||
}
|
||||
eq := t.Equal
|
||||
if eq == nil {
|
||||
panic(errorString("comparing uncomparable type " + t.Str_).Error())
|
||||
}
|
||||
if isDirectIface(t) {
|
||||
// Direct interface types are ptr, chan, map, func, and single-element structs/arrays thereof.
|
||||
// Maps and funcs are not comparable, so they can't reach here.
|
||||
// Ptrs, chans, and single-element items can be compared directly using ==.
|
||||
return x == y
|
||||
}
|
||||
return eq(x, y)
|
||||
}
|
||||
func ifaceeq(tab *itab, x, y unsafe.Pointer) bool {
|
||||
if tab == nil {
|
||||
return true
|
||||
}
|
||||
t := tab._type
|
||||
eq := t.Equal
|
||||
if eq == nil {
|
||||
panic(errorString("comparing uncomparable type " + t.Str_).Error())
|
||||
}
|
||||
if isDirectIface(t) {
|
||||
// See comment in efaceeq.
|
||||
return x == y
|
||||
}
|
||||
return eq(x, y)
|
||||
}
|
||||
Reference in New Issue
Block a user