diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-09-27 17:19:44 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-09-27 17:19:44 -0700 |
commit | 706d76a81618b522199f84d89101d0733c546786 (patch) | |
tree | e48fc3c291606896ddd04b07a6e6cbbacbabbb48 /tests/012 | |
parent | 73561e855842fe75450d789ef11c5fd883f221d0 (diff) | |
download | txr-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.expected | 40 | ||||
-rw-r--r-- | tests/012/fini.tl | 4 |
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))))) |