DOCUMENTATION injects deprecation notes into docstrings
[sbcl.git] / src / pcl / compiler-support.lisp
blob4bd44f466265f53f9df7ce1a3c34846935dfef97
1 ;;;; things which the main SBCL compiler needs to know about the
2 ;;;; implementation of CLOS
3 ;;;;
4 ;;;; (Our CLOS is derived from PCL, which was implemented in terms of
5 ;;;; portable high-level Common Lisp. But now that it no longer needs
6 ;;;; to be portable, we can make some special hacks to support it
7 ;;;; better.)
9 ;;;; This software is part of the SBCL system. See the README file for more
10 ;;;; information.
12 ;;;; This software is derived from software originally released by Xerox
13 ;;;; Corporation. Copyright and release statements follow. Later modifications
14 ;;;; to the software are in the public domain and are provided with
15 ;;;; absolutely no warranty. See the COPYING and CREDITS files for more
16 ;;;; information.
18 ;;;; copyright information from original PCL sources:
19 ;;;;
20 ;;;; Copyright (c) 1985, 1986, 1987, 1988, 1989, 1990 Xerox Corporation.
21 ;;;; All rights reserved.
22 ;;;;
23 ;;;; Use and copying of this software and preparation of derivative works based
24 ;;;; upon this software are permitted. Any distribution of this software or
25 ;;;; derivative works must comply with all applicable United States export
26 ;;;; control laws.
27 ;;;;
28 ;;;; This software is made available AS IS, and Xerox Corporation makes no
29 ;;;; warranty about the software, its performance or its conformity to any
30 ;;;; specification.
32 (in-package "SB-C")
34 ;;;; very low-level representation of instances with meta-class
35 ;;;; STANDARD-CLASS
37 (defknown sb-pcl::pcl-instance-p (t) boolean
38 (movable foldable flushable explicit-check))
40 (deftransform sb-pcl::pcl-instance-p ((object))
41 (let* ((otype (lvar-type object))
42 (standard-object (specifier-type 'standard-object)))
43 (cond
44 ;; Flush tests whose result is known at compile time.
45 ((csubtypep otype standard-object) t)
46 ((not (types-equal-or-intersect otype standard-object)) nil)
48 `(sb-pcl::%pcl-instance-p object)))))
50 (defun sb-pcl::safe-code-p (&optional env)
51 (policy (or env (make-null-lexenv)) (eql safety 3)))
53 (declaim (ftype function sb-pcl::parse-specialized-lambda-list))
54 (define-source-context defmethod (name &rest stuff)
55 (let ((arg-pos (position-if #'listp stuff)))
56 (if arg-pos
57 `(defmethod ,name ,@(subseq stuff 0 arg-pos)
58 ,(handler-case
59 (nth-value 2 (sb-pcl::parse-specialized-lambda-list
60 (elt stuff arg-pos)))
61 (error () "<illegal syntax>")))
62 `(defmethod ,name "<illegal syntax>"))))
64 (defvar sb-pcl::*internal-pcl-generalized-fun-name-symbols* nil)
66 (defmacro define-internal-pcl-function-name-syntax (name (var) &body body)
67 `(progn
68 (define-function-name-syntax ,name (,var) ,@body)
69 (pushnew ',name sb-pcl::*internal-pcl-generalized-fun-name-symbols*)))
71 (define-internal-pcl-function-name-syntax sb-pcl::slot-accessor (list)
72 (when (= (length list) 4)
73 (destructuring-bind (class slot rwb) (cdr list)
74 (when (and (member rwb '(sb-pcl::reader sb-pcl::writer sb-pcl::boundp))
75 (symbolp slot)
76 (symbolp class))
77 (values t slot)))))
79 (define-internal-pcl-function-name-syntax sb-pcl::fast-method (list)
80 (valid-function-name-p (cadr list)))
82 (define-internal-pcl-function-name-syntax sb-pcl::slow-method (list)
83 (valid-function-name-p (cadr list)))
85 (declaim (ftype function sb-pcl::std-instance-p sb-pcl::fsc-instance-p))
86 (define-internal-pcl-function-name-syntax sb-pcl::ctor (list)
87 (let ((class-or-name (cadr list)))
88 (cond
89 ((symbolp class-or-name)
90 (values (valid-function-name-p class-or-name) nil))
91 ((or (sb-pcl::std-instance-p class-or-name)
92 (sb-pcl::fsc-instance-p class-or-name))
93 (values t nil)))))