mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/cgo: make sure we FinishType everything
Ensure that we call FinishType on all the types added to the ptrs map. We only add a key to ptrKeys once. Once we FinishType for that key, we'll never look at that key again. But we can add a new type under that key later, and we'll never finish it. Make sure we add the key to the ptrKeys list every time we make the list of types for that key non-empty. This makes sure we FinishType each pointer type exactly once. Fixes #26517 Change-Id: Iad86150d516fcfac167591daf5a26c38bec7d143 Reviewed-on: https://go-review.googlesource.com/126275 Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
f152f83a6e
commit
344d0e0bf7
2 changed files with 27 additions and 2 deletions
|
|
@ -1735,6 +1735,7 @@ type typeConv struct {
|
|||
// Map from types to incomplete pointers to those types.
|
||||
ptrs map[dwarf.Type][]*Type
|
||||
// Keys of ptrs in insertion order (deterministic worklist)
|
||||
// ptrKeys contains exactly the keys in ptrs.
|
||||
ptrKeys []dwarf.Type
|
||||
|
||||
// Type names X for which there exists an XGetTypeID function with type func() CFTypeID.
|
||||
|
|
@ -1877,14 +1878,15 @@ func (c *typeConv) FinishType(pos token.Pos) {
|
|||
for len(c.ptrKeys) > 0 {
|
||||
dtype := c.ptrKeys[0]
|
||||
c.ptrKeys = c.ptrKeys[1:]
|
||||
ptrs := c.ptrs[dtype]
|
||||
delete(c.ptrs, dtype)
|
||||
|
||||
// Note Type might invalidate c.ptrs[dtype].
|
||||
t := c.Type(dtype, pos)
|
||||
for _, ptr := range c.ptrs[dtype] {
|
||||
for _, ptr := range ptrs {
|
||||
ptr.Go.(*ast.StarExpr).X = t.Go
|
||||
ptr.C.Set("%s*", t.C)
|
||||
}
|
||||
c.ptrs[dtype] = nil // retain the map key
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue