func (lang) Compile(pinfo *build8.PkgInfo) ( compiled build8.Linkable, es []*lex8.Error, ) { asts, es := parsePkg(pinfo) if es != nil { return nil, es } // need to load these two builtin functions here b := newBuilder(pinfo.Path) initBuilder(b, pinfo.Import) if es = b.Errs(); es != nil { return nil, es } b.scope.Push() // package scope defer b.scope.Pop() for _, fileAST := range asts { buildFile(b, fileAST) } if es = b.Errs(); es != nil { return nil, es } addStart(b) irLog := pinfo.CreateLog("ir") ir.PrintPkg(irLog, b.p) if e := irLog.Close(); e != nil { return nil, lex8.SingleErr(e) } lib := ir.BuildPkg(b.p) return &pkg{lib}, nil }
func (bareFunc) Compile(pinfo *build8.PkgInfo) ( compiled build8.Linkable, es []*lex8.Error, ) { b := newBuilder(pinfo.Path) initBuilder(b, pinfo.Import) if es = b.Errs(); es != nil { return nil, es } if len(pinfo.Src) == 0 { panic("no source file") } else if len(pinfo.Src) > 1 { e := fmt.Errorf("bare func %q has too many files", pinfo.Path) return nil, lex8.SingleErr(e) } b.irLog = pinfo.CreateLog("ir") defer b.irLog.Close() for _, r := range pinfo.Src { stmts, es := parse.Stmts(r.Path, r) if es != nil { return nil, es } lib := buildBareFunc(b, stmts) if es = b.Errs(); es != nil { return nil, es } return &pkg{lib}, nil } panic("unreachable") }