Commit eb79f21c authored by Robert Griesemer's avatar Robert Griesemer

cmd/compile, go/importer: minor cleanups

Change-Id: Ic7a1fb0dbbf108052c970a4a830269a5673df7df
Reviewed-on: https://go-review.googlesource.com/21963Reviewed-by: 's avatarMatthew Dempsky <mdempsky@google.com>
parent 7d0d1222
......@@ -59,9 +59,8 @@ Encoding format:
The export data starts with a single byte indicating the encoding format
(compact, or with debugging information), followed by a version string
(so we can evolve the encoding if need be), the name of the imported
package, and a string containing platform-specific information for that
package.
(so we can evolve the encoding if need be), and then the package object
for the exported package (with an empty path).
After this header, two lists of objects and the list of inlined function
bodies follows.
......
......@@ -59,9 +59,6 @@ func Import(in *bufio.Reader) {
// read package data
p.pkg()
if p.pkgList[0] != importpkg {
Fatalf("importer: imported package not found in pkgList[0]")
}
// defer some type-checking until all types are read in completely
// (parser.go:import_package)
......@@ -193,7 +190,12 @@ func (p *importer) pkg() *Pkg {
Fatalf("importer: bad path in import: %q", path)
}
// an empty path denotes the package we are currently importing
// an empty path denotes the package we are currently importing;
// it must be the first package we see
if (path == "") != (len(p.pkgList) == 0) {
panic(fmt.Sprintf("package path %q for pkg index %d", path, len(p.pkgList)))
}
pkg := importpkg
if path != "" {
pkg = mkpkg(path)
......
......@@ -16,12 +16,15 @@ import (
)
type importer struct {
imports map[string]*types.Package
data []byte
imports map[string]*types.Package
data []byte
path string
buf []byte // for reading strings
bufarray [64]byte // initial underlying array for buf, large enough to avoid allocation when compiling std lib
pkgList []*types.Package
typList []types.Type
pkgList []*types.Package
typList []types.Type
debugFormat bool
read int // bytes read
......@@ -35,6 +38,7 @@ func BImportData(imports map[string]*types.Package, data []byte, path string) (i
p := importer{
imports: imports,
data: data,
path: path,
}
p.buf = p.bufarray[:]
......@@ -58,25 +62,7 @@ func BImportData(imports map[string]*types.Package, data []byte, path string) (i
p.typList = append(p.typList, predeclared...)
// read package data
// TODO(gri) clean this up
i := p.tagOrIndex()
if i != packageTag {
panic(fmt.Sprintf("package tag expected, got %d", i))
}
name := p.string()
if s := p.string(); s != "" {
panic(fmt.Sprintf("empty path expected, got %s", s))
}
pkg := p.imports[path]
if pkg == nil {
pkg = types.NewPackage(path, name)
p.imports[path] = pkg
}
p.pkgList = append(p.pkgList, pkg)
if debug && p.pkgList[0] != pkg {
panic("imported packaged not found in pkgList[0]")
}
pkg := p.pkg()
// read objects of phase 1 only (see cmd/compiler/internal/gc/bexport.go)
objcount := 0
......@@ -91,7 +77,7 @@ func BImportData(imports map[string]*types.Package, data []byte, path string) (i
// self-verification
if count := p.int(); count != objcount {
panic(fmt.Sprintf("importer: got %d objects; want %d", objcount, count))
panic(fmt.Sprintf("got %d objects; want %d", objcount, count))
}
// ignore compiler-specific import data
......@@ -135,16 +121,22 @@ func (p *importer) pkg() *types.Package {
panic("empty package name in import")
}
// we should never see an empty import path
if path == "" {
panic("empty import path")
// an empty path denotes the package we are currently importing;
// it must be the first package we see
if (path == "") != (len(p.pkgList) == 0) {
panic(fmt.Sprintf("package path %q for pkg index %d", path, len(p.pkgList)))
}
// if the package was imported before, use that one; otherwise create a new one
if path == "" {
path = p.path
}
pkg := p.imports[path]
if pkg == nil {
pkg = types.NewPackage(path, name)
p.imports[path] = pkg
} else if pkg.Name() != name {
panic(fmt.Sprintf("conflicting names %s and %s for package %q", pkg.Name(), name, path))
}
p.pkgList = append(p.pkgList, pkg)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment