1.0.12.18: faster member-type operations
[sbcl.git] / src / compiler / node.lisp
index 6319c5b..9896b06 100644 (file)
@@ -86,6 +86,7 @@
     (format stream "~D" (cont-num x))))
 
 (def!struct (node (:constructor nil)
+                  (:include sset-element (number (incf *compiler-sset-counter*)))
                   (:copier nil))
   ;; unique ID for debugging
   #!+sb-show (id (new-object-id) :read-only t)
   ;; entire initial component just to clear the flags.
   (flag nil)
   ;; some kind of info used by the back end
-  (info nil))
+  (info nil)
+  ;; what macroexpansions happened "in" this block, used for xref
+  (macroexpands nil :type list)
+  ;; Cache the physenv of a block during lifetime analysis. :NONE if
+  ;; no cached value has been stored yet.
+  (physenv-cache :none :type (or null physenv (member :none))))
 (def!method print-object ((cblock cblock) stream)
   (print-unreadable-object (cblock stream :type t :identity t)
     (format stream "~W :START c~W"
   ;; this is filled by physical environment analysis
   (dx-lvars nil :type list)
   ;; The default LOOP in the component.
-  (outer-loop (missing-arg) :type cloop))
+  (outer-loop (missing-arg) :type cloop)
+  ;; The current sset index
+  (sset-number 0 :type fixnum))
 (defprinter (component :identity t)
   name
   #!+sb-show id
 ;;; allows us to easily substitute one for the other without actually
 ;;; hacking the flow graph.
 (def!struct (leaf (:make-load-form-fun ignore-it)
+                  (:include sset-element (number (incf *compiler-sset-counter*)))
                   (:constructor nil))
   ;; unique ID for debugging
   #!+sb-show (id (new-object-id) :read-only t)
   ;; sure that no closure is needed.
   (allocator nil :type (or null combination))
   ;; various rare miscellaneous info that drives code generation & stuff
-  (plist () :type list))
+  (plist () :type list)
+  ;; xref information for this functional (only used for functions with an
+  ;; XEP)
+  (xref () :type list))
 (defprinter (functional :identity t)
   %source-name
   %debug-name
   ;; objects (closed-over LAMBDA-VARs and XEPs) which this lambda
   ;; depends on in such a way that DFO shouldn't put them in separate
   ;; components.
-  (calls-or-closes nil :type list)
+  (calls-or-closes (make-sset) :type (or null sset))
   ;; the TAIL-SET that this LAMBDA is in. This is null during creation.
   ;;
   ;; In CMU CL, and old SBCL, this was also NILed out when LET
   (call-lexenv nil :type (or lexenv null))
   ;; list of embedded lambdas
   (children nil :type list)
-  (parent nil :type (or clambda null)))
+  (parent nil :type (or clambda null))
+  (allow-instrumenting *allow-instrumenting* :type boolean))
 (defprinter (clambda :conc-name lambda- :identity t)
   %source-name
   %debug-name
   ;; propagation. This is left null by the lambda pre-pass if it
   ;; determine that this is a set closure variable, and is thus not a
   ;; good subject for flow analysis.
-  (constraints nil :type (or sset null)))
+  (constraints nil :type (or sset null))
+  ;; The FOP handle of the lexical variable represented by LAMBDA-VAR
+  ;; in the fopcompiler.
+  (fop-value nil))
 (defprinter (lambda-var :identity t)
   %source-name
   #!+sb-show id