@@ -195,13 +195,12 @@ func (p *Package) Translate(f *File) {
195195 var conv typeConv
196196 conv .Init (p .PtrSize , p .IntSize )
197197
198- p .typedefs = map [string ]bool {}
199- p .typedefList = nil
198+ ft := fileTypedefs {typedefs : make (map [string ]bool )}
200199 numTypedefs := - 1
201- for len (p .typedefs ) > numTypedefs {
202- numTypedefs = len (p .typedefs )
200+ for len (ft .typedefs ) > numTypedefs {
201+ numTypedefs = len (ft .typedefs )
203202 // Also ask about any typedefs we've seen so far.
204- for _ , info := range p .typedefList {
203+ for _ , info := range ft .typedefList {
205204 if f .Name [info .typedef ] != nil {
206205 continue
207206 }
@@ -214,7 +213,8 @@ func (p *Package) Translate(f *File) {
214213 }
215214 needType := p .guessKinds (f )
216215 if len (needType ) > 0 {
217- p .loadDWARF (f , & conv , needType )
216+ d := p .loadDWARF (f , & ft , needType )
217+ p .recordTypes (f , d , & conv )
218218 }
219219
220220 // In godefs mode we're OK with the typedefs, which
@@ -523,7 +523,7 @@ func (p *Package) guessKinds(f *File) []*Name {
523523// loadDWARF parses the DWARF debug information generated
524524// by gcc to learn the details of the constants, variables, and types
525525// being referred to as C.xxx.
526- func (p * Package ) loadDWARF (f * File , conv * typeConv , names []* Name ) {
526+ func (p * Package ) loadDWARF (f * File , ft * fileTypedefs , names []* Name ) * debug {
527527 // Extract the types from the DWARF section of an object
528528 // from a well-formed C program. Gcc only generates DWARF info
529529 // for symbols in the object file, so it is not enough to print the
@@ -637,13 +637,28 @@ func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) {
637637 fatalf ("malformed __cgo__ name: %s" , name )
638638 }
639639 types [i ] = t .Type
640- p .recordTypedefs (t .Type , f.NamePos [names [i ]])
640+ ft .recordTypedefs (t .Type , f.NamePos [names [i ]])
641641 }
642642 if e .Tag != dwarf .TagCompileUnit {
643643 r .SkipChildren ()
644644 }
645645 }
646646
647+ return & debug {names , types , ints , floats , strs }
648+ }
649+
650+ // debug is the data extracted by running an iteration of loadDWARF on a file.
651+ type debug struct {
652+ names []* Name
653+ types []dwarf.Type
654+ ints []int64
655+ floats []float64
656+ strs []string
657+ }
658+
659+ func (p * Package ) recordTypes (f * File , data * debug , conv * typeConv ) {
660+ names , types , ints , floats , strs := data .names , data .types , data .ints , data .floats , data .strs
661+
647662 // Record types and typedef information.
648663 for i , n := range names {
649664 if strings .HasSuffix (n .Go , "GetTypeID" ) && types [i ].String () == "func() CFTypeID" {
@@ -702,12 +717,17 @@ func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) {
702717 }
703718}
704719
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 {})
720+ type fileTypedefs struct {
721+ typedefs map [string ]bool // type names that appear in the types of the objects we're interested in
722+ typedefList []typedefInfo
723+ }
724+
725+ // recordTypedefs remembers in ft.typedefs all the typedefs used in dtypes and its children.
726+ func (ft * fileTypedefs ) recordTypedefs (dtype dwarf.Type , pos token.Pos ) {
727+ ft .recordTypedefs1 (dtype , pos , map [dwarf.Type ]bool {})
708728}
709729
710- func (p * Package ) recordTypedefs1 (dtype dwarf.Type , pos token.Pos , visited map [dwarf.Type ]bool ) {
730+ func (ft * fileTypedefs ) recordTypedefs1 (dtype dwarf.Type , pos token.Pos , visited map [dwarf.Type ]bool ) {
711731 if dtype == nil {
712732 return
713733 }
@@ -721,25 +741,25 @@ func (p *Package) recordTypedefs1(dtype dwarf.Type, pos token.Pos, visited map[d
721741 // Don't look inside builtin types. There be dragons.
722742 return
723743 }
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 )
744+ if ! ft .typedefs [dt .Name ] {
745+ ft .typedefs [dt .Name ] = true
746+ ft .typedefList = append (ft .typedefList , typedefInfo {dt .Name , pos })
747+ ft .recordTypedefs1 (dt .Type , pos , visited )
728748 }
729749 case * dwarf.PtrType :
730- p .recordTypedefs1 (dt .Type , pos , visited )
750+ ft .recordTypedefs1 (dt .Type , pos , visited )
731751 case * dwarf.ArrayType :
732- p .recordTypedefs1 (dt .Type , pos , visited )
752+ ft .recordTypedefs1 (dt .Type , pos , visited )
733753 case * dwarf.QualType :
734- p .recordTypedefs1 (dt .Type , pos , visited )
754+ ft .recordTypedefs1 (dt .Type , pos , visited )
735755 case * dwarf.FuncType :
736- p .recordTypedefs1 (dt .ReturnType , pos , visited )
756+ ft .recordTypedefs1 (dt .ReturnType , pos , visited )
737757 for _ , a := range dt .ParamType {
738- p .recordTypedefs1 (a , pos , visited )
758+ ft .recordTypedefs1 (a , pos , visited )
739759 }
740760 case * dwarf.StructType :
741- for _ , f := range dt .Field {
742- p .recordTypedefs1 (f .Type , pos , visited )
761+ for _ , l := range dt .Field {
762+ ft .recordTypedefs1 (l .Type , pos , visited )
743763 }
744764 }
745765}
0 commit comments