support for deprecating special variables
authorNikodemus Siivola <nikodemus@random-state.net>
Thu, 18 Nov 2010 15:19:50 +0000 (17:19 +0200)
committerNikodemus Siivola <nikodemus@random-state.net>
Fri, 1 Feb 2013 20:30:11 +0000 (22:30 +0200)
  Use DEFINE-DEPRECATED-VARIABLE to deprecate them.

package-data-list.lisp-expr
src/code/early-extensions.lisp
src/code/symbol.lisp
src/compiler/globaldb.lisp
src/compiler/ir1tran.lisp

index bfab9b1..8560e0b 100644 (file)
@@ -1033,6 +1033,9 @@ possibly temporariliy, because it might be used internally."
 
                ;; Deprecating stuff
                "DEFINE-DEPRECATED-FUNCTION"
+               "DEFINE-DEPRECATED-VARIABLE"
+               "DEPRECATED-VARIABLE"
+               "CHECK-DEPRECATED-VARIABLE"
                "EARLY-DEPRECATION-WARNING"
                "LATE-DEPRECATION-WARNING"
                "FINAL-DEPRECATION-WARNING"
index 52ab419..6e077f1 100644 (file)
        (setf (compiler-macro-function ',name)
              (deprecation-compiler-macro ,state ,since ',name ',replacements)))))
 
+(defun check-deprecated-variable (name)
+  (let ((info (info :variable :deprecated name)))
+    (when info
+      (deprecation-warning (car info) (cdr info) name nil))))
+
+(defmacro define-deprecated-variable (state since name &key (value nil valuep) replacement)
+  `(progn
+     (setf (info :variable :deprecated ',name) (cons ,state ,since))
+     ,@(when (member state '(:early :late))
+         `((defvar ,name ,@(when valuep (list value))
+             ,(let ((*package* (find-package :keyword)))
+                (format nil
+                        "~@<~S has been deprecated as of SBCL ~A~@[, use ~S instead~].~:>"
+                        name since replacement)))))))
+
 ;;; Anaphoric macros
 (defmacro awhen (test &body body)
   `(let ((it ,test))
index 7dcfe23..5ef0d7b 100644 (file)
   (declare (optimize (safety 1)))
   (symbol-value symbol))
 
+#-sb-xc-host
+(define-compiler-macro symbol-value (&whole form symbol &environment env)
+  (when (sb!xc:constantp symbol env)
+    (let ((name (constant-form-value symbol env)))
+      (when (symbolp name)
+        (check-deprecated-variable name))))
+  form)
+
 (defun boundp (symbol)
   #!+sb-doc
   "Return non-NIL if SYMBOL is bound to a value."
index a0d4872..aa9f8b8 100644 (file)
   :type-spec boolean
   :default nil)
 
+(define-info-type
+  :class :variable
+  :type :deprecated
+  :type-spec t
+  :default nil)
+
 ;;; the declared type for this variable
 (define-info-type
   :class :variable
index 5a448fd..8bb36fb 100644 (file)
                ;; processing our own code, though.
                #+sb-xc-host
                (warn "reading an ignored variable: ~S" name)))
+           (when (global-var-p var)
+             (check-deprecated-variable name))
            (reference-leaf start next result var name))
           (cons
            (aver (eq (car var) 'macro))