diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-10-05 02:06:19 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-10-05 02:06:19 -0700 |
commit | ff6ba48351de477052fc404b571d5817f7cdc63c (patch) | |
tree | caed7614ca72471ca561f2e2efe5e2697aa5850d /stdlib | |
parent | 5c50205c0f025bae07e813f8374649759b2e825a (diff) | |
download | txr-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.
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/struct.tl | 18 |
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) |