go/internal/gcimporter, gccgoimporter: updated to match latest version in std lib
This CL brings over the changes from:
https://go-review.googlesource.com/118496 (better error message when importer is out of date)
https://go-review.googlesource.com/114317 (permit embedding of non-defined interfaces via alias type names)
https://go-review.googlesource.com/85318 (use named receiver types for methods of named interfaces)
https://go-review.googlesource.com/42870 (report import path if package is not found)
https://go-review.googlesource.com/41710 (version tests for 1.8, v4 and v5)
Also updated go/gcexportdata to select between binary and new indexed export format.
For golang/go#25856.
For golang/go#25301.
For golang/go#20230.
For golang/go#13829.
Change-Id: Ibf77c50f86e767cef411bd1d3809e12397678958
Reviewed-on: https://go-review.googlesource.com/118555
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
diff --git a/go/internal/gcimporter/iimport.go b/go/internal/gcimporter/iimport.go
index dfc00a3..8cd357c 100644
--- a/go/internal/gcimporter/iimport.go
+++ b/go/internal/gcimporter/iimport.go
@@ -12,6 +12,7 @@
import (
"bytes"
"encoding/binary"
+ "fmt"
"go/constant"
"go/token"
"go/types"
@@ -57,18 +58,30 @@
interfaceType
)
-// iImportData imports a package from the serialized package data
+// IImportData imports a package from the serialized package data
// and returns the number of bytes consumed and a reference to the package.
// If the export data version is not recognized or the format is otherwise
// compromised, an error is returned.
-func iImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) {
+func IImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) {
+ const currentVersion = 0
+ version := -1
+ defer func() {
+ if e := recover(); e != nil {
+ if version > currentVersion {
+ err = fmt.Errorf("cannot import %q (%v), export data is newer version - update tool", path, e)
+ } else {
+ err = fmt.Errorf("cannot import %q (%v), possibly version skew - reinstall package", path, e)
+ }
+ }
+ }()
+
r := &intReader{bytes.NewReader(data), path}
- version := r.uint64()
+ version = int(r.uint64())
switch version {
- case 0:
+ case currentVersion:
default:
- errorf("cannot import %q: unknown iexport format version %d", path, version)
+ errorf("unknown iexport format version %d", version)
}
sLen := int64(r.uint64())
@@ -502,10 +515,10 @@
case interfaceType:
r.currPkg = r.pkg()
- embeddeds := make([]*types.Named, r.uint64())
+ embeddeds := make([]types.Type, r.uint64())
for i := range embeddeds {
_ = r.pos()
- embeddeds[i] = r.typ().(*types.Named)
+ embeddeds[i] = r.typ()
}
methods := make([]*types.Func, r.uint64())
@@ -524,7 +537,7 @@
methods[i] = types.NewFunc(mpos, r.currPkg, mname, msig)
}
- typ := types.NewInterface(methods, embeddeds)
+ typ := types.NewInterface2(methods, embeddeds)
r.p.interfaceList = append(r.p.interfaceList, typ)
return typ
}