diff options
Diffstat (limited to 'src/runtime/stack.go')
| -rw-r--r-- | src/runtime/stack.go | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/src/runtime/stack.go b/src/runtime/stack.go index c32d9e8042..d5d09ba7d7 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -719,21 +719,16 @@ func adjustctxt(gp *g, adjinfo *adjustinfo) { } func adjustdefers(gp *g, adjinfo *adjustinfo) { + // Adjust defer argument blocks the same way we adjust active stack frames. + tracebackdefers(gp, adjustframe, noescape(unsafe.Pointer(adjinfo))) + // Adjust pointers in the Defer structs. - // We need to do this first because we need to adjust the - // defer.link fields so we always work on the new stack. - adjustpointer(adjinfo, unsafe.Pointer(&gp._defer)) + // Defer structs themselves are never on the stack. for d := gp._defer; d != nil; d = d.link { adjustpointer(adjinfo, unsafe.Pointer(&d.fn)) adjustpointer(adjinfo, unsafe.Pointer(&d.sp)) adjustpointer(adjinfo, unsafe.Pointer(&d._panic)) - adjustpointer(adjinfo, unsafe.Pointer(&d.link)) } - - // Adjust defer argument blocks the same way we adjust active stack frames. - // Note: this code is after the loop above, so that if a defer record is - // stack allocated, we work on the copy in the new stack. - tracebackdefers(gp, adjustframe, noescape(unsafe.Pointer(adjinfo))) } func adjustpanics(gp *g, adjinfo *adjustinfo) { |
