// verify that we can read the copied export data back in
// (use empty package map to avoid collisions)
- savedPkgMap := types.PkgMap
- savedPkgs := types.PkgList
- types.PkgMap = make(map[string]*types.Pkg)
- types.PkgList = nil
- Import(types.NewPkg("", ""), bufio.NewReader(©)) // must not die
- types.PkgList = savedPkgs
- types.PkgMap = savedPkgMap
+ types.CleanroomDo(func() {
+ Import(types.NewPkg("", ""), bufio.NewReader(©)) // must not die
+ })
} else {
size = export(bout.Writer, Debug_export != 0)
}
"cmd/internal/obj"
"cmd/internal/objabi"
"fmt"
+ "sort"
)
+// pkgMap maps a package path to a package.
+var pkgMap = make(map[string]*Pkg)
+
type Pkg struct {
Path string // string literal used in import statement, e.g. "runtime/internal/sys"
Name string // package name, e.g. "sys"
Syms map[string]*Sym
}
-var PkgMap = make(map[string]*Pkg)
-var PkgList []*Pkg
-
// NewPkg returns a new Pkg for the given package path and name.
// Unless name is the empty string, if the package exists already,
// the existing package name and the provided name must match.
func NewPkg(path, name string) *Pkg {
- if p := PkgMap[path]; p != nil {
+ if p := pkgMap[path]; p != nil {
if name != "" && p.Name != name {
panic(fmt.Sprintf("conflicting package names %s and %s for path %q", p.Name, name, path))
}
p.Name = name
p.Prefix = objabi.PathToPrefix(path)
p.Syms = make(map[string]*Sym)
- PkgMap[path] = p
- PkgList = append(PkgList, p)
+ pkgMap[path] = p
return p
}
+// ImportedPkgList returns the list of directly imported packages.
+// The list is sorted by package path.
+func ImportedPkgList() []*Pkg {
+ var list []*Pkg
+ for _, p := range pkgMap {
+ if p.Direct {
+ list = append(list, p)
+ }
+ }
+ sort.Sort(byPath(list))
+ return list
+}
+
+type byPath []*Pkg
+
+func (a byPath) Len() int { return len(a) }
+func (a byPath) Less(i, j int) bool { return a[i].Path < a[j].Path }
+func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
+
var nopkg = &Pkg{
Syms: make(map[string]*Sym),
}
}
return s
}
+
+// CleanroomDo invokes f in an environment with with no preexisting packages.
+// For testing of import/export only.
+func CleanroomDo(f func()) {
+ saved := pkgMap
+ pkgMap = make(map[string]*Pkg)
+ f()
+ pkgMap = saved
+}