diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2022-07-23 23:54:15 -0700 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2022-07-25 18:32:18 +0000 |
| commit | fc72b7705d67f432fb6a570f84df9e8840eec226 (patch) | |
| tree | 3c3800d1413eb30c6b9e7039a8c9961b8df0ba7a /src/cmd/compile/internal/noder/reader.go | |
| parent | f48fa643f1d8519da42faad1f838d4b2bd035269 (diff) | |
| download | go-fc72b7705d67f432fb6a570f84df9e8840eec226.tar.xz | |
[dev.unified] cmd/compile: add method expressions to dictionaries
This CL changes method expressions that use derived-type receiver
parameters to use dictionary lookups.
Change-Id: Iacd09b6d77a2d3000438ec8bc9b5af2a0b068aa7
Reviewed-on: https://go-review.googlesource.com/c/go/+/419455
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder/reader.go')
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go index fbbce7e80f..6b7ac5494f 100644 --- a/src/cmd/compile/internal/noder/reader.go +++ b/src/cmd/compile/internal/noder/reader.go @@ -154,6 +154,8 @@ type readerDict struct { funcsObj []ir.Node itabs []itabInfo2 + + methodExprs []ir.Node } type itabInfo2 struct { @@ -776,6 +778,14 @@ func (pr *pkgReader) objDictIdx(sym *types.Sym, idx pkgbits.Index, implicits, ex dict.itabs[i] = itabInfo2{typ: typ, lsym: lsym} } + dict.methodExprs = make([]ir.Node, r.Len()) + for i := range dict.methodExprs { + recv := pr.typIdx(typeInfo{idx: pkgbits.Index(r.Len()), derived: true}, &dict, true) + _, sym := r.selector() + + dict.methodExprs[i] = typecheck.Expr(ir.NewSelectorExpr(src.NoXPos, ir.OXDOT, ir.TypeNode(recv), sym)) + } + return &dict } @@ -1696,15 +1706,13 @@ func (r *reader) expr() (res ir.Node) { case exprSelector: var x ir.Node if r.Bool() { // MethodExpr - x = r.exprType(false) - - // Method expression with derived receiver type. - if x.Op() == ir.ODYNAMICTYPE { - // TODO(mdempsky): Handle with runtime dictionary lookup. - n := ir.TypeNode(x.Type()) - n.SetTypecheck(1) - x = n + if r.Bool() { + return r.dict.methodExprs[r.Len()] } + + n := ir.TypeNode(r.typ()) + n.SetTypecheck(1) + x = n } else { // FieldVal, MethodVal x = r.expr() } |
