runtime: MakeMap
This commit is contained in:
27
ssa/expr.go
27
ssa/expr.go
@@ -35,6 +35,8 @@ type Expr struct {
|
||||
Type
|
||||
}
|
||||
|
||||
var Nil Expr // Zero value is a nil Expr
|
||||
|
||||
// IsNil checks if the expression is nil or not.
|
||||
func (v Expr) IsNil() bool {
|
||||
return v.Type == nil
|
||||
@@ -477,6 +479,31 @@ func (b Builder) Slice(x, low, high, max Expr) (ret Expr) {
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// The MakeMap instruction creates a new hash-table-based map object
|
||||
// and yields a value of kind map.
|
||||
//
|
||||
// t is a (possibly named) *types.Map.
|
||||
//
|
||||
// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or
|
||||
// the ast.CompositeLit.Lbrack if created by a literal.
|
||||
//
|
||||
// Example printed form:
|
||||
//
|
||||
// t1 = make map[string]int t0
|
||||
// t1 = make StringIntMap t0
|
||||
func (b Builder) MakeMap(t Type, nReserve Expr) (ret Expr) {
|
||||
if debugInstr {
|
||||
log.Printf("MakeMap %v, %v\n", t, nReserve.impl)
|
||||
}
|
||||
pkg := b.fn.pkg
|
||||
ret.Type = t
|
||||
ret.impl = b.InlineCall(pkg.rtFunc("MakeSmallMap")).impl
|
||||
// TODO(xsw): nReserve
|
||||
return
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// The Alloc instruction reserves space for a variable of the given type,
|
||||
// zero-initializes it, and yields its address.
|
||||
//
|
||||
|
||||
@@ -117,6 +117,7 @@ type aProgram struct {
|
||||
rtStringTy llvm.Type
|
||||
rtIfaceTy llvm.Type
|
||||
rtSliceTy llvm.Type
|
||||
rtMapTy llvm.Type
|
||||
|
||||
anyTy Type
|
||||
voidTy Type
|
||||
@@ -184,6 +185,13 @@ func (p Program) rtIface() llvm.Type {
|
||||
return p.rtIfaceTy
|
||||
}
|
||||
|
||||
func (p Program) rtMap() llvm.Type {
|
||||
if p.rtMapTy.IsNil() {
|
||||
p.rtMapTy = p.rtType("Map").ll
|
||||
}
|
||||
return p.rtMapTy
|
||||
}
|
||||
|
||||
func (p Program) rtSlice() llvm.Type {
|
||||
if p.rtSliceTy.IsNil() {
|
||||
p.rtSliceTy = p.rtType("Slice").ll
|
||||
|
||||
@@ -126,4 +126,20 @@ func (b Builder) If(cond Expr, thenb, elseb BasicBlock) {
|
||||
b.impl.CreateCondBr(cond.impl, thenb.impl, elseb.impl)
|
||||
}
|
||||
|
||||
// The MapUpdate instruction updates the association of Map[Key] to
|
||||
// Value.
|
||||
//
|
||||
// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack,
|
||||
// if explicit in the source.
|
||||
//
|
||||
// Example printed form:
|
||||
//
|
||||
// t0[t1] = t2
|
||||
func (b Builder) MapUpdate(m, k, v Expr) {
|
||||
if debugInstr {
|
||||
log.Printf("MapUpdate %v[%v] = %v\n", m.impl, k.impl, v.impl)
|
||||
}
|
||||
panic("todo")
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
@@ -256,6 +256,7 @@ func (p Program) toLLVMType(typ types.Type) Type {
|
||||
case *types.Slice:
|
||||
return &aType{p.rtSlice(), typ, vkInvalid}
|
||||
case *types.Map:
|
||||
return &aType{p.rtMap(), typ, vkInvalid}
|
||||
case *types.Struct:
|
||||
return p.toLLVMStruct(t)
|
||||
case *types.Named:
|
||||
|
||||
Reference in New Issue
Block a user