diff --git a/compiler/node.lisp b/compiler/node.lisp index b9b9b9399e22001571ae15cfb44c4fa445e1512d..cfa7ece3b051aa9b79ecc4f6020a9fbe94549964 100644 --- a/compiler/node.lisp +++ b/compiler/node.lisp @@ -33,8 +33,9 @@ ;;; continuation can represent the case of a discarded result by having no ;;; DEST. -(defstruct (continuation (:print-function %print-continuation) - (:constructor make-continuation (&optional dest))) +(defstruct (continuation + (:print-function %print-continuation) + (:constructor really-make-continuation (&optional dest))) ;; ;; An indication of the way that this continuation is currently used: ;; @@ -176,13 +177,13 @@ ;; null. The real value is then found in the Default-Cookie. The ;; Default-Cookie must also be kept in the node since it changes when ;; we run into a Proclaim duing IR1 conversion. - (cookie *current-cookie* :type cookie :read-only t) - (default-cookie *default-cookie* :type cookie :read-only t) + (cookie *current-cookie* :type cookie) + (default-cookie *default-cookie* :type cookie) ;; ;; Source code for this node. This is used to provide context in messages to ;; the user, since it may be hard to reconstruct the source from the internal ;; representation. - (source nil :type t :read-only t) + (source nil :type t) ;; ;; A representation of the location in the original source of the form ;; responsible for generating this node. The first element in this list is @@ -200,7 +201,7 @@ ;; code resulting from macroexpansion. The last element in the list is the ;; top-level form number, which is the ordinal number (in this call to the ;; compiler) of the truly top-level form containing the orignal source - (source-path *current-path* :type list :read-only t) + (source-path *current-path* :type list) ;; ;; If this node is in a tail-recursive position, then this is set to the ;; corresponding Tail-Set. This is first computed at the end of IR1 (after @@ -216,7 +217,7 @@ ;;; (defstruct (cblock (:print-function %print-block) (:include sset-element) - (:constructor make-block (start)) + (:constructor really-make-block (start)) (:constructor make-block-key) (:conc-name block-) (:predicate block-p) @@ -619,8 +620,12 @@ ;;; someone wants to know, an approximation is there. ;;; (defstruct (functional (:include leaf - (:where-from :defined) - (:type (specifier-type 'function)))) + (:where-from :defined) + (:type (specifier-type 'function))) + (:print-function %print-functional)) + ;; + ;; + ;; ;; ;; Some information about how this function is used. These values are ;; meaningful: @@ -654,6 +659,12 @@ ;; context. A top-level lambda should have *no* references. Its ;; Entry-Function is a self-pointer. ;; + ;; :Top-Level-XEP + ;; After a component is compiled, we clobber any top-level code + ;; references to its non-closure XEPs with dummy FUNCTIONAL structures + ;; having this kind. This prevents the retained top-level code from + ;; holding onto the IR for the code it references. + ;; ;; :Escape ;; :Cleanup ;; Special functions used internally by Catch and Unwind-Protect. @@ -668,7 +679,7 @@ ;; marked for deletion. ;; (kind nil :type (member nil :optional :deleted :external :top-level :escape - :cleanup :let :mv-let)) + :cleanup :let :mv-let :top-level-xep)) ;; ;; In a normal function, this is the external entry point (XEP) lambda for ;; this function, if any. Each function that is used other than in a local @@ -698,6 +709,9 @@ (benv *benv*) (tenv *tenv*)) +(defprinter functional + name) + ;;; The Lambda only deals with required lexical arguments. Special, optional, ;;; keyword and rest arguments are handled by transforming into simpler stuff. @@ -930,9 +944,10 @@ ;;; forever) NIL, since Refs don't receive any values and don't have any IR1 ;;; optimizer. ;;; -(defstruct (ref (:include node (:reoptimize nil)) - (:constructor make-ref (derived-type source leaf inlinep)) - (:print-function %print-ref)) +(defstruct (ref + (:include node (:reoptimize nil)) + (:constructor really-make-ref (derived-type source leaf inlinep)) + (:print-function %print-ref)) ;; ;; The leaf referenced. (leaf nil :type leaf) @@ -1022,7 +1037,7 @@ ;;; isn't Combination-P. ;;; (defstruct (combination (:include basic-combination) - (:constructor make-combination (source fun)) + (:constructor really-make-combination (source fun)) (:print-function %print-combination))) (defprinter combination