X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fnode.lisp;h=afcb90de577f59d1a39d99e01662768178ebda33;hb=45bc305be4e269d2e1a477c8e0ae9a64df1ccd1c;hp=ac17c72f467dacb63ca8bb0df72cc177cd9fbe04;hpb=6d3b9d5de8a28cd92e280f3451b60ce412260c19;p=sbcl.git diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index ac17c72..afcb90d 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -665,14 +665,17 @@ (functional-%debug-name leaf))) ;;; The CONSTANT structure is used to represent known constant values. -;;; If NAME is not null, then it is the name of the named constant -;;; which this leaf corresponds to, otherwise this is an anonymous -;;; constant. -(def!struct (constant (:include leaf)) +;;; Since the same constant leaf may be shared between named and anonymous +;;; constants, %SOURCE-NAME is never used. +(def!struct (constant (:constructor make-constant (value + &aux + (type (ctype-of value)) + (%source-name '.anonynous.) + (where-from :defined))) + (:include leaf)) ;; the value of the constant - (value nil :type t)) + (value (missing-arg) :type t)) (defprinter (constant :identity t) - (%source-name :test %source-name) value) ;;; The BASIC-VAR structure represents information common to all @@ -1142,14 +1145,20 @@ (def!struct (ref (:include valued-node (reoptimize nil)) (:constructor make-ref (leaf + &optional (%source-name '.anonymous.) &aux (leaf-type (leaf-type leaf)) (derived-type (make-single-value-type leaf-type)))) (:copier nil)) ;; The leaf referenced. - (leaf nil :type leaf)) + (leaf nil :type leaf) + ;; CONSTANT nodes are always anonymous, since we wish to coalesce named and + ;; unnamed constants that are equivalent, we need to keep track of the + ;; reference name for XREF. + (%source-name (missing-arg) :type symbol :read-only t)) (defprinter (ref :identity t) #!+sb-show id + %source-name leaf) ;;; Naturally, the IF node always appears at the end of a block.