From dcef7871ff8c0b45a2e7e4b2e7c78ee0436f4455 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 5 Oct 2022 02:06:19 -0700 Subject: 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. --- stdlib/struct.tl | 18 ++++++++++++------ 1 file 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) -- cgit v1.2.3