ac9f364da585d33d6bafbeac0ba8e234375818fc
[sbcl.git] / src / compiler / compiler-deftype.lisp
1 ;;;; that part of DEFTYPE which runs within the compiler itself
2
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
11
12 (in-package "SB!IMPL")
13
14 (defun %compiler-deftype (name expander &optional doc)
15   (ecase (info :type :kind name)
16     (:primitive
17      (when *type-system-initialized*
18        (error "illegal to redefine standard type: ~S" name)))
19     (:instance
20      (warn "The class ~S is being redefined to be a DEFTYPE." name)
21      (undefine-structure (layout-info (class-layout (sb!xc:find-class name))))
22      (setf (class-cell-class (find-class-cell name)) nil)
23      (setf (info :type :compiler-layout name) nil)
24      (setf (info :type :kind name) :defined))
25     (:defined
26      ;; Note: It would be nice to warn here when a type is being
27      ;; incompatibly redefined, but it's hard to tell, since type
28      ;; expanders are often function objects which can't easily be
29      ;; compared for equivalence. And just warning on redefinition
30      ;; isn't good, since DEFTYPE necessarily does its thing once at
31      ;; compile time and again at load time, so that it's very common
32      ;; and normal for types to be defined twice. So since there
33      ;; doesn't seem to be anything simple and obvious to do, and
34      ;; since mistakenly redefining a type isn't a common error
35      ;; anyway, we just don't worry about trying to warn about it.
36      )
37     ((nil)
38      (setf (info :type :kind name) :defined)))
39   (setf (info :type :expander name) expander)
40   (when doc
41     (setf (fdocumentation name 'type) doc))
42   ;; ### Bootstrap hack -- we need to define types before %NOTE-TYPE-DEFINED
43   ;; is defined. (FIXME: Do we still need to do this? -- WHN 19990310)
44   (if (fboundp 'sb!c::%note-type-defined)
45     (sb!c::%note-type-defined name)
46     (warn "defining type before %NOTE-TYPE-DEFINED is defined"))
47   name)