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 --- tests/i/class-destructor-throws/program.cps | 61 +++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 tests/i/class-destructor-throws/program.cps (limited to 'tests/i/class-destructor-throws/program.cps') diff --git a/tests/i/class-destructor-throws/program.cps b/tests/i/class-destructor-throws/program.cps new file mode 100644 index 0000000..5ff62ac --- /dev/null +++ b/tests/i/class-destructor-throws/program.cps @@ -0,0 +1,61 @@ +CLASS Trace + Id : INTEGER + PROCEDURE DELETE() + OUTPUT "destroy:", Id + ENDPROCEDURE +ENDCLASS +CLASS Bomb + PROCEDURE DELETE() + OUTPUT "bomb" + THROW + ENDPROCEDURE +ENDCLASS +PROCEDURE Normal() + DECLARE First : Trace + First.Id <- 1 + DECLARE Last : Bomb +ENDPROCEDURE +PROCEDURE DuringUnwind() + DECLARE Last : Bomb + THROW +ENDPROCEDURE +PROCEDURE InCatch() + DECLARE First : Trace + First.Id <- 2 + TRY + THROW + CATCH + DECLARE Last : Bomb + RETURN + ENDTRY +ENDPROCEDURE +PROCEDURE InTry() + DECLARE Last : Bomb + TRY + RETURN + CATCH + OUTPUT "return caught locally" + ENDTRY +ENDPROCEDURE +FUNCTION Result() RETURNS INTEGER + DECLARE Local : Trace + Local.Id <- 3 + RETURN Local.Id +ENDFUNCTION +TRY + CALL Normal() +CATCH + OUTPUT "normal caught" +ENDTRY +TRY + CALL InCatch() +CATCH + OUTPUT "catch exit caught" +ENDTRY +CALL InTry() +OUTPUT Result() +TRY + CALL DuringUnwind() +CATCH + OUTPUT "unwind throw caught" +ENDTRY -- cgit v1.3.1-4-g156e