aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder/reader.go
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2022-05-09 17:19:58 -0700
committerGopher Robot <gobot@golang.org>2022-05-16 09:35:17 +0000
commit2a6e13843d5bc0a380ce7081e33db9b636e394f9 (patch)
treea97b88142c9d11513bf49200fd318e0043de0acd /src/cmd/compile/internal/noder/reader.go
parent3caf67d247c102edfb8347f010e44afa143f46b5 (diff)
downloadgo-2a6e13843d5bc0a380ce7081e33db9b636e394f9.tar.xz
cmd/compile/internal/ir: more idiomatic DynamicType{,AssertExpr}
Rename DynamicType's "X" field to "RType". Split DynamicTypeAssertExpr's "T" field into "RType" and "ITab", the same as DynamicType, updating all uses accordingly. Change-Id: I8cec8171349c93234a10ac50708f800dee6fb1d2 Reviewed-on: https://go-review.googlesource.com/c/go/+/405334 Auto-Submit: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src/cmd/compile/internal/noder/reader.go')
-rw-r--r--src/cmd/compile/internal/noder/reader.go28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go
index 61a00fb04b..60aba3e560 100644
--- a/src/cmd/compile/internal/noder/reader.go
+++ b/src/cmd/compile/internal/noder/reader.go
@@ -1636,7 +1636,9 @@ func (r *reader) expr() (res ir.Node) {
typ := r.exprType(false)
if typ, ok := typ.(*ir.DynamicType); ok && typ.Op() == ir.ODYNAMICTYPE {
- return typed(typ.Type(), ir.NewDynamicTypeAssertExpr(pos, ir.ODYNAMICDOTTYPE, x, typ.X))
+ assert := ir.NewDynamicTypeAssertExpr(pos, ir.ODYNAMICDOTTYPE, x, typ.RType)
+ assert.ITab = typ.ITab
+ return typed(typ.Type(), assert)
}
return typecheck.Expr(ir.NewTypeAssertExpr(pos, x, typ.Type()))
@@ -1806,12 +1808,23 @@ func (r *reader) exprType(nilOK bool) ir.Node {
pos := r.pos()
+ lsymPtr := func(lsym *obj.LSym) ir.Node {
+ return typecheck.Expr(typecheck.NodAddr(ir.NewLinksymExpr(pos, lsym, types.Types[types.TUINT8])))
+ }
+
var typ *types.Type
- var lsym *obj.LSym
+ var rtype, itab ir.Node
if r.Bool() {
- itab := r.dict.itabs[r.Len()]
- typ, lsym = itab.typ, itab.lsym
+ info := r.dict.itabs[r.Len()]
+ typ = info.typ
+
+ // TODO(mdempsky): Populate rtype unconditionally?
+ if typ.IsInterface() {
+ rtype = lsymPtr(info.lsym)
+ } else {
+ itab = lsymPtr(info.lsym)
+ }
} else {
info := r.typInfo()
typ = r.p.typIdx(info, r.dict, true)
@@ -1823,11 +1836,12 @@ func (r *reader) exprType(nilOK bool) ir.Node {
return n
}
- lsym = reflectdata.TypeLinksym(typ)
+ rtype = lsymPtr(reflectdata.TypeLinksym(typ))
}
- ptr := typecheck.Expr(typecheck.NodAddr(ir.NewLinksymExpr(pos, lsym, types.Types[types.TUINT8])))
- return typed(typ, ir.NewDynamicType(pos, ptr))
+ dt := ir.NewDynamicType(pos, rtype)
+ dt.ITab = itab
+ return typed(typ, dt)
}
func (r *reader) op() ir.Op {