;;; the continuation has no block, then we make it be in the block
;;; that the node is in. If the continuation heads its block, we end
;;; our block and link it to that block. If the continuation is not
-;;; currently used, then we set the derived-type for the continuation
+;;; currently used, then we set the DERIVED-TYPE for the continuation
;;; to that of the node, so that a little type propagation gets done.
;;;
;;; We also deal with a bit of THE's semantics here: we weaken the
;;; otherwise NIL is returned.
;;;
;;; This function may have arbitrary effects on the global environment
-;;; due to processing of PROCLAIMs and EVAL-WHENs. All syntax error
-;;; checking is done, with erroneous forms being replaced by a proxy
-;;; which signals an error if it is evaluated. Warnings about possibly
-;;; inconsistent or illegal changes to the global environment will
-;;; also be given.
+;;; due to processing of EVAL-WHENs. All syntax error checking is
+;;; done, with erroneous forms being replaced by a proxy which signals
+;;; an error if it is evaluated. Warnings about possibly inconsistent
+;;; or illegal changes to the global environment will also be given.
;;;
;;; We make the initial component and convert the form in a PROGN (and
;;; an optional NIL tacked on the end.) We then return the lambda. We
(res (ir1-convert-lambda-body
forms ()
:debug-name (debug-namify "top level form ~S" form))))
- (setf (functional-entry-function res) res
+ (setf (functional-entry-fun res) res
(functional-arg-documentation res) ()
(functional-kind res) :toplevel)
res)))
(use-continuation res cont)))
(values)))
-;;; Add FUN to the COMPONENT-REANALYZE-FUNCTIONS. FUN is returned.
- (defun maybe-reanalyze-function (fun)
+;;; Add FUN to the COMPONENT-REANALYZE-FUNS. FUN is returned.
+(defun maybe-reanalyze-fun (fun)
(declare (type functional fun))
(when (typep fun '(or optional-dispatch clambda))
- (pushnew fun (component-reanalyze-functions *current-component*)))
+ (pushnew fun (component-reanalyze-funs *current-component*)))
fun)
;;; Generate a REF node for LEAF, frobbing the LEAF structure as
:notinline))
(let ((fun (defined-fun-functional leaf)))
(when (and fun (not (functional-kind fun)))
- (maybe-reanalyze-function fun))))
+ (maybe-reanalyze-fun fun))))
leaf))
(res (make-ref (or (lexenv-find leaf type-restrictions)
(leaf-type leaf))
;;; Convert a reference to a symbolic constant or variable. If the
;;; symbol is entered in the LEXENV-VARIABLES we use that definition,
;;; otherwise we find the current global definition. This is also
-;;; where we pick off symbol macro and Alien variable references.
+;;; where we pick off symbol macro and alien variable references.
(defun ir1-convert-variable (start cont name)
(declare (type continuation start cont) (symbol name))
(let ((var (or (lexenv-find name variables) (find-free-variable name))))
(etypecase var
(leaf
- (when (and (lambda-var-p var) (lambda-var-ignorep var))
- ;; (ANSI's specification for the IGNORE declaration requires
- ;; that this be a STYLE-WARNING, not a full WARNING.)
- (compiler-style-warning "reading an ignored variable: ~S" name))
+ (when (lambda-var-p var)
+ (let ((home (continuation-home-lambda-or-null start)))
+ (when home
+ (pushnew var (lambda-calls-or-closes home))))
+ (when (lambda-var-ignorep var)
+ ;; (ANSI's specification for the IGNORE declaration requires
+ ;; that this be a STYLE-WARNING, not a full WARNING.)
+ (compiler-style-warning "reading an ignored variable: ~S" name)))
(reference-leaf start cont var))
(cons
(aver (eq (car var) 'MACRO))
(t
(ir1-convert-global-functoid-no-cmacro start cont form fun)))))
-;;; Handle the case of where the call was not a compiler macro, or was a
-;;; compiler macro and passed.
+;;; Handle the case of where the call was not a compiler macro, or was
+;;; a compiler macro and passed.
(defun ir1-convert-global-functoid-no-cmacro (start cont form fun)
(declare (type continuation start cont) (list form))
;; FIXME: Couldn't all the INFO calls here be converted into
(return))
(let ((this-cont (make-continuation)))
(ir1-convert this-start this-cont form)
- (setq this-start this-cont forms (cdr forms)))))))
+ (setq this-start this-cont
+ forms (cdr forms)))))))
(values))
\f
;;;; converting combinations
;;; Convert a function call where the function (i.e. the FUN argument)
-;;; is a LEAF. We return the COMBINATION node so that we can poke at
-;;; it if we want to.
+;;; is a LEAF. We return the COMBINATION node so that the caller can
+;;; poke at it if it wants to.
(declaim (ftype (function (continuation continuation list leaf) combination)
ir1-convert-combination))
(defun ir1-convert-combination (start cont form fun)
(if (functional-kind fun)
(throw 'local-call-lossage fun)
(ir1-convert-combination start cont form
- (maybe-reanalyze-function fun))))
+ (maybe-reanalyze-fun fun))))
\f
;;;; PROCESS-DECLS
key))))
key))
-;;; Parse a lambda-list into a list of VAR structures, stripping off
-;;; any aux bindings. Each arg name is checked for legality, and
+;;; Parse a lambda list into a list of VAR structures, stripping off
+;;; any &AUX bindings. Each arg name is checked for legality, and
;;; duplicate names are checked for. If an arg is globally special,
;;; the var is marked as :SPECIAL instead of :LEXICAL. &KEY,
;;; &OPTIONAL and &REST args are annotated with an ARG-INFO structure
;;; 4. a list of the &AUX variables; and
;;; 5. a list of the &AUX values.
(declaim (ftype (function (list) (values list boolean boolean list list))
- find-lambda-vars))
-(defun find-lambda-vars (list)
+ make-lambda-vars))
+(defun make-lambda-vars (list)
(multiple-value-bind (required optional restp rest keyp keys allowp aux
morep more-context more-count)
(parse-lambda-list list)
;;; Create a lambda node out of some code, returning the result. The
;;; bindings are specified by the list of VAR structures VARS. We deal
;;; with adding the names to the LEXENV-VARIABLES for the conversion.
-;;; The result is added to the NEW-FUNCTIONS in the
-;;; *CURRENT-COMPONENT* and linked to the component head and tail.
+;;; The result is added to the NEW-FUNS in the *CURRENT-COMPONENT* and
+;;; linked to the component head and tail.
;;;
;;; We detect special bindings here, replacing the original VAR in the
;;; lambda list with a temporary variable. We then pass a list of the
:%debug-name debug-name))
(result (or result (make-continuation))))
- ;; This function should fail internal assertions if we didn't set
- ;; up a valid debug name above.
+ ;; just to check: This function should fail internal assertions if
+ ;; we didn't set up a valid debug name above.
;;
;; (In SBCL we try to make everything have a debug name, since we
;; lack the omniscient perspective the original implementors used
(let ((block (continuation-block result)))
(when block
(let ((return (make-return :result result :lambda lambda))
- (tail-set (make-tail-set :functions (list lambda)))
+ (tail-set (make-tail-set :funs (list lambda)))
(dummy (make-continuation)))
(setf (lambda-tail-set lambda) tail-set)
(setf (lambda-return lambda) return)
(link-blocks block (component-tail *current-component*))))))
(link-blocks (component-head *current-component*) (node-block bind))
- (push lambda (component-new-functions *current-component*))
+ (push lambda (component-new-funs *current-component*))
lambda))
;;; Create the actual entry-point function for an optional entry
:%source-name source-name
:%debug-name debug-name))
(min (or (position-if #'lambda-var-arg-info vars) (length vars))))
- (push res (component-new-functions *current-component*))
+ (push res (component-new-funs *current-component*))
(ir1-convert-hairy-args res () () () () vars nil body aux-vars aux-vals
cont)
(setf (optional-dispatch-min-args res) min)
form))
(unless (and (consp (cdr form)) (listp (cadr form)))
(compiler-error
- "The lambda expression has a missing or non-list lambda-list:~% ~S"
+ "The lambda expression has a missing or non-list lambda list:~% ~S"
form))
(multiple-value-bind (vars keyp allow-other-keys aux-vars aux-vals)
- (find-lambda-vars (cadr form))
+ (make-lambda-vars (cadr form))
(multiple-value-bind (forms decls) (sb!sys:parse-body (cddr form))
- (let* ((cont (make-continuation))
+ (let* ((result-cont (make-continuation))
(*lexenv* (process-decls decls
(append aux-vars vars)
- nil cont))
+ nil result-cont))
(res (if (or (find-if #'lambda-var-arg-info vars) keyp)
(ir1-convert-hairy-lambda forms vars keyp
allow-other-keys
- aux-vars aux-vals cont
+ aux-vars aux-vals result-cont
:source-name source-name
:debug-name debug-name)
(ir1-convert-lambda-body forms vars
:aux-vars aux-vars
:aux-vals aux-vals
- :result cont
+ :result result-cont
:source-name source-name
:debug-name debug-name))))
(setf (functional-inline-expansion res) form)
(specifier-type 'function))))
(values))
-\f
-;;;; hacking function names
-
-;;; This is like LAMBDA, except the result is tweaked so that FUN-NAME
-;;; can extract a name. (Also possibly the name could also be used at
-;;; compile time to emit more-informative name-based compiler
-;;; diagnostic messages as well.)
-(defmacro-mundanely named-lambda (name args &body body)
-
- ;; FIXME: For now, in this stub version, we just discard the name. A
- ;; non-stub version might use either macro-level LOAD-TIME-VALUE
- ;; hackery or customized IR1-transform level magic to actually put
- ;; the name in place.
- (aver (legal-fun-name-p name))
- `(lambda ,args ,@body))