We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent 5f10375 commit d1fbf64Copy full SHA for d1fbf64
panic.md
@@ -188,3 +188,19 @@ func recovery(gp *g) {
188
和刚注册 defer 结构体链表时的情况不同,panic 时,我们没有调用 deferproc,而是直接跳到了 deferproc 的下一条指令的地址上,并且检查 AX 的值,这里已经被改成 1 了。
189
190
所以会直接跳转到函数最后对应该 deferproc 的 deferreturn 位置去。
191
+
192
+最后确认一次,runtime.gogo 会把 sched.ret 搬到 AX 寄存器:
193
194
+```go
195
+TEXT runtime·gogo(SB), NOSPLIT, $16-8
196
+ MOVQ buf+0(FP), BX // gobuf
197
+ MOVQ gobuf_g(BX), DX
198
+ MOVQ 0(DX), CX // make sure g != nil
199
+ get_tls(CX)
200
+ MOVQ DX, g(CX)
201
+ MOVQ gobuf_sp(BX), SP // restore SP
202
+ MOVQ gobuf_ret(BX), AX // ----------> 重点在这里
203
+ MOVQ gobuf_ctxt(BX), DX
204
+```
205
206
+这样所有流程就都打通了。
0 commit comments