X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fir1-translators.lisp;h=d22a012fba84e0378074c059896418806d9122f6;hb=e049902f5e7c30501d2dbb7a41d058a0c717fc1f;hp=ccb901f9dc8ec10399f59262d0bdf5010f0e83f5;hpb=a52bbbda8ae06f5b501dd0d40c60d89f96d5471c;p=sbcl.git diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index ccb901f..d22a012 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -440,7 +440,8 @@ cont (ir1-convert-lambda thing :debug-name (debug-namify - "#'~S" thing)))) + "#'~S" thing) + :allow-debug-catch-tag t))) ((setf) (let ((var (find-lexically-apparent-fun thing "as the argument to FUNCTION"))) @@ -448,7 +449,8 @@ ((instance-lambda) (let ((res (ir1-convert-lambda `(lambda ,@(cdr thing)) :debug-name (debug-namify "#'~S" - thing)))) + thing) + :allow-debug-catch-tag t))) (setf (getf (functional-plist res) :fin-function) t) (reference-leaf start cont res))) (t @@ -482,9 +484,11 @@ (def-ir1-translator named-lambda ((name &rest rest) start cont) (let* ((fun (if (legal-fun-name-p name) (ir1-convert-lambda `(lambda ,@rest) - :source-name name) + :source-name name + :allow-debug-catch-tag t) (ir1-convert-lambda `(lambda ,@rest) - :debug-name name))) + :debug-name name + :allow-debug-catch-tag t))) (leaf (reference-leaf start cont fun))) (when (legal-fun-name-p name) (assert-global-function-definition-type name fun)) @@ -507,7 +511,8 @@ (def-ir1-translator %funcall ((function &rest args) start cont) (let ((fun-cont (make-continuation))) (ir1-convert start fun-cont function) - (assert-continuation-type fun-cont (specifier-type 'function)) + (assert-continuation-type fun-cont (specifier-type 'function) + (lexenv-policy *lexenv*)) (ir1-convert-combination-args fun-cont cont args))) ;;; This source transform exists to reduce the amount of work for the @@ -656,7 +661,8 @@ (ir1-convert-lambda d :source-name n :debug-name (debug-namify - "FLET ~S" n))) + "FLET ~S" n) + :allow-debug-catch-tag t)) names defs)) (*lexenv* (make-lexenv :default (process-decls decls nil fvars cont) @@ -691,7 +697,8 @@ (ir1-convert-lambda def :source-name name :debug-name (debug-namify - "LABELS ~S" name))) + "LABELS ~S" name) + :allow-debug-catch-tag t)) names defs)))) ;; Modify all the references to the dummy function leaves so @@ -747,13 +754,18 @@ ;;; many branches there are going to be. (defun ir1ize-the-or-values (type cont lexenv place) (declare (type continuation cont) (type lexenv lexenv)) - (let* ((ctype (if (typep type 'ctype) type (compiler-values-specifier-type type))) - (old-type (or (lexenv-find cont type-restrictions) - *wild-type*)) - (intersects (values-types-equal-or-intersect old-type ctype)) - (new (values-type-intersection old-type ctype))) + (let* ((atype (if (typep type 'ctype) type (compiler-values-specifier-type type))) + (old-atype (or (lexenv-find cont type-restrictions) + *wild-type*)) + (old-ctype (or (lexenv-find cont weakend-type-restrictions) + *wild-type*)) + (intersects (values-types-equal-or-intersect old-atype atype)) + (new-atype (values-type-intersection old-atype atype)) + (new-ctype (values-type-intersection + old-ctype (maybe-weaken-check atype (lexenv-policy lexenv))))) (when (null (find-uses cont)) - (setf (continuation-asserted-type cont) new)) + (setf (continuation-asserted-type cont) new-atype) + (setf (continuation-type-to-check cont) new-ctype)) (when (and (not intersects) ;; FIXME: Is it really right to look at *LEXENV* here, ;; instead of looking at the LEXENV argument? Why? @@ -761,10 +773,11 @@ (= inhibit-warnings 3)))) ;FIXME: really OK to suppress? (compiler-warn "The type ~S ~A conflicts with an enclosing assertion:~% ~S" - (type-specifier ctype) + (type-specifier atype) place - (type-specifier old-type))) - (make-lexenv :type-restrictions `((,cont . ,new)) + (type-specifier old-atype))) + (make-lexenv :type-restrictions `((,cont . ,new-atype)) + :weakend-type-restrictions `((,cont . ,new-ctype)) :default lexenv))) ;;; Assert that FORM evaluates to the specified type (which may be a @@ -841,8 +854,8 @@ (defun setq-var (start cont var value) (declare (type continuation start cont) (type basic-var var)) (let ((dest (make-continuation))) - (setf (continuation-asserted-type dest) (leaf-type var)) (ir1-convert start dest value) + (assert-continuation-type dest (leaf-type var) (lexenv-policy *lexenv*)) (let ((res (make-set :var var :value dest))) (setf (continuation-dest dest) res) (setf (leaf-ever-used var) t) @@ -852,7 +865,7 @@ ;;;; CATCH, THROW and UNWIND-PROTECT -;;; We turn THROW into a multiple-value-call of a magical function, +;;; We turn THROW into a MULTIPLE-VALUE-CALL of a magical function, ;;; since as as far as IR1 is concerned, it has no interesting ;;; properties other than receiving multiple-values. (def-ir1-translator throw ((tag result) start cont) @@ -988,7 +1001,8 @@ `(%coerce-callable-to-fun ,fun))) (setf (continuation-dest fun-cont) node) (assert-continuation-type fun-cont - (specifier-type '(or function symbol))) + (specifier-type '(or function symbol)) + (lexenv-policy *lexenv*)) (collect ((arg-conts)) (let ((this-start fun-cont)) (dolist (arg args) @@ -1038,6 +1052,7 @@ (ir1-convert start dummy-start result) (with-continuation-type-assertion + ;; FIXME: policy (cont (continuation-asserted-type dummy-start) "of the first form") (substitute-continuation-uses cont dummy-start)) @@ -1054,20 +1069,17 @@ ;;;; interface to defining macros -;;;; FIXME: -;;;; classic CMU CL comment: -;;;; DEFMACRO and DEFUN expand into calls to %DEFxxx functions -;;;; so that we get a chance to see what is going on. We define -;;;; IR1 translators for these functions which look at the -;;;; definition and then generate a call to the %%DEFxxx function. -;;;; Alas, this implementation doesn't do the right thing for -;;;; non-toplevel uses of these forms, so this should probably -;;;; be changed to use EVAL-WHEN instead. - -;;; Return a new source path with any stuff intervening between the -;;; current path and the first form beginning with NAME stripped off. -;;; This is used to hide the guts of DEFmumble macros to prevent -;;; annoying error messages. +;;; Old CMUCL comment: +;;; +;;; Return a new source path with any stuff intervening between the +;;; current path and the first form beginning with NAME stripped +;;; off. This is used to hide the guts of DEFmumble macros to +;;; prevent annoying error messages. +;;; +;;; Now that we have implementations of DEFmumble macros in terms of +;;; EVAL-WHEN, this function is no longer used. However, it might be +;;; worth figuring out why it was used, and maybe doing analogous +;;; munging to the functions created in the expanders for the macros. (defun revert-source-path (name) (do ((path *current-path* (cdr path))) ((null path) *current-path*) @@ -1075,28 +1087,3 @@ (when (or (eq first name) (eq first 'original-source-start)) (return path))))) - -(def-ir1-translator %define-compiler-macro ((name def lambda-list doc) - start cont - :kind :function) - (let ((name (eval name)) - (def (second def))) ; We don't want to make a function just yet... - - (when (eq (info :function :kind name) :special-form) - (compiler-error "attempt to define a compiler-macro for special form ~S" - name)) - - (setf (info :function :compiler-macro-function name) - (coerce def 'function)) - - (let* ((*current-path* (revert-source-path 'define-compiler-macro)) - (fun (ir1-convert-lambda def - :debug-name (debug-namify - "DEFINE-COMPILER-MACRO ~S" - name)))) - (setf (functional-arg-documentation fun) (eval lambda-list)) - - (ir1-convert start cont `(%%define-compiler-macro ',name ,fun ,doc))) - - (when sb!xc:*compile-print* - (compiler-mumble "~&; converted ~S~%" name))))