Skip to content

Commit d1fbf64

Browse files
committed
finish panic
1 parent 5f10375 commit d1fbf64

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

panic.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,3 +188,19 @@ func recovery(gp *g) {
188188
和刚注册 defer 结构体链表时的情况不同,panic 时,我们没有调用 deferproc,而是直接跳到了 deferproc 的下一条指令的地址上,并且检查 AX 的值,这里已经被改成 1 了。
189189

190190
所以会直接跳转到函数最后对应该 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

Comments
 (0)