X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fcoerce.lisp;h=0d1dcff1ac2fbf7984f1c6b717ff5de558022a8c;hb=b767eae48831153473226b985511c8f7a3ef98c5;hp=e257fd731ded492d7a0d39e4536eff93976ef53e;hpb=cea4896b2482b7b2b429c1631d774b4cfbc0efba;p=sbcl.git diff --git a/src/code/coerce.lisp b/src/code/coerce.lisp index e257fd7..0d1dcff 100644 --- a/src/code/coerce.lisp +++ b/src/code/coerce.lisp @@ -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 @@ -27,20 +27,20 @@ (: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.) @@ -128,6 +128,10 @@ (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)) @@ -136,15 +140,14 @@ ;;; 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 @@ -256,8 +259,7 @@ :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 @@ -268,7 +270,7 @@ ((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