Esempio n. 1
0
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
}
Esempio n. 2
0
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")
}