mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
![Cherry Zhang](/assets/img/avatar_default.png)
Currently, runtime.KeepAlive applied on a stack object doesn't actually keeps the stack object alive, and the heap object referenced from it could be collected. This is because the address of the stack object is rematerializeable, and we just ignored KeepAlive on rematerializeable values. This CL fixes it. Fixes #30476. Change-Id: Ic1f75ee54ed94ea79bd46a8ddcd9e81d01556d1d Reviewed-on: https://go-review.googlesource.com/c/164537 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
31 lines
525 B
Go
31 lines
525 B
Go
// run
|
|
|
|
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Issue 30476: KeepAlive didn't keep stack object alive.
|
|
|
|
package main
|
|
|
|
import "runtime"
|
|
|
|
func main() {
|
|
x := new([10]int)
|
|
runtime.SetFinalizer(x, func(*[10]int) { panic("FAIL: finalizer runs") })
|
|
p := &T{x, 0}
|
|
use(p)
|
|
runtime.GC()
|
|
runtime.GC()
|
|
runtime.GC()
|
|
runtime.KeepAlive(p)
|
|
}
|
|
|
|
type T struct {
|
|
x *[10]int
|
|
y int
|
|
}
|
|
|
|
//go:noinline
|
|
func use(*T) {}
|