ssa: support runtime.map
This commit is contained in:
@@ -16,10 +16,69 @@
|
||||
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/goplus/llgo/internal/abi"
|
||||
)
|
||||
|
||||
// Map represents a Go map.
|
||||
type Map = hmap
|
||||
type maptype = abi.MapType
|
||||
|
||||
type slice struct {
|
||||
array unsafe.Pointer
|
||||
len int
|
||||
cap int
|
||||
}
|
||||
|
||||
func typedmemmove(typ *_type, dst, src unsafe.Pointer) {
|
||||
Typedmemmove(typ, dst, src)
|
||||
}
|
||||
|
||||
// MakeSmallMap creates a new small map.
|
||||
func MakeSmallMap() *Map {
|
||||
return makemap_small()
|
||||
}
|
||||
|
||||
func MakeMap(t *maptype, hint int) *hmap {
|
||||
return makemap(t, hint, nil)
|
||||
}
|
||||
|
||||
func MapAssign(t *maptype, h *Map, key unsafe.Pointer) unsafe.Pointer {
|
||||
return mapassign(t, h, key)
|
||||
}
|
||||
|
||||
func MapAccess1(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer {
|
||||
return mapaccess1(t, h, key)
|
||||
}
|
||||
|
||||
func MapAccess2(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, bool) {
|
||||
return mapaccess2(t, h, key)
|
||||
}
|
||||
|
||||
func mapKeyEqual(t *maptype, p, q unsafe.Pointer) bool {
|
||||
if isDirectIface(t.Key) {
|
||||
switch t.Key.Size_ {
|
||||
case 0:
|
||||
return true
|
||||
case 1:
|
||||
return memequal8(p, q)
|
||||
case 2:
|
||||
return memequal16(p, q)
|
||||
case 4:
|
||||
return memequal32(p, q)
|
||||
case 8:
|
||||
return memequal64(p, q)
|
||||
}
|
||||
}
|
||||
switch t.Key.Kind() {
|
||||
case abi.String:
|
||||
return strequal(p, q)
|
||||
case abi.Complex64:
|
||||
return c64equal(p, q)
|
||||
case abi.Complex128:
|
||||
return c128equal(p, q)
|
||||
}
|
||||
return t.Key.Equal(p, q)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user