func ReadArchive(filename, path string, r io.Reader, packages map[string]*types.Package) (*Archive, error) { var a Archive if err := gob.NewDecoder(r).Decode(&a); err != nil { return nil, err } var err error _, a.types, err = importer.ImportData(packages, a.ExportData) if err != nil { return nil, err } packages[path] = a.types return &a, nil }
func GetImporter(searchpaths []string, initmap map[*types.Package]InitData) types.Importer { return func(imports map[string]*types.Package, pkgpath string) (pkg *types.Package, err error) { if pkgpath == "unsafe" { return types.Unsafe, nil } fpath, err := findExportFile(searchpaths, pkgpath) if err != nil { return } reader, closer, err := openExportFile(fpath) if err != nil { return } if closer != nil { defer closer.Close() } var magic [4]byte _, err = reader.Read(magic[:]) if err != nil { return } _, err = reader.Seek(0, 0) if err != nil { return } switch string(magic[:]) { case gccgov1Magic: var p parser p.init(fpath, reader, imports) pkg = p.parsePackage() if initmap != nil { initmap[pkg] = p.initdata } case goimporterMagic: var data []byte data, err = ioutil.ReadAll(reader) if err != nil { return } var n int n, pkg, err = importer.ImportData(imports, data) if err != nil { return } if initmap != nil { suffixreader := bytes.NewReader(data[n:]) var p parser p.init(fpath, suffixreader, nil) p.parseInitData() initmap[pkg] = p.initdata } default: err = fmt.Errorf("unrecognized magic string: %q", string(magic[:])) } return } }