From f575ddaffe838c611359430946fe26b80808a35a Mon Sep 17 00:00:00 2001 From: Nikodemus Siivola Date: Thu, 18 Nov 2010 17:19:50 +0200 Subject: [PATCH] support for deprecating special variables Use DEFINE-DEPRECATED-VARIABLE to deprecate them. --- package-data-list.lisp-expr | 3 +++ src/code/early-extensions.lisp | 15 +++++++++++++++ src/code/symbol.lisp | 8 ++++++++ src/compiler/globaldb.lisp | 6 ++++++ src/compiler/ir1tran.lisp | 2 ++ 5 files changed, 34 insertions(+) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index bfab9b1..8560e0b 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -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" diff --git a/src/code/early-extensions.lisp b/src/code/early-extensions.lisp index 52ab419..6e077f1 100644 --- a/src/code/early-extensions.lisp +++ b/src/code/early-extensions.lisp @@ -1191,6 +1191,21 @@ (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)) diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index 7dcfe23..5ef0d7b 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -23,6 +23,14 @@ (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." diff --git a/src/compiler/globaldb.lisp b/src/compiler/globaldb.lisp index a0d4872..aa9f8b8 100644 --- a/src/compiler/globaldb.lisp +++ b/src/compiler/globaldb.lisp @@ -1000,6 +1000,12 @@ :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 diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 5a448fd..8bb36fb 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -682,6 +682,8 @@ ;; 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)) -- 1.7.10.4