]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] cmd/compile: move itabname call out of implements
authorMatthew Dempsky <mdempsky@google.com>
Sun, 20 Dec 2020 03:26:06 +0000 (19:26 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Mon, 21 Dec 2020 19:41:21 +0000 (19:41 +0000)
We only need to call itabname when actually creating the OCONVIFACE
ops, not any time we test whether a type implements an
interface. Additionally, by moving this call out of implements, we
make it purely based on types, which makes it safe to move to package
types.

Does not pass toolstash -cmp, because it shuffles symbol creation
order.

Change-Id: Iea8e0c9374218f4d97b4339020ebd758d051bd03
Reviewed-on: https://go-review.googlesource.com/c/go/+/279333
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>

src/cmd/compile/internal/gc/subr.go

index 2b0047e1503df1d2366fca4aea1ae088093281fb..48cbd2505eaaa40a51daeadce3f004a3947e9854 100644 (file)
@@ -304,6 +304,14 @@ func assignop(src, dst *types.Type) (ir.Op, string) {
                var missing, have *types.Field
                var ptr int
                if implements(src, dst, &missing, &have, &ptr) {
+                       // Call itabname so that (src, dst)
+                       // gets added to itabs early, which allows
+                       // us to de-virtualize calls through this
+                       // type/interface pair later. See peekitabs in reflect.go
+                       if isdirectiface(src) && !dst.IsEmptyInterface() {
+                               itabname(src, dst)
+                       }
+
                        return ir.OCONVIFACE, ""
                }
 
@@ -1404,14 +1412,6 @@ func implements(t, iface *types.Type, m, samename **types.Field, ptr *int) bool
                }
        }
 
-       // We're going to emit an OCONVIFACE.
-       // Call itabname so that (t, iface)
-       // gets added to itabs early, which allows
-       // us to de-virtualize calls through this
-       // type/interface pair later. See peekitabs in reflect.go
-       if isdirectiface(t0) && !iface.IsEmptyInterface() {
-               itabname(t0, iface)
-       }
        return true
 }