diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2022-05-09 17:19:58 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-05-16 09:35:17 +0000 |
| commit | 2a6e13843d5bc0a380ce7081e33db9b636e394f9 (patch) | |
| tree | a97b88142c9d11513bf49200fd318e0043de0acd /src/cmd/compile/internal/noder/reader.go | |
| parent | 3caf67d247c102edfb8347f010e44afa143f46b5 (diff) | |
| download | go-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.go | 28 |
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 { |
