From 6a3b31af5dbb22749e6d5a1cad9dfaab6863b615 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 08:36:19 +0000 Subject: feat(classes): destroy stack objects during exception unwinding Co-Authored-By: Claude Opus 5.5 --- lib/CodeGen/ConstructorGen.cc | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) (limited to 'lib/CodeGen/ConstructorGen.cc') diff --git a/lib/CodeGen/ConstructorGen.cc b/lib/CodeGen/ConstructorGen.cc index c0e50ac..e1033c3 100644 --- a/lib/CodeGen/ConstructorGen.cc +++ b/lib/CodeGen/ConstructorGen.cc @@ -1,5 +1,6 @@ #include "cps/CodeGen.h" #include "cps/MemoryHandler.h" +#include "cps/ExceptionHandler.h" #include "cps/TypeAST.h" #include #include @@ -168,19 +169,8 @@ void CodeGen::emitStackObjectCleanup(const StackObject &Object) { } void CodeGen::finishStackObjects(Function *F) { - IRBuilderBase::InsertPointGuard Guard(*Builder); - std::vector Exits; - for (auto &BB : *F) - if (BB.hasTerminator() && isa(BB.getTerminator())) - Exits.push_back(BB.getTerminator()); - for (auto *Exit : Exits) { - // Keep the original terminator in a continuation while cleanup builds branches. - auto *BB = Exit->getParent(); - auto *Continuation = BB->splitBasicBlock(Exit->getIterator(), "after_destruction"); - BB->getTerminator()->eraseFromParent(); - Builder->SetInsertPoint(BB); + Exceptions->fillCleanups(F, [this] { for (auto It = StackObjects.rbegin(); It != StackObjects.rend(); ++It) emitStackObjectCleanup(*It); - Builder->CreateBr(Continuation); - } + }); } -- cgit v1.3.1-4-g156e