aboutsummaryrefslogtreecommitdiff
path: root/tests/i/class-unwind/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-unwind/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-unwind/program.cps')
-rw-r--r--tests/i/class-unwind/program.cps56
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/i/class-unwind/program.cps b/tests/i/class-unwind/program.cps
new file mode 100644
index 0000000..298cd3a
--- /dev/null
+++ b/tests/i/class-unwind/program.cps
@@ -0,0 +1,56 @@
+CLASS Trace
+ Id : INTEGER
+ PROCEDURE DELETE()
+ OUTPUT "destroy:", Id
+ ENDPROCEDURE
+ENDCLASS
+PROCEDURE Inner()
+ DECLARE A : Trace
+ A.Id <- 1
+ DECLARE B : Trace
+ B.Id <- 2
+ THROW
+ENDPROCEDURE
+PROCEDURE Outer()
+ DECLARE A : Trace
+ A.Id <- 3
+ CALL Inner()
+ENDPROCEDURE
+PROCEDURE Check(I : INTEGER)
+ IF I = 2 THEN
+ THROW
+ ENDIF
+ENDPROCEDURE
+PROCEDURE Loop()
+ DECLARE I : INTEGER
+ FOR I <- 1 TO 2
+ CALL Check(I)
+ DECLARE Late : Trace
+ Late.Id <- 60
+ NEXT I
+ENDPROCEDURE
+PROCEDURE LocalCatch()
+ DECLARE Kept : Trace
+ Kept.Id <- 70
+ TRY
+ THROW
+ CATCH
+ OUTPUT "local caught"
+ ENDTRY
+ OUTPUT "still alive"
+ENDPROCEDURE
+DECLARE MainObject : Trace
+MainObject.Id <- 100
+TRY
+ CALL Outer()
+CATCH
+ OUTPUT "caught"
+ENDTRY
+TRY
+ CALL Loop()
+CATCH
+ OUTPUT "loop caught"
+ENDTRY
+CALL LocalCatch()
+OUTPUT "uncaught next"
+CALL Outer()