aboutsummaryrefslogtreecommitdiff
path: root/tests/i/class-destructor-throws/program.cps
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-17 08:36:19 +0000
committer_ov4 <ov4@ov4.org>2026-10-17 08:36:19 +0000
commit6a3b31af5dbb22749e6d5a1cad9dfaab6863b615 (patch)
tree58d2e7d956c8c605599a3f760040234ec2556d29 /tests/i/class-destructor-throws/program.cps
parentabd56ef20bc8061bbecec29edd1301d324c2cb34 (diff)
feat(classes): destroy stack objects during exception unwinding
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'tests/i/class-destructor-throws/program.cps')
-rw-r--r--tests/i/class-destructor-throws/program.cps61
1 files changed, 61 insertions, 0 deletions
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