]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/go/internal/gcimporter/iimport.go
[dev.typeparams] all: merge master (8212707) into dev.typeparams
[gostls13.git] / src / go / internal / gcimporter / iimport.go
index 76d47d08f1f88a9a11a4761604aba4d753d5fe5f..b300860e94074a0c24a7e5c7fcec4db38fbe6bc5 100644 (file)
@@ -41,6 +41,16 @@ func (r *intReader) uint64() uint64 {
        return i
 }
 
+// Keep this in sync with constants in iexport.go.
+const (
+       iexportVersionGo1_11   = 0
+       iexportVersionPosCol   = 1
+       iexportVersionGenerics = 2
+
+       // Start of the unstable series of versions, remove "+ n" before release.
+       iexportVersionCurrent = iexportVersionGenerics + 1
+)
+
 const predeclReserved = 32
 
 type itag uint64
@@ -56,6 +66,8 @@ const (
        signatureType
        structType
        interfaceType
+       typeParamType
+       instType
 )
 
 // iImportData imports a package from the serialized package data
@@ -63,7 +75,7 @@ const (
 // 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, dataReader *bufio.Reader, path string) (pkg *types.Package, err error) {
-       const currentVersion = 1
+       const currentVersion = iexportVersionCurrent
        version := int64(-1)
        defer func() {
                if e := recover(); e != nil {
@@ -79,9 +91,13 @@ func iImportData(fset *token.FileSet, imports map[string]*types.Package, dataRea
 
        version = int64(r.uint64())
        switch version {
-       case currentVersion, 0:
+       case currentVersion, iexportVersionPosCol, iexportVersionGo1_11:
        default:
-               errorf("unknown iexport format version %d", version)
+               if version > iexportVersionGenerics {
+                       errorf("unstable iexport format version %d, just rebuild compiler and std library", version)
+               } else {
+                       errorf("unknown iexport format version %d", version)
+               }
        }
 
        sLen := int64(r.uint64())
@@ -95,8 +111,9 @@ func iImportData(fset *token.FileSet, imports map[string]*types.Package, dataRea
        declData := data[sLen:]
 
        p := iimporter{
-               ipath:   path,
-               version: int(version),
+               exportVersion: version,
+               ipath:         path,
+               version:       int(version),
 
                stringData:  stringData,
                stringCache: make(map[uint64]string),
@@ -172,8 +189,9 @@ func iImportData(fset *token.FileSet, imports map[string]*types.Package, dataRea
 }
 
 type iimporter struct {
-       ipath   string
-       version int
+       exportVersion int64
+       ipath         string
+       version       int
 
        stringData  []byte
        stringCache map[uint64]string
@@ -272,11 +290,24 @@ func (r *importReader) obj(name string) {
                r.declare(types.NewConst(pos, r.currPkg, name, typ, val))
 
        case 'F':
+               if r.p.exportVersion >= iexportVersionGenerics {
+                       numTparams := r.uint64()
+                       if numTparams > 0 {
+                               errorf("unexpected tparam")
+                       }
+               }
                sig := r.signature(nil)
 
                r.declare(types.NewFunc(pos, r.currPkg, name, sig))
 
        case 'T':
+               if r.p.exportVersion >= iexportVersionGenerics {
+                       numTparams := r.uint64()
+                       if numTparams > 0 {
+                               errorf("unexpected tparam")
+                       }
+               }
+
                // Types can be recursive. We need to setup a stub
                // declaration before recursing.
                obj := types.NewTypeName(pos, r.currPkg, name, nil)
@@ -549,6 +580,14 @@ func (r *importReader) doType(base *types.Named) types.Type {
                typ := types.NewInterfaceType(methods, embeddeds)
                r.p.interfaceList = append(r.p.interfaceList, typ)
                return typ
+
+       case typeParamType:
+               errorf("do not handle type param types yet")
+               return nil
+
+       case instType:
+               errorf("do not handle instantiated types yet")
+               return nil
        }
 }