aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/panic.go
diff options
context:
space:
mode:
authorCherry Mui <cherryyz@google.com>2021-06-14 12:39:14 -0400
committerCherry Mui <cherryyz@google.com>2021-06-16 15:27:43 +0000
commita4121d7dd66b0bca91cc1619721f69e9027af041 (patch)
treead86230708e2fd1b375bc82a91dc6f62983112bf /src/runtime/panic.go
parent4d6f9d60cf597a49b918fc1d445251d6b643f860 (diff)
downloadgo-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.go25
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