@@ -26,7 +26,6 @@ type importer struct {
26
26
data []byte
27
27
path string
28
28
buf []byte // for reading strings
29
- version string
30
29
31
30
// object lists
32
31
strList []string // in order of appearance
@@ -60,27 +59,36 @@ func BImportData(fset *token.FileSet, imports map[string]*types.Package, data []
60
59
files : make (map [string ]* token.File ),
61
60
}
62
61
63
- // read low-level encoding format
64
- switch format := p .rawByte (); format {
65
- case 'c' :
66
- // compact format - nothing to do
67
- case 'd' :
68
- p .debugFormat = true
69
- default :
70
- return p .read , nil , fmt .Errorf ("invalid encoding format in export data: got %q; want 'c' or 'd'" , format )
62
+ // read version info
63
+ if b := p .rawByte (); b == 'c' || b == 'd' {
64
+ // Go1.7 encoding; first byte encodes low-level
65
+ // encoding format (compact vs debug).
66
+ // For backward-compatibility only (avoid problems with
67
+ // old installed packages). Newly compiled packages use
68
+ // the extensible format string.
69
+ // TODO(gri) Remove this support eventually; after Go1.8.
70
+ if b == 'd' {
71
+ p .debugFormat = true
72
+ }
73
+ p .trackAllTypes = p .rawByte () == 'a'
74
+ p .posInfoFormat = p .int () != 0
75
+ const go17version = "v1"
76
+ if s := p .string (); s != go17version {
77
+ return p .read , nil , fmt .Errorf ("importer: unknown export data format: %s (imported package compiled with old compiler?)" , s )
78
+ }
79
+ } else {
80
+ // Go1.8 extensible encoding
81
+ const exportVersion = "version 1"
82
+ if s := p .rawStringln (b ); s != exportVersion {
83
+ return p .read , nil , fmt .Errorf ("importer: unknown export data format: %s (imported package compiled with old compiler?)" , s )
84
+ }
85
+ p .debugFormat = p .rawStringln (p .rawByte ()) == "debug"
86
+ p .trackAllTypes = p .int () != 0
87
+ p .posInfoFormat = p .int () != 0
71
88
}
72
89
73
- p .trackAllTypes = p .rawByte () == 'a'
74
-
75
- p .posInfoFormat = p .int () != 0
76
-
77
90
// --- generic export data ---
78
91
79
- p .version = p .string ()
80
- if p .version != "v0" && p .version != "v1" {
81
- return p .read , nil , fmt .Errorf ("unknown export data version: %s" , p .version )
82
- }
83
-
84
92
// populate typList with predeclared "known" types
85
93
p .typList = append (p .typList , predeclared ... )
86
94
@@ -345,10 +353,7 @@ func (p *importer) typ(parent *types.Package) types.Type {
345
353
recv , _ := p .paramList () // TODO(gri) do we need a full param list for the receiver?
346
354
params , isddd := p .paramList ()
347
355
result , _ := p .paramList ()
348
-
349
- if p .version == "v1" {
350
- p .int () // nointerface flag - discarded
351
- }
356
+ p .int () // go:nointerface pragma - discarded
352
357
353
358
sig := types .NewSignature (recv .At (0 ), params , result , isddd )
354
359
t0 .AddMethod (types .NewFunc (pos , parent , name , sig ))
@@ -729,7 +734,7 @@ func (p *importer) marker(want byte) {
729
734
}
730
735
}
731
736
732
- // rawInt64 should only be used by low-level decoders
737
+ // rawInt64 should only be used by low-level decoders.
733
738
func (p * importer ) rawInt64 () int64 {
734
739
i , err := binary .ReadVarint (p )
735
740
if err != nil {
@@ -738,6 +743,16 @@ func (p *importer) rawInt64() int64 {
738
743
return i
739
744
}
740
745
746
+ // rawStringln should only be used to read the initial version string.
747
+ func (p * importer ) rawStringln (b byte ) string {
748
+ p .buf = p .buf [:0 ]
749
+ for b != '\n' {
750
+ p .buf = append (p .buf , b )
751
+ b = p .rawByte ()
752
+ }
753
+ return string (p .buf )
754
+ }
755
+
741
756
// needed for binary.ReadVarint in rawInt64
742
757
func (p * importer ) ReadByte () (byte , error ) {
743
758
return p .rawByte (), nil
0 commit comments