From b6a9b50f9331fb7104667940c241895008ced39d Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 8 Oct 2026 21:04:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(gen):=20=E5=BC=82=E5=B8=B8=E4=B8=8E?= =?UTF-8?q?=E4=BC=A0=E6=92=AD=E5=87=BA=E5=8F=A3=E4=B9=9F=E9=87=8A=E6=94=BE?= =?UTF-8?q?=20slife=EF=BC=88P1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 插桩点选在 StmtGenMixin._eh_ret_default —— 异常路径上真正离开函数的唯一汇聚点(translate_raise 的 bare raise / StopIteration / 传播三条分支 + try 的 UnhandledBB 传播分支都走它),发 ret 前 _SlifeEmitFrees。不得改在 raise 语句本身:被本函数 except 捕获时对象仍在用(那一步只 br 到 DispatchBB);EH 返回值也不会是 slife 对象(逃逸检查已拒)。 --- App/lib/core/Gen/Stmt/StmtGenMixin.vp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/App/lib/core/Gen/Stmt/StmtGenMixin.vp b/App/lib/core/Gen/Stmt/StmtGenMixin.vp index 1072b7b..2102d0a 100644 --- a/App/lib/core/Gen/Stmt/StmtGenMixin.vp +++ b/App/lib/core/Gen/Stmt/StmtGenMixin.vp @@ -466,6 +466,11 @@ novirtual class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): if cur_func is None: return 0 ret_ty: mlirlite.LLVMType* = mlirlite.function_get_ret_ty(cur_func) if ret_ty is None: return 0 + # P1:异常/传播出口**也是函数出口** —— 这里是"异常路径上真正离开函数"的唯一落点 + # (translate_raise 的三条分支 + try 的 UnhandledBB 传播分支都汇聚到它),所以在此逆序释放 + # 本函数登记的 slife。**不能**改在 raise 语句本身释放:被本函数 except 捕获时对象仍在用 + # (那一步只 br 到 DispatchBB,不走这里);同理 EH 返回值不会是 slife 对象(逃逸检查已拒)。 + self.Gen.VarGen._SlifeEmitFrees(pool, builder, trans.Module, trans) match ret_ty: case mlirlite.LLVMType.Void(): mlirlite.build_ret_void(builder)