40e3ea14fd4eab59e7691f6b12c82dcb81f195dd
[sbcl.git] / src / code / alien-type.lisp
1 ;;;; ALIEN-related type system stuff, done later
2 ;;;; than other type system stuff because it depends on the definition
3 ;;;; of the ALIEN-VALUE target structure type
4
5 ;;;; This software is part of the SBCL system. See the README file for
6 ;;;; more information.
7 ;;;;
8 ;;;; This software is derived from the CMU CL system, which was
9 ;;;; written at Carnegie Mellon University and released into the
10 ;;;; public domain. The software is in the public domain and is
11 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
12 ;;;; files for more information.
13
14 (in-package "SB!KERNEL")
15
16 (!begin-collecting-cold-init-forms)
17
18 (defstruct (alien-type-type
19             (:include ctype
20                       (class-info (type-class-or-lose 'alien)))
21             (:constructor %make-alien-type-type (alien-type)))
22   (alien-type nil :type alien-type))
23
24 (!define-type-class alien)
25
26 (!define-type-method (alien :unparse) (type)
27   `(alien ,(unparse-alien-type (alien-type-type-alien-type type))))
28
29 (!define-type-method (alien :simple-subtypep) (type1 type2)
30   (values (alien-subtype-p (alien-type-type-alien-type type1)
31                            (alien-type-type-alien-type type2))
32           t))
33
34 ;;; KLUDGE: This !DEFINE-SUPERCLASSES gets executed much later than the
35 ;;; others (toplevel form time instead of cold load init time) because
36 ;;; ALIEN-VALUE itself is a structure which isn't defined until fairly
37 ;;; late.
38 ;;;
39 ;;; FIXME: I'm somewhat tempted to just punt ALIEN from the type system.
40 ;;; It's sufficiently unlike the others that it's a bit of a pain, and
41 ;;; it doesn't seem to be put to any good use either in type inference or
42 ;;; in type declarations.
43 (!define-superclasses alien ((alien-value)) progn)
44
45 (!define-type-method (alien :simple-=) (type1 type2)
46   (let ((alien-type-1 (alien-type-type-alien-type type1))
47         (alien-type-2 (alien-type-type-alien-type type2)))
48     (values (or (eq alien-type-1 alien-type-2)
49                 (alien-type-= alien-type-1 alien-type-2))
50             t)))
51
52 (!def-type-translator alien (&optional (alien-type nil))
53   (typecase alien-type
54     (null
55      (make-alien-type-type))
56     (alien-type
57      (make-alien-type-type alien-type))
58     (t
59      (make-alien-type-type (parse-alien-type alien-type (make-null-lexenv))))))
60
61 (defun make-alien-type-type (&optional alien-type)
62   (if alien-type
63       (let ((lisp-rep-type (compute-lisp-rep-type alien-type)))
64         (if lisp-rep-type
65             (specifier-type lisp-rep-type)
66             (%make-alien-type-type alien-type)))
67       *universal-type*))
68
69 (!defun-from-collected-cold-init-forms !alien-type-cold-init)