summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-10-05 02:06:19 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-10-05 02:06:19 -0700
commitff6ba48351de477052fc404b571d5817f7cdc63c (patch)
treecaed7614ca72471ca561f2e2efe5e2697aa5850d
parent5c50205c0f025bae07e813f8374649759b2e825a (diff)
downloadtxr-ff6ba48351de477052fc404b571d5817f7cdc63c.tar.gz
txr-ff6ba48351de477052fc404b571d5817f7cdc63c.tar.bz2
txr-ff6ba48351de477052fc404b571d5817f7cdc63c.zip
defstruct: consolidate finalizers into one lambda.
* stdlib/struct.tl (defstruct): Don't generate a separate finalizer registration for each :fini or :postfini; roll them into a single lambda in the correct order. Their object argument turns into a let block around each piece of code to bind that argument, like had been done for :init and :postinit.
-rw-r--r--stdlib/struct.tl18
1 files changed, 12 insertions, 6 deletions
diff --git a/stdlib/struct.tl b/stdlib/struct.tl
index 6fc4a35f..d373c330 100644
--- a/stdlib/struct.tl
+++ b/stdlib/struct.tl
@@ -163,13 +163,19 @@
,(if (or inst-si-forms instance-init-forms
instance-fini-forms instance-postfini-forms)
^(lambda (,arg-sym)
- ,*(append-each ((iff (nreverse instance-fini-forms)))
- ^((finalize ,arg-sym (sys:meth-lambda ,name :fini (,(car iff))
- ,*(cdr iff))
+ ,*(if instance-fini-forms
+ ^((finalize ,arg-sym
+ (sys:meth-lambda ,name :fini (,arg-sym)
+ ,*(append-each ((iff instance-fini-forms))
+ ^((let ((,(car iff) ,arg-sym))
+ ,*(cdr iff)))))
t)))
- ,*(append-each ((ipf (nreverse instance-postfini-forms)))
- ^((finalize ,arg-sym (sys:meth-lambda ,name :postfini (,(car ipf))
- ,*(cdr ipf)))))
+ ,*(if instance-postfini-forms
+ ^((finalize ,arg-sym
+ (sys:meth-lambda ,name :postfini (,arg-sym)
+ ,*(append-each ((iff (nreverse instance-postfini-forms)))
+ ^((let ((,(car iff) ,arg-sym))
+ ,*(cdr iff))))))))
,*(if inst-si-forms
^((let ((,type-sym (struct-type ,arg-sym)))
,*(mapcar (aret ^(unless (static-slot-p ,type-sym ',@2)