aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder/reader.go
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2022-08-05 20:29:51 -0700
committerMatthew Dempsky <mdempsky@google.com>2022-08-10 23:26:58 +0000
commit2e6ffd6c5d573d36e969ec8c21f70680493e58b9 (patch)
tree8e927d807c7be37e5bb3ada26a5a4d94d46fbd84 /src/cmd/compile/internal/noder/reader.go
parent6b80b62fd1b5338e6ec8bc2ff521b94f2fefae9c (diff)
downloadgo-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.go38
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()