1 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; This software is derived from software originally released by Xerox
5 ;;;; Corporation. Copyright and release statements follow. Later modifications
6 ;;;; to the software are in the public domain and are provided with
7 ;;;; absolutely no warranty. See the COPYING and CREDITS files for more
10 ;;;; copyright information from original PCL sources:
12 ;;;; Copyright (c) 1985, 1986, 1987, 1988, 1989, 1990 Xerox Corporation.
13 ;;;; All rights reserved.
15 ;;;; Use and copying of this software and preparation of derivative works based
16 ;;;; upon this software are permitted. Any distribution of this software or
17 ;;;; derivative works must comply with all applicable United States export
20 ;;;; This software is made available AS IS, and Xerox Corporation makes no
21 ;;;; warranty about the software, its performance or its conformity to any
26 (!fix-early-generic-functions
)
27 (!fix-ensure-accessor-specializers
)
28 (compute-standard-slot-locations)
29 (dolist (s '(condition function structure-object
))
30 (dohash ((k v
) (classoid-subclasses (find-classoid s
)))
32 (find-class (classoid-name k
))))
33 (setq **boot-state
** 'complete
)
35 (defun print-std-instance (instance stream depth
)
36 (declare (ignore depth
))
37 (print-object instance stream
))
39 (setf (compiler-macro-function 'slot-value
) nil
)
40 (setf (compiler-macro-function 'set-slot-value
) nil
)
44 (deftransform slot-value
((object slot-name
) (t (constant-arg symbol
)) *
46 (let ((c-slot-name (lvar-value slot-name
)))
47 (if (sb-pcl::interned-symbol-p c-slot-name
)
48 (let* ((type (lvar-type object
))
49 (dd (when (structure-classoid-p type
)
50 (find-defstruct-description
51 (sb-kernel::structure-classoid-name type
))))
53 (find c-slot-name
(dd-slots dd
) :key
#'dsd-name
))))
55 `(,(dsd-accessor-name dsd
) object
))
57 (delay-ir1-transform node
:constraint
)
58 `(sb-pcl::accessor-slot-value object
',c-slot-name
))))
59 (give-up-ir1-transform "slot name is not an interned symbol"))))
61 (deftransform sb-pcl
::set-slot-value
((object slot-name new-value
)
62 (t (constant-arg symbol
) t
)
64 (let ((c-slot-name (lvar-value slot-name
)))
65 (if (sb-pcl::interned-symbol-p c-slot-name
)
66 (let* ((type (lvar-type object
))
67 (dd (when (structure-classoid-p type
)
68 (find-defstruct-description
69 (sb-kernel::structure-classoid-name type
))))
71 (find c-slot-name
(dd-slots dd
) :key
#'dsd-name
))))
73 `(setf (,(dsd-accessor-name dsd
) object
) new-value
))
74 ((policy node
(= safety
3))
75 ;; Safe code wants to check the type, and the global
76 ;; accessor won't do that. Also see the comment in the
78 (give-up-ir1-transform "cannot use optimized accessor in safe code"))
80 (delay-ir1-transform node
:constraint
)
81 `(sb-pcl::accessor-set-slot-value object
',c-slot-name new-value
))))
82 (give-up-ir1-transform "slot name is not an interned symbol"))))