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

@@ -70,6 +70,8 @@ func (b Builder) abiTypeOf(t types.Type) func() Expr {
return b.abiArrayOf(t)
case *types.Chan:
return b.abiChanOf(t)
case *types.Map:
return b.abiMapOf(t)
}
panic("todo")
}
@@ -284,6 +286,25 @@ func (b Builder) abiChanOf(t *types.Chan) func() Expr {
}
}
func (b Builder) abiMapOf(t *types.Map) func() Expr {
key := b.abiTypeOf(t.Key())
elem := b.abiTypeOf(t.Elem())
bucket := b.abiTypeOf(b.bucketType(t))
flags := abi.MapTypeFlags(t, (*goProgram)(b.Prog))
return func() Expr {
return b.Call(b.Pkg.rtFunc("MapOf"), key(), elem(), bucket(), b.Prog.Val(flags))
}
}
func (b Builder) bucketType(t *types.Map) types.Type {
if bucket, ok := b.Pkg.bucket[t]; ok {
return bucket
}
bucket := abi.MapBucketType(t, (*goProgram)(b.Prog))
b.Pkg.bucket[t] = bucket
return bucket
}
// func StructField(name string, typ *abi.Type, off uintptr, tag string, embedded bool)
// func Struct(pkgPath string, size uintptr, fields []abi.StructField)
func (b Builder) abiStructOf(t *types.Struct) func() Expr {