From 440dc8ed4e9c2670f720eedd7d079c288a254504 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Mon, 20 Jan 2020 15:14:59 +0100 Subject: [PATCH] compiler: move making maps to the map.go file This is a useful refactor for when I add support for any type in map keys. --- compiler/compiler.go | 19 +------------------ compiler/map.go | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index b2f80339..a161d2cf 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -1585,24 +1585,7 @@ func (c *Compiler) parseExpr(frame *Frame, expr ssa.Value) (llvm.Value, error) { val := c.getValue(frame, expr.X) return c.parseMakeInterface(val, expr.X.Type(), expr.Pos()), nil case *ssa.MakeMap: - mapType := expr.Type().Underlying().(*types.Map) - llvmKeyType := c.getLLVMType(mapType.Key().Underlying()) - llvmValueType := c.getLLVMType(mapType.Elem().Underlying()) - keySize := c.targetData.TypeAllocSize(llvmKeyType) - valueSize := c.targetData.TypeAllocSize(llvmValueType) - llvmKeySize := llvm.ConstInt(c.ctx.Int8Type(), keySize, false) - llvmValueSize := llvm.ConstInt(c.ctx.Int8Type(), valueSize, false) - sizeHint := llvm.ConstInt(c.uintptrType, 8, false) - if expr.Reserve != nil { - sizeHint = c.getValue(frame, expr.Reserve) - var err error - sizeHint, err = c.parseConvert(expr.Reserve.Type(), types.Typ[types.Uintptr], sizeHint, expr.Pos()) - if err != nil { - return llvm.Value{}, err - } - } - hashmap := c.createRuntimeCall("hashmapMake", []llvm.Value{llvmKeySize, llvmValueSize, sizeHint}, "") - return hashmap, nil + return c.emitMakeMap(frame, expr) case *ssa.MakeSlice: sliceLen := c.getValue(frame, expr.Len) sliceCap := c.getValue(frame, expr.Cap) diff --git a/compiler/map.go b/compiler/map.go index 6dec2261..e78bef2a 100644 --- a/compiler/map.go +++ b/compiler/map.go @@ -6,9 +6,33 @@ import ( "go/token" "go/types" + "golang.org/x/tools/go/ssa" "tinygo.org/x/go-llvm" ) +// emitMakeMap creates a new map object (runtime.hashmap) by allocating and +// initializing an appropriately sized object. +func (c *Compiler) emitMakeMap(frame *Frame, expr *ssa.MakeMap) (llvm.Value, error) { + mapType := expr.Type().Underlying().(*types.Map) + llvmKeyType := c.getLLVMType(mapType.Key().Underlying()) + llvmValueType := c.getLLVMType(mapType.Elem().Underlying()) + keySize := c.targetData.TypeAllocSize(llvmKeyType) + valueSize := c.targetData.TypeAllocSize(llvmValueType) + llvmKeySize := llvm.ConstInt(c.ctx.Int8Type(), keySize, false) + llvmValueSize := llvm.ConstInt(c.ctx.Int8Type(), valueSize, false) + sizeHint := llvm.ConstInt(c.uintptrType, 8, false) + if expr.Reserve != nil { + sizeHint = c.getValue(frame, expr.Reserve) + var err error + sizeHint, err = c.parseConvert(expr.Reserve.Type(), types.Typ[types.Uintptr], sizeHint, expr.Pos()) + if err != nil { + return llvm.Value{}, err + } + } + hashmap := c.createRuntimeCall("hashmapMake", []llvm.Value{llvmKeySize, llvmValueSize, sizeHint}, "") + return hashmap, nil +} + func (c *Compiler) emitMapLookup(keyType, valueType types.Type, m, key llvm.Value, commaOk bool, pos token.Pos) (llvm.Value, error) { llvmValueType := c.getLLVMType(valueType)