summaryrefslogtreecommitdiffstats
path: root/tests/012
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-09-27 17:19:44 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-09-27 17:19:44 -0700
commit706d76a81618b522199f84d89101d0733c546786 (patch)
treee48fc3c291606896ddd04b07a6e6cbbacbabbb48 /tests/012
parent73561e855842fe75450d789ef11c5fd883f221d0 (diff)
downloadtxr-706d76a81618b522199f84d89101d0733c546786.tar.gz
txr-706d76a81618b522199f84d89101d0733c546786.tar.bz2
txr-706d76a81618b522199f84d89101d0733c546786.zip
New :postfini feature in defstruct.
The :postfini clause registers a finalizer that runs in the ordinary order: after previously registered ones. This has the effect of allowing a derived structure to run clean-up actions after those of inherited structures. Either order can be useful because the dependencies between base and derived can go in either direction. It's a huge mistake in C++ that it supports only derived-first destructor invocation order. * stdlib/struct.tl (defstruct): Recognize and translate :postfini clause. It's exactly like :fini but omits the t parameter in the finalize call, registering in the natural order. * tests/012/fini.tl (derived): Add :postfini handler. * tests/012/fini.expected: Updated to reflect the messages coming from the postfini handler, which are happening in the correct order. * txr.1: Documented.
Diffstat (limited to 'tests/012')
-rw-r--r--tests/012/fini.expected40
-rw-r--r--tests/012/fini.tl4
2 files changed, 43 insertions, 1 deletions
diff --git a/tests/012/fini.expected b/tests/012/fini.expected
index 5e967eb2..a733802b 100644
--- a/tests/012/fini.expected
+++ b/tests/012/fini.expected
@@ -2,44 +2,64 @@ inside with-objects
base:21 finalized
derived:1 derived fini
derived:1 finalized
+derived:1 derived postfini
derived:2 derived fini
derived:2 finalized
+derived:2 derived postfini
derived:3 derived fini
derived:3 finalized
+derived:3 derived postfini
derived:4 derived fini
derived:4 finalized
+derived:4 derived postfini
derived:5 derived fini
derived:5 finalized
+derived:5 derived postfini
derived:6 derived fini
derived:6 finalized
+derived:6 derived postfini
derived:7 derived fini
derived:7 finalized
+derived:7 derived postfini
derived:8 derived fini
derived:8 finalized
+derived:8 derived postfini
derived:9 derived fini
derived:9 finalized
+derived:9 derived postfini
derived:10 derived fini
derived:10 finalized
+derived:10 derived postfini
derived:11 derived fini
derived:11 finalized
+derived:11 derived postfini
derived:12 derived fini
derived:12 finalized
+derived:12 derived postfini
derived:13 derived fini
derived:13 finalized
+derived:13 derived postfini
derived:14 derived fini
derived:14 finalized
+derived:14 derived postfini
derived:15 derived fini
derived:15 finalized
+derived:15 derived postfini
derived:16 derived fini
derived:16 finalized
+derived:16 derived postfini
derived:17 derived fini
derived:17 finalized
+derived:17 derived postfini
derived:18 derived fini
derived:18 finalized
+derived:18 derived postfini
derived:19 derived fini
derived:19 finalized
+derived:19 derived postfini
derived:20 derived fini
derived:20 finalized
+derived:20 derived postfini
after with-objects
derived:41 derived fini
derived:41 finalized
@@ -81,3 +101,23 @@ derived:23 derived fini
derived:23 finalized
derived:22 derived fini
derived:22 finalized
+derived:22 derived postfini
+derived:23 derived postfini
+derived:24 derived postfini
+derived:25 derived postfini
+derived:26 derived postfini
+derived:27 derived postfini
+derived:28 derived postfini
+derived:29 derived postfini
+derived:30 derived postfini
+derived:31 derived postfini
+derived:32 derived postfini
+derived:33 derived postfini
+derived:34 derived postfini
+derived:35 derived postfini
+derived:36 derived postfini
+derived:37 derived postfini
+derived:38 derived postfini
+derived:39 derived postfini
+derived:40 derived postfini
+derived:41 derived postfini
diff --git a/tests/012/fini.tl b/tests/012/fini.tl
index 3aa581f9..775f210f 100644
--- a/tests/012/fini.tl
+++ b/tests/012/fini.tl
@@ -11,7 +11,9 @@
(defstruct derived base
(:fini (me)
- (put-line `@(typeof me):@{me.id} derived fini`)))
+ (put-line `@(typeof me):@{me.id} derived fini`))
+ (:postfini (me)
+ (put-line `@(typeof me):@{me.id} derived postfini`)))
(unwind-protect
(with-objects ((b (new base others (mapcar (ret (new derived)) (range 1 20)))))