@@ -195,13 +195,12 @@ func (p *Package) Translate(f *File) {
195
195
var conv typeConv
196
196
conv .Init (p .PtrSize , p .IntSize )
197
197
198
- p .typedefs = map [string ]bool {}
199
- p .typedefList = nil
198
+ ft := fileTypedefs {typedefs : make (map [string ]bool )}
200
199
numTypedefs := - 1
201
- for len (p .typedefs ) > numTypedefs {
202
- numTypedefs = len (p .typedefs )
200
+ for len (ft .typedefs ) > numTypedefs {
201
+ numTypedefs = len (ft .typedefs )
203
202
// Also ask about any typedefs we've seen so far.
204
- for _ , info := range p .typedefList {
203
+ for _ , info := range ft .typedefList {
205
204
if f .Name [info .typedef ] != nil {
206
205
continue
207
206
}
@@ -214,7 +213,7 @@ func (p *Package) Translate(f *File) {
214
213
}
215
214
needType := p .guessKinds (f )
216
215
if len (needType ) > 0 {
217
- p .loadDWARF (f , & conv , needType )
216
+ p .loadDWARF (f , & ft , & conv , needType )
218
217
}
219
218
220
219
// In godefs mode we're OK with the typedefs, which
@@ -523,7 +522,7 @@ func (p *Package) guessKinds(f *File) []*Name {
523
522
// loadDWARF parses the DWARF debug information generated
524
523
// by gcc to learn the details of the constants, variables, and types
525
524
// being referred to as C.xxx.
526
- func (p * Package ) loadDWARF (f * File , conv * typeConv , names []* Name ) {
525
+ func (p * Package ) loadDWARF (f * File , ft * fileTypedefs , conv * typeConv , names []* Name ) {
527
526
// Extract the types from the DWARF section of an object
528
527
// from a well-formed C program. Gcc only generates DWARF info
529
528
// for symbols in the object file, so it is not enough to print the
@@ -637,7 +636,7 @@ func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) {
637
636
fatalf ("malformed __cgo__ name: %s" , name )
638
637
}
639
638
types [i ] = t .Type
640
- p .recordTypedefs (t .Type , f.NamePos [names [i ]])
639
+ ft .recordTypedefs (t .Type , f.NamePos [names [i ]])
641
640
}
642
641
if e .Tag != dwarf .TagCompileUnit {
643
642
r .SkipChildren ()
@@ -702,12 +701,17 @@ func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) {
702
701
}
703
702
}
704
703
705
- // recordTypedefs remembers in p.typedefs all the typedefs used in dtypes and its children.
706
- func ( p * Package ) recordTypedefs ( dtype dwarf. Type , pos token. Pos ) {
707
- p . recordTypedefs1 ( dtype , pos , map [dwarf. Type ] bool {})
704
+ type fileTypedefs struct {
705
+ typedefs map [ string ] bool // type names that appear in the types of the objects we're interested in
706
+ typedefList [] typedefInfo
708
707
}
709
708
710
- func (p * Package ) recordTypedefs1 (dtype dwarf.Type , pos token.Pos , visited map [dwarf.Type ]bool ) {
709
+ // recordTypedefs remembers in ft.typedefs all the typedefs used in dtypes and its children.
710
+ func (ft * fileTypedefs ) recordTypedefs (dtype dwarf.Type , pos token.Pos ) {
711
+ ft .recordTypedefs1 (dtype , pos , map [dwarf.Type ]bool {})
712
+ }
713
+
714
+ func (ft * fileTypedefs ) recordTypedefs1 (dtype dwarf.Type , pos token.Pos , visited map [dwarf.Type ]bool ) {
711
715
if dtype == nil {
712
716
return
713
717
}
@@ -721,25 +725,25 @@ func (p *Package) recordTypedefs1(dtype dwarf.Type, pos token.Pos, visited map[d
721
725
// Don't look inside builtin types. There be dragons.
722
726
return
723
727
}
724
- if ! p .typedefs [dt .Name ] {
725
- p .typedefs [dt .Name ] = true
726
- p .typedefList = append (p .typedefList , typedefInfo {dt .Name , pos })
727
- p .recordTypedefs1 (dt .Type , pos , visited )
728
+ if ! ft .typedefs [dt .Name ] {
729
+ ft .typedefs [dt .Name ] = true
730
+ ft .typedefList = append (ft .typedefList , typedefInfo {dt .Name , pos })
731
+ ft .recordTypedefs1 (dt .Type , pos , visited )
728
732
}
729
733
case * dwarf.PtrType :
730
- p .recordTypedefs1 (dt .Type , pos , visited )
734
+ ft .recordTypedefs1 (dt .Type , pos , visited )
731
735
case * dwarf.ArrayType :
732
- p .recordTypedefs1 (dt .Type , pos , visited )
736
+ ft .recordTypedefs1 (dt .Type , pos , visited )
733
737
case * dwarf.QualType :
734
- p .recordTypedefs1 (dt .Type , pos , visited )
738
+ ft .recordTypedefs1 (dt .Type , pos , visited )
735
739
case * dwarf.FuncType :
736
- p .recordTypedefs1 (dt .ReturnType , pos , visited )
740
+ ft .recordTypedefs1 (dt .ReturnType , pos , visited )
737
741
for _ , a := range dt .ParamType {
738
- p .recordTypedefs1 (a , pos , visited )
742
+ ft .recordTypedefs1 (a , pos , visited )
739
743
}
740
744
case * dwarf.StructType :
741
- for _ , f := range dt .Field {
742
- p .recordTypedefs1 (f .Type , pos , visited )
745
+ for _ , l := range dt .Field {
746
+ ft .recordTypedefs1 (l .Type , pos , visited )
743
747
}
744
748
}
745
749
}
0 commit comments