评论者:hiredman
0002-async-220-generate-two-finally-blocks.patch
基于ASYNC-198的补丁之上
finally块可以通过正常执行流程或
处理异常来进入,因此一个finally X的行为有点像
(尝试(let (link: r (code)) (X) r) (catch Throwable t (X) (throw t)))
之前,:try 代码生成一个单独的 finally 块,它
试图确定是否需要重新抛出异常,方法是通过
查看 CURRENT-EXCEPTION 的值,但这在某些嵌套的 try/catch 中
不正确地工作。
因此,现在 :try 代码生成两个 finally 块,一个是重新抛出
,一个是不会重新抛出。重新抛出块的堆栈位于异常帧
栈上,不在重新抛出块跳转到 body 和每个异常处理的末尾。
the patch also gets rid of CURRENT-EXCEPTION entirely, as it was only used by finally to determine if it needed to throw or not
the patch also gets rid of CURRENT-EXCEPTION entirely, as it was only used by finally to determine if it needed to throw or not