diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2022-08-05 20:29:51 -0700 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2022-08-10 23:26:58 +0000 |
| commit | 2e6ffd6c5d573d36e969ec8c21f70680493e58b9 (patch) | |
| tree | 8e927d807c7be37e5bb3ada26a5a4d94d46fbd84 /src/cmd/compile/internal/noder/reader.go | |
| parent | 6b80b62fd1b5338e6ec8bc2ff521b94f2fefae9c (diff) | |
| download | go-2e6ffd6c5d573d36e969ec8c21f70680493e58b9.tar.xz | |
cmd/compile/internal/noder: explicitly handle function instantiations
This CL changes unified IR to explicitly handle function
instantiations within expression handling, rather than leaving it to
the underlying object reading logic.
Change-Id: I009a56013fbe9fbc4dabf80eea98993d34af4272
Reviewed-on: https://go-review.googlesource.com/c/go/+/421817
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/compile/internal/noder/reader.go')
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go index 4bdce25cca..1c4323b67a 100644 --- a/src/cmd/compile/internal/noder/reader.go +++ b/src/cmd/compile/internal/noder/reader.go @@ -558,24 +558,7 @@ var objReader = map[*types.Sym]pkgReaderIndex{} // obj reads an instantiated object reference from the bitstream. func (r *reader) obj() ir.Node { r.Sync(pkgbits.SyncObject) - - if r.Bool() { - idx := r.Len() - obj := r.dict.funcsObj[idx] - if obj == nil { - fn := r.dict.funcs[idx] - targs := make([]*types.Type, len(fn.explicits)) - for i, targ := range fn.explicits { - targs[i] = r.p.typIdx(targ, r.dict, true) - } - - obj = r.p.objIdx(fn.idx, nil, targs) - assert(r.dict.funcsObj[idx] == nil) - r.dict.funcsObj[idx] = obj - } - return obj - } - + assert(!r.Bool()) // TODO(mdempsky): Remove; was derived func inst. idx := r.Reloc(pkgbits.RelocObj) explicits := make([]*types.Type, r.Len()) @@ -1860,6 +1843,25 @@ func (r *reader) expr() (res ir.Node) { // TODO(mdempsky): Handle builtins directly in exprCall, like method calls? return typecheck.Callee(r.obj()) + case exprFuncInst: + if r.Bool() { + idx := r.Len() + obj := r.dict.funcsObj[idx] + if obj == nil { + fn := r.dict.funcs[idx] + targs := make([]*types.Type, len(fn.explicits)) + for i, targ := range fn.explicits { + targs[i] = r.p.typIdx(targ, r.dict, true) + } + + obj = r.p.objIdx(fn.idx, nil, targs) + assert(r.dict.funcsObj[idx] == nil) + r.dict.funcsObj[idx] = obj + } + return obj + } + return r.obj() + case exprConst: pos := r.pos() typ := r.typ() |
