diff options
| author | Cherry Mui <cherryyz@google.com> | 2021-06-14 12:39:14 -0400 |
|---|---|---|
| committer | Cherry Mui <cherryyz@google.com> | 2021-06-16 15:27:43 +0000 |
| commit | a4121d7dd66b0bca91cc1619721f69e9027af041 (patch) | |
| tree | ad86230708e2fd1b375bc82a91dc6f62983112bf /src/runtime/panic.go | |
| parent | 4d6f9d60cf597a49b918fc1d445251d6b643f860 (diff) | |
| download | go-a4121d7dd66b0bca91cc1619721f69e9027af041.tar.xz | |
[dev.typeparams] Revert "[dev.typeparams] runtime: make deferproc take a func() argument"
Temprary revert CL 325918.
Delve relies on the _defer.fn.fn field to get defer frames.
CL 325918 changes the type of _defer.fn to func(), which no
longer has an fn field.
Change-Id: If6c71b15a27bac579593f5273c9a49715e6e35b2
Reviewed-on: https://go-review.googlesource.com/c/go/+/327775
Trust: Cherry Mui <cherryyz@google.com>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dan Scales <danscales@google.com>
Diffstat (limited to 'src/runtime/panic.go')
| -rw-r--r-- | src/runtime/panic.go | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/runtime/panic.go b/src/runtime/panic.go index 86d41c4e1c..04b95e51e5 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -226,7 +226,7 @@ func panicmemAddr(addr uintptr) { // Create a new deferred function fn, which has no arguments and results. // The compiler turns a defer statement into a call to this. -func deferproc(fn func()) { +func deferproc(fn *funcval) { // TODO: Make deferproc just take a func(). gp := getg() if gp.m.curg != gp { // go code on the system stack can't defer @@ -302,6 +302,16 @@ func deferprocStack(d *_defer) { // been set and must not be clobbered. } +// deferFunc returns d's deferred function. This is temporary while we +// support both modes of GOEXPERIMENT=regabidefer. Once we commit to +// that experiment, we should change the type of d.fn. +//go:nosplit +func deferFunc(d *_defer) func() { + var fn func() + *(**funcval)(unsafe.Pointer(&fn)) = d.fn + return fn +} + // Each P holds a pool for defers. // Allocate a Defer, usually using per-P pool. @@ -461,9 +471,7 @@ func deferreturn() { // called with a callback on an LR architecture and jmpdefer is on the // stack, because the stack trace can be incorrect in that case - see // issue #8153). - if fn == nil { - fn() - } + _ = fn.fn jmpdefer(fn, argp) } @@ -527,7 +535,7 @@ func Goexit() { } else { // Save the pc/sp in deferCallSave(), so we can "recover" back to this // loop if necessary. - deferCallSave(&p, d.fn) + deferCallSave(&p, deferFunc(d)) } if p.aborted { // We had a recursive panic in the defer d we started, and @@ -719,12 +727,12 @@ func runOpenDeferFrame(gp *g, d *_defer) bool { if deferBits&(1<<i) == 0 { continue } - closure := *(*func())(unsafe.Pointer(d.varp - uintptr(closureOffset))) + closure := *(**funcval)(unsafe.Pointer(d.varp - uintptr(closureOffset))) d.fn = closure deferBits = deferBits &^ (1 << i) *(*uint8)(unsafe.Pointer(d.varp - uintptr(deferBitsOffset))) = deferBits p := d._panic - deferCallSave(p, d.fn) + deferCallSave(p, deferFunc(d)) if p != nil && p.aborted { break } @@ -845,7 +853,8 @@ func gopanic(e interface{}) { } } else { p.argp = unsafe.Pointer(getargp()) - d.fn() + fn := deferFunc(d) + fn() } p.argp = nil |
