ssa: support runtime.map

This commit is contained in:
visualfc
2024-06-28 22:01:58 +08:00
parent e05e61a59b
commit 2ccd1625e7
15 changed files with 1391 additions and 102 deletions

View File

@@ -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)
}