func (v *Codegen) genFunctionBody(fn *parser.Function, llvmFn llvm.Value) { block := llvm.AddBasicBlock(llvmFn, "entry") v.pushFunction(fn) v.builders[v.currentFunction()] = llvm.NewBuilder() v.builder().SetInsertPointAtEnd(block) pars := fn.Parameters if fn.Type.Receiver != nil { newPars := make([]*parser.VariableDecl, len(pars)+1) newPars[0] = fn.Receiver copy(newPars[1:], pars) pars = newPars } for i, par := range pars { alloc := v.builder().CreateAlloca(v.typeToLLVMType(par.Variable.Type), par.Variable.Name) v.variableLookup[par.Variable] = alloc v.builder().CreateStore(llvmFn.Params()[i], alloc) } v.genBlock(fn.Body) v.builder().Dispose() delete(v.builders, v.currentFunction()) delete(v.curLoopExits, v.currentFunction()) delete(v.curLoopNexts, v.currentFunction()) v.popFunction() }