aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/reflectdata/reflect.go
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2021-08-23 15:45:10 -0700
committerDan Scales <danscales@google.com>2021-08-24 00:01:29 +0000
commit8eeb1bff1d7107828b41af08e599c78fc36bab30 (patch)
tree5c041afd02fc4076e97def9a026ef13d25a23b84 /src/cmd/compile/internal/reflectdata/reflect.go
parentbe1a6934776a3c7f636932918e756b44b6510214 (diff)
downloadgo-8eeb1bff1d7107828b41af08e599c78fc36bab30.tar.gz
go-8eeb1bff1d7107828b41af08e599c78fc36bab30.zip
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>
Diffstat (limited to 'src/cmd/compile/internal/reflectdata/reflect.go')
-rw-r--r--src/cmd/compile/internal/reflectdata/reflect.go17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go
index 3ba8f52541..a95c76ff26 100644
--- a/src/cmd/compile/internal/reflectdata/reflect.go
+++ b/src/cmd/compile/internal/reflectdata/reflect.go
@@ -2047,12 +2047,17 @@ func getDictionary(gf *types.Sym, targs []*types.Type) ir.Node {
base.Fatalf("Dictionary should have already been generated: %s.%s", sym.Pkg.Path, sym.Name)
}
- // 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)