0.7.2.7:
[sbcl.git] / src / code / coerce.lisp
index e257fd7..98d0a29 100644 (file)
@@ -11,7 +11,7 @@
 
 (in-package "SB!IMPL")
 
-(macrolet ((def-frob (name result access src-type &optional typep)
+(macrolet ((def (name result access src-type &optional typep)
             `(defun ,name (object ,@(if typep '(type) ()))
                (do* ((index 0 (1+ index))
                      (length (length (the ,(ecase src-type
                           (:list '(pop in-object))
                           (:vector '(aref in-object index))))))))
 
-  (def-frob list-to-simple-string* (make-string length) schar :list)
+  (def list-to-simple-string* (make-string length) schar :list)
 
-  (def-frob list-to-bit-vector* (make-array length :element-type '(mod 2))
+  (def list-to-bit-vector* (make-array length :element-type '(mod 2))
     sbit :list)
 
-  (def-frob list-to-vector* (make-sequence-of-type type length)
+  (def list-to-vector* (make-sequence-of-type type length)
     aref :list t)
 
-  (def-frob vector-to-vector* (make-sequence-of-type type length)
+  (def vector-to-vector* (make-sequence-of-type type length)
     aref :vector t)
 
-  (def-frob vector-to-simple-string* (make-string length) schar :vector)
+  (def vector-to-simple-string* (make-string length) schar :vector)
 
-  (def-frob vector-to-bit-vector* (make-array length :element-type '(mod 2))
+  (def vector-to-bit-vector* (make-array length :element-type '(mod 2))
     sbit :vector))
 
 (defun vector-to-list* (object)
@@ -81,7 +81,7 @@
 ;;; DEFTRANSFORMs, though.
 (declaim (inline coerce-to-list))
 (declaim (inline coerce-to-simple-string coerce-to-bit-vector coerce-to-vector))
-(defun coerce-to-function (object)
+(defun coerce-to-fun (object)
   ;; (Unlike the other COERCE-TO-FOOs, this one isn't inline, because
   ;; it's so big and because optimizing away the outer ETYPECASE
   ;; doesn't seem to buy us that much anyway.)
   (etypecase object
     (list (list-to-bit-vector* object))
     (vector (vector-to-bit-vector* object))))
+(defun coerce-to-simple-vector (x)
+  (if (simple-vector-p x)
+      x
+      (replace (make-array (length x)) x)))
 (defun coerce-to-vector (object output-type-spec)
   (etypecase object
     (list (list-to-vector* object output-type-spec))
 ;;; old working version
 (defun coerce (object output-type-spec)
   #!+sb-doc
-  "Coerces the Object to an object of type Output-Type-Spec."
+  "Coerce the Object to an object of type Output-Type-Spec."
   (flet ((coerce-error ()
           (/show0 "entering COERCE-ERROR")
           (error 'simple-type-error
                  :format-control "~S can't be converted to type ~S."
                  :format-arguments (list object output-type-spec)))
         (check-result (result)
-          #!+high-security
-          (check-type-var result output-type-spec)
+          #!+high-security (aver (typep result output-type-spec))
           result))
     (let ((type (specifier-type output-type-spec)))
       (cond
                    (not (fboundp object)))
           (error 'simple-type-error
                  :datum object
+                 ;; FIXME: SATISFIES FBOUNDP is a kinda bizarre broken
+                 ;; type specifier, since the set of values it describes
+                 ;; isn't in general constant in time. Maybe we could
+                 ;; find a better way of expressing this error? (Maybe
+                 ;; with the UNDEFINED-FUNCTION condition?)
                  :expected-type '(satisfies fboundp)
               :format-control "~S isn't fbound."
               :format-arguments (list object)))
                  :format-control "~S can't be converted to type ~S."
                  :format-arguments (list object output-type-spec)))
         (check-result (result)
-          #!+high-security
-          (check-type-var result output-type-spec)
+          #!+high-security (aver (typep result output-type-spec))
           result))
     (let ((type (specifier-type output-type-spec)))
       (cond
        ((csubtypep type (specifier-type 'character))
         (character object))
        ((csubtypep type (specifier-type 'function))
-        (coerce-to-function object))
+        (coerce-to-fun object))
        ((numberp object)
         (let ((res
                (cond