diff options
author | Keith Randall <khr@google.com> | 2018-02-27 13:46:03 -0800 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2018-02-27 22:58:32 +0000 |
commit | 2413b5488841903ad99463962f50f85221733c30 (patch) | |
tree | 46a242b1f8cf5fc9c158cf3d562d4b9291c556a5 /test/live.go | |
parent | b80b4a23d135c12d91e71ba51e906cb5783f4d61 (diff) | |
download | go-2413b5488841903ad99463962f50f85221733c30.tar.gz go-2413b5488841903ad99463962f50f85221733c30.zip |
cmd/compile: mark the first word of an interface as a uintptr
The first word of an interface is a pointer, but for the purposes
of GC we don't need to treat it as such.
1. If it is a non-empty interface, the pointer points to an itab
which is always in persistentalloc space.
2. If it is an empty interface, the pointer points to a _type.
a. If it is a compile-time-allocated type, it points into
the read-only data section.
b. If it is a reflect-allocated type, it points into the Go heap.
Reflect is responsible for keeping a reference to
the underlying type so it won't be GCd.
If we ever have a moving GC, we need to change this for 2b (as
well as scan itabs to update their itab._type fields).
Write barriers on the first word of interfaces have already been removed.
Change-Id: I643e91d7ac4de980ac2717436eff94097c65d959
Reviewed-on: https://go-review.googlesource.com/97518
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'test/live.go')
-rw-r--r-- | test/live.go | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/test/live.go b/test/live.go index e54336ead7..ecab83e276 100644 --- a/test/live.go +++ b/test/live.go @@ -141,7 +141,7 @@ var i9 interface{} func f9() bool { g8() x := i9 - y := interface{}(str()) // ERROR "live at call to convT2Estring: .autotmp_[0-9]+ x.data x.type$" "live at call to str: x.data x.type$" + y := interface{}(str()) // ERROR "live at call to convT2Estring: .autotmp_[0-9]+ x.data$" "live at call to str: x.data$" i9 = y // make y escape so the line above has to call convT2E return x != y } |