mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: reuse same node for global dictionaries
Change stencil.go:getDictionaryValue() and reflect.go:getDictionary() to reuse any existing name node that has been created for the needed global dictionary. Otherwise, these functions may set the Def on a specific dictionary sym to two different name nodes, which means the first node will not satisfy the invariant 'n.Sym().Def.(*ir.Name) == n' (which is the assertion in this issue). Fixes #47896 Change-Id: I1e7ae1efd077a83c7878b4342feb6d28d52476cc Reviewed-on: https://go-review.googlesource.com/c/go/+/344609 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Trust: Dan Scales <danscales@google.com>
This commit is contained in:
parent
be1a693477
commit
8eeb1bff1d
3 changed files with 96 additions and 12 deletions
|
|
@ -1579,12 +1579,17 @@ func (g *irgen) finalizeSyms() {
|
|||
func (g *irgen) getDictionaryValue(gf *ir.Name, targs []*types.Type, isMeth bool) ir.Node {
|
||||
sym := g.getDictionarySym(gf, targs, isMeth)
|
||||
|
||||
// Make a node referencing the dictionary symbol.
|
||||
n := typecheck.NewName(sym)
|
||||
n.SetType(types.Types[types.TUINTPTR]) // should probably be [...]uintptr, but doesn't really matter
|
||||
n.SetTypecheck(1)
|
||||
n.Class = ir.PEXTERN
|
||||
sym.Def = n
|
||||
// Make (or reuse) a node referencing the dictionary symbol.
|
||||
var n *ir.Name
|
||||
if sym.Def != nil {
|
||||
n = sym.Def.(*ir.Name)
|
||||
} else {
|
||||
n = typecheck.NewName(sym)
|
||||
n.SetType(types.Types[types.TUINTPTR]) // should probably be [...]uintptr, but doesn't really matter
|
||||
n.SetTypecheck(1)
|
||||
n.Class = ir.PEXTERN
|
||||
sym.Def = n
|
||||
}
|
||||
|
||||
// Return the address of the dictionary.
|
||||
np := typecheck.NodAddr(n)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue